/ Hex Artifact Content
Login

Artifact 1047944652093a6583a308ec89e8e517e8951d2e:


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 0a 23  e==OP_AggStep .#
1e80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1ea0: 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64          || opcod
1eb0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23 65  e==OP_VUpdate.#e
1ec0: 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
1ed0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
1ee0: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
1ef0: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
1f00: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1f10: 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20  e==OP_Halt ){.  
1f20: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d      if( pOp->p1=
1f30: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
1f40: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
1f50: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
1f60: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
1f70: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1f80: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1f90: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  if( opcode==OP_S
1fa0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
1fb0: 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65    hasStatementBe
1fc0: 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  gin = 1;.    }el
1fd0: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
1fe0: 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  P_VFilter ){.   
1ff0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
2000: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
2010: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
2020: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d   assert( pOp[-2]
2030: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
2040: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  ger );.      n =
2050: 20 70 4f 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20   pOp[-2].p1;.   
2060: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
2070: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
2080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2090: 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63  opcodeNoPush(opc
20a0: 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d  ode) ){.      nM
20b0: 61 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d  axStack--;.    }
20c0: 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ..    if( pOp->p
20d0: 32 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  2>=0 ) continue;
20e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d  .    assert( -1-
20f0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
2100: 6c 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32  l );.    pOp->p2
2110: 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70   = aLabel[-1-pOp
2120: 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c  ->p2];.  }.  sql
2130: 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65  iteFree(p->aLabe
2140: 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20  l);.  p->aLabel 
2150: 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e  = 0;..  *pMaxFun
2160: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
2170: 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d  ;.  *pMaxStack =
2180: 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f   nMaxStack;..  /
2190: 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f  * If we never ro
21a0: 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
21b0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
21c0: 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20  then statement. 
21d0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
21e0: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e   are not needed.
21f0: 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72    So change ever
2200: 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20  y OP_Statement. 
2210: 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20   ** opcode into 
2220: 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69  an OP_Noop.  Thi
2230: 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74  s avoid a call t
2240: 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  o sqlite3OsOpenE
2250: 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20  xclusive().  ** 
2260: 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70  which can be exp
2270: 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70  ensive on some p
2280: 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20  latforms..  */. 
2290: 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e   if( hasStatemen
22a0: 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53  tBegin && !doesS
22b0: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
22c0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d   ){.    for(pOp=
22d0: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
22e0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
22f0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
2300: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2310: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
2320: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
2330: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
2340: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2350: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2360: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2370: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2380: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2390: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
23a0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
23b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
23c0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
23d0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
23e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
23f0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
2400: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
2410: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
2420: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
2430: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
2440: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
2450: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
2460: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
2470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
2480: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
2490: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
24a0: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
24b0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
24c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
24d0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
24e0: 0a 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  .  resizeOpArray
24f0: 28 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  (p, p->nOp + nOp
2500: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2510: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
2520: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2530: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
2540: 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30  nOp;.  if( nOp>0
2550: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2560: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
2570: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
2580: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2590: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
25a0: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
25b0: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
25c0: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
25d0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
25e0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
25f0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
2600: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
2610: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
2620: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c 30   pOut->p2 = p2<0
2630: 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   ? addr + ADDR(p
2640: 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20 70  2) : p2;.      p
2650: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70  Out->p3 = pIn->p
2660: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  3;.      pOut->p
2670: 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70 33 20  3type = pIn->p3 
2680: 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20 50 33  ? P3_STATIC : P3
2690: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
26a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
26c0: 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65  vdbe_addop_trace
26d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26e0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
26f0: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
2700: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
2710: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2720: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
2730: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
2740: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2750: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2760: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
2770: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2780: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2790: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
27a0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
27b0: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
27c0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
27d0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
27e0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
27f0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
2800: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
2810: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2820: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2830: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
2840: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2850: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2860: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2870: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2880: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2890: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
28a0: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
28b0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
28c0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
28d0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
28e0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
28f0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2900: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
2910: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
2920: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2930: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2940: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
2950: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
2960: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
2970: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2980: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
2990: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
29a0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
29b0: 76 61 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  val>=0 );.  asse
29c0: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
29d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
29e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
29f0: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2a00: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2a10: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2a20: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
2a30: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2a40: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
2a50: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
2a60: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
2a70: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
2a80: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
2a90: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2aa0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
2ab0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2ac0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
2ad0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2ae0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
2af0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
2b00: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
2b10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
2b20: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
2b30: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
2b40: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
2b50: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
2b60: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
2b70: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
2b80: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2b90: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
2ba0: 6c 46 75 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65  lFunction(FuncDe
2bb0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
2bc0: 70 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e 66  pDef && (pDef->f
2bd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2be0: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
2bf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2c00: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Def);.  }.}../*.
2c10: 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 33 20 76  ** Delete a P3 v
2c20: 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72  alue if necessar
2c30: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2c40: 64 20 66 72 65 65 50 33 28 69 6e 74 20 70 33 74  d freeP3(int p3t
2c50: 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a  ype, void *p3){.
2c60: 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20 20 20    if( p3 ){.    
2c70: 73 77 69 74 63 68 28 20 70 33 74 79 70 65 20 29  switch( p3type )
2c80: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  {.      case P3_
2c90: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63  DYNAMIC:.      c
2ca0: 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 0a  ase P3_KEYINFO:.
2cb0: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45        case P3_KE
2cc0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b  YINFO_HANDOFF: {
2cd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
2ce0: 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20  ree(p3);.       
2cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2d00: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 50        case P3_MP
2d10: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
2d20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33   sqlite3_free(p3
2d30: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2d40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d50: 63 61 73 65 20 50 33 5f 56 44 42 45 46 55 4e 43  case P3_VDBEFUNC
2d60: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
2d70: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20  Func *pVdbeFunc 
2d80: 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33  = (VdbeFunc *)p3
2d90: 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  ;.        freeEp
2da0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
2db0: 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63  pVdbeFunc->pFunc
2dc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2dd0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
2de0: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
2df0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2e00: 65 46 72 65 65 28 70 56 64 62 65 46 75 6e 63 29  eFree(pVdbeFunc)
2e10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2e30: 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20  ase P3_FUNCDEF: 
2e40: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
2e50: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
2e60: 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a 20  (FuncDef*)p3);. 
2e70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
2e90: 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P3_MEM: {.     
2ea0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
2eb0: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
2ec0: 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ue*)p3);.       
2ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2ee0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
2ef0: 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63  .** Change N opc
2f00: 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  odes starting at
2f10: 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e   addr to No-ops.
2f20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2f30: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2f40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2f50: 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56 64  dr, int N){.  Vd
2f60: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
2f70: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 77 68 69  aOp[addr];.  whi
2f80: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 66  le( N-- ){.    f
2f90: 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70  reeP3(pOp->p3typ
2fa0: 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  e, pOp->p3);.   
2fb0: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
2fc0: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
2fd0: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
2fe0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
2ff0: 70 4f 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pOp++;.  }.}../*
3000: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3010: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3020: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3030: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3040: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3050: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
3060: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
3070: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
3080: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
3090: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
30a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
30b0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
30c0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
30d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
30e0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
30f0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
3100: 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P3 operand is dy
3110: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
3120: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
3130: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
3140: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
3150: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3160: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
3170: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
3180: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
3190: 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61  s of zP3 up to a
31a0: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
31b0: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
31c0: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
31d0: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
31e0: 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49   of zP3..**.** I
31f0: 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20  f n==P3_KEYINFO 
3200: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
3210: 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  3 is a pointer t
3220: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
3230: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
3240: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
3250: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3260: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
3270: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
3280: 71 6c 69 74 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20  qliteMalloc, to 
3290: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
32a0: 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69  e Vdbe is finali
32b0: 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45  zed..** n==P3_KE
32c0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e  YINFO_HANDOFF in
32d0: 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 33  dicates that zP3
32e0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
32f0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
3300: 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  * stored in memo
3310: 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ry that the call
3320: 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  er has obtained 
3330: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
3340: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
3350: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
3360: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
3370: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
3380: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
3390: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
33a0: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
33b0: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 33 5f 53  alues of n (P3_S
33c0: 54 41 54 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45  TATIC, P3_COLLSE
33d0: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
33e0: 20 74 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73   that zP3 points
33f0: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
3400: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
3410: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
3420: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
3430: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
3440: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
3450: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
3460: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
3470: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
3480: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
3490: 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P3 on the mos
34a0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
34b0: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
34c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
34d0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
34e0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
34f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c  const char *zP3,
3500: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
3510: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  Op;.  assert( p=
3520: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
3530: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3540: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
3550: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 73 71   p->aOp==0 || sq
3560: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
3570: 64 28 29 20 29 7b 0a 20 20 20 20 69 66 20 28 6e  d() ){.    if (n
3580: 20 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 29 20   != P3_KEYINFO) 
3590: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 6e  {.      freeP3(n
35a0: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
35b0: 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP3);.    }. 
35c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
35d0: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
35e0: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
35f0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
3600: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
3610: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
3620: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
3630: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
3640: 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20  P3(pOp->p3type, 
3650: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 70 4f 70 2d  pOp->p3);.  pOp-
3660: 3e 70 33 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  >p3 = 0;.  if( z
3670: 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  P3==0 ){.    pOp
3680: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 70 4f  ->p3 = 0;.    pO
3690: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e  p->p3type = P3_N
36a0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
36b0: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
36c0: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
36d0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
36e0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
36f0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
3700: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 33 29   ((KeyInfo*)zP3)
3710: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
3720: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
3730: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
3740: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
3750: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
3760: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
3770: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
3780: 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20  allocRaw( nByte 
3790: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
37a0: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
37b0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e  ;.    if( pKeyIn
37c0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  fo ){.      unsi
37d0: 67 6e 65 64 20 63 68 61 72 20 2a 61 53 6f 72 74  gned char *aSort
37e0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
37f0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3800: 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  3, nByte);.     
3810: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
3820: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3830: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
3840: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
3850: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
3860: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
3870: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
3880: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
3890: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
38a0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
38b0: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
38c0: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
38d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
38e0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45  ->p3type = P3_KE
38f0: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3900: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  {.      pOp->p3t
3910: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
3920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
3930: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
3940: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
3950: 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72   pOp->p3 = (char
3960: 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP3;.    pOp->
3970: 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49  p3type = P3_KEYI
3980: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
3990: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
39a0: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
39b0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
39c0: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
39d0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
39e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 3b 0a   = strlen(zP3);.
39f0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71      pOp->p3 = sq
3a00: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 50 33 2c  liteStrNDup(zP3,
3a10: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33   n);.    pOp->p3
3a20: 74 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49  type = P3_DYNAMI
3a30: 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  C;.  }.}..#ifnde
3a40: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
3a50: 65 70 6c 61 63 65 20 74 68 65 20 50 33 20 66 69  eplace the P3 fi
3a60: 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
3a70: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
3a80: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 0a  nstruction with.
3a90: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e  ** comment text.
3aa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ab0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
3ac0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3ad0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
3ae0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3af0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
3b00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3b10: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
3b20: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d 3d  p[p->nOp-1].p3==
3b30: 30 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0 .          || 
3b40: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
3b50: 6c 65 64 28 29 20 29 3b 0a 20 20 76 61 5f 73 74  led() );.  va_st
3b60: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
3b70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
3b80: 68 61 6e 67 65 50 33 28 70 2c 20 2d 31 2c 20 73  hangeP3(p, -1, s
3b90: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a  qlite3VMPrintf(z
3ba0: 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33 5f  Format, ap), P3_
3bb0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f 65  DYNAMIC);.  va_e
3bc0: 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nd(ap);.}.#endif
3bd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3be0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
3bf0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a  given address..*
3c00: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
3c10: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
3c20: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
3c30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
3c40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3c50: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
3c60: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
3c70: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75  p->nOp );.  retu
3c80: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
3c90: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
3ca0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
3cb0: 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e  PLAIN) || !defin
3cc0: 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20  ed(NDEBUG) \.   
3cd0: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42    || defined(VDB
3ce0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
3cf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
3d00: 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  UG)./*.** Comput
3d10: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
3d20: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 33  describes the P3
3d30: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
3d40: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
3d50: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
3d60: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
3d70: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
3d80: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
3d90: 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f  displayP3(Op *pO
3da0: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
3db0: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
3dc0: 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65 72  ar *zP3;.  asser
3dd0: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
3de0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
3df0: 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  3type ){.    cas
3e00: 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P3_KEYINFO: {.
3e10: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
3e20: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
3e30: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
3e40: 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  fo*)pOp->p3;.   
3e50: 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70     sprintf(zTemp
3e60: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
3e70: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
3e80: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72  );.      i = str
3e90: 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  len(zTemp);.    
3ea0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
3eb0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
3ec0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
3ed0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
3ee0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
3ef0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
3f00: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
3f10: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
3f20: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
3f30: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e           if( i+n
3f40: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >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 2e 2e 2e 22 29  zTemp[i],",...")
3f70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
3f80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
3f90: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
3fa0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
3fb0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
3fc0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
3fd0: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
3fe0: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
3ff0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
4000: 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  i++] = '-';.    
4010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4020: 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b    strcpy(&zTemp[
4030: 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  i], pColl->zName
4040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
4050: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
4060: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
4070: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
4080: 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  strcpy(&zTemp[i]
4090: 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20  ,",nil");.      
40a0: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
40b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
40c0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
40d0: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
40e0: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
40f0: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
4100: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
4110: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4120: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4130: 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P3_COLLSEQ: {.
4140: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
4150: 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 2a  Coll = (CollSeq*
4160: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
4170: 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22  sprintf(zTemp, "
4180: 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c  collseq(%.20s)",
4190: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
41a0: 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d        zP3 = zTem
41b0: 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
41c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
41d0: 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  3_FUNCDEF: {.   
41e0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
41f0: 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70   = (FuncDef*)pOp
4200: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->p3;.      sqli
4210: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4220: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
4230: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
4240: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
4250: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
4260: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4270: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
4280: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
4290: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
42a0: 33 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  3_VTAB: {.      
42b0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
42c0: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
42d0: 74 61 62 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  tab*)pOp->p3;.  
42e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
42f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4300: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
4310: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
4320: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 7a  Module);.      z
4330: 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P3 = zTemp;.    
4340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4350: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
4360: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d  t: {.      zP3 =
4370: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
4380: 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f  if( zP3==0 || pO
4390: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f  p->opcode==OP_No
43a0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  op ){.        zP
43b0: 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a  3 = "";.      }.
43c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
43d0: 72 74 28 20 7a 50 33 21 3d 30 20 29 3b 0a 20 20  rt( zP3!=0 );.  
43e0: 72 65 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65  return zP3;.}.#e
43f0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
4400: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
4410: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
4420: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
4430: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
4440: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
4450: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
4460: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
4470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4480: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
4490: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
44a0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
44b0: 20 2a 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50   *zP3;.  char zP
44c0: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
44d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
44e0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
44f0: 33 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22  3s %4d %4d %s\n"
4500: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
4510: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
4520: 0a 20 20 7a 50 33 20 3d 20 64 69 73 70 6c 61 79  .  zP3 = display
4530: 50 33 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P3(pOp, zPtr, si
4540: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66  zeof(zPtr));.  f
4550: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
4560: 72 6d 61 74 31 2c 0a 20 20 20 20 20 20 70 63 2c  rmat1,.      pc,
4570: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
4580: 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  mes[pOp->opcode]
4590: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
45a0: 70 32 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c 75  p2, zP3);.  fflu
45b0: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
45c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
45d0: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
45e0: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
45f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4600: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
4610: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
4620: 28 20 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ( p ){.    while
4630: 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20  ( N-->0 ){.     
4640: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
4650: 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20  elease(p++);.   
4660: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
4670: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
4680: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
4690: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
46a0: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
46b0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
46c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
46d0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
46e0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
46f0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
4700: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
4710: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
4720: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
4730: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
4740: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
4750: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
4760: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
4770: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
4780: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
4790: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  beList(.  Vdbe *
47a0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
47b0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
47c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
47d0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
47e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
47f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
4800: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
4810: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  n );.  if( p->ma
4820: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
4830: 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  RUN ) return SQL
4840: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73  ITE_MISUSE;.  as
4850: 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d  sert( db->magic=
4860: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55  =SQLITE_MAGIC_BU
4870: 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SY );.  assert( 
4880: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
4890: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
48a0: 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20  E_BUSY );..  /* 
48b0: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
48c0: 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74   opcode does not
48d0: 20 70 75 74 20 64 79 6e 61 6d 69 63 20 73 74 72   put dynamic str
48e0: 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20  ings onto the.  
48f0: 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68  ** the stack, th
4900: 65 79 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ey may become dy
4910: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
4920: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
4930: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
4940: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
4950: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
4960: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
4970: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54    */.  if( p->pT
4980: 6f 73 3d 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34  os==&p->aStack[4
4990: 5d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ] ){.    release
49a0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61  MemArray(p->aSta
49b0: 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d  ck, 5);.  }.  p-
49c0: 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b  >resOnStack = 0;
49d0: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20  ..  do{.    i = 
49e0: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c  p->pc++;.  }whil
49f0: 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70  e( i<p->nOp && p
4a00: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
4a10: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
4a20: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
4a30: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20    if( i>=p->nOp 
4a40: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
4a50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
4a60: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
4a70: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
4a80: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
4a90: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69   ){.    db->u1.i
4aa0: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 30  sInterrupted = 0
4ab0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
4ac0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
4ad0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4ae0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
4af0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
4b00: 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33  zErrMsg, sqlite3
4b10: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20 28  ErrStr(p->rc), (
4b20: 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73  char*)0);.  }els
4b30: 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  e{.    Op *pOp =
4b40: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
4b50: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
4b60: 61 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65 6d  aStack;.    pMem
4b70: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
4b80: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  t;.    pMem->typ
4b90: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
4ba0: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20  ER;.    pMem->i 
4bb0: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
4be0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 4d  ounter */.    pM
4bf0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
4c00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
4c10: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
4c20: 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  Term;.    pMem->
4c30: 7a 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  z = sqlite3Opcod
4c40: 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f  eNames[pOp->opco
4c50: 64 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20  de];  /* Opcode 
4c60: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
4c70: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
4c80: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
4c90: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
4ca0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
4cb0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
4cc0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
4cd0: 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d 2b  _UTF8;.    pMem+
4ce0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
4cf0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
4d00: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70     pMem->i = pOp
4d10: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d30: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
4d40: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
4d50: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
4d60: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
4d70: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
4d80: 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70  .    pMem->i = p
4d90: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
4dc0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
4dd0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
4de0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
4df0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 45 70  ->flags = MEM_Ep
4e00: 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  hem|MEM_Str|MEM_
4e10: 54 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f  Term;   /* P3 */
4e20: 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64  .    pMem->z = d
4e30: 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d  isplayP3(pOp, pM
4e40: 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65  em->zShort, size
4e50: 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29  of(pMem->zShort)
4e60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4e70: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
4e80: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
4e90: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
4ea0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
4eb0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
4ec0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
4ed0: 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e  _UTF8;..    p->n
4ee0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20  ResColumn = 5 - 
4ef0: 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  2*(p->explain-1)
4f00: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
4f10: 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  pMem;.    p->rc 
4f20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4f30: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
4f40: 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
4f50: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
4f60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
4f70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4f80: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  T_EXPLAIN */../*
4f90: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
4fa0: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
4fb0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
4fc0: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
4fd0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
4fe0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
4ff0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
5000: 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70 20  DEBUG.  int nOp 
5010: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
5020: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
5030: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
5040: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
5050: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
5060: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
5070: 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20  p && pOp->p3!=0 
5080: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
5090: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  r *z = pOp->p3;.
50a0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
50b0: 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b  ce(*(u8*)z) ) z+
50c0: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
50d0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
50e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
50f0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
5100: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
5110: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
5120: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
5130: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
5140: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
5150: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
5160: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
5170: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
5180: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
5190: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
51a0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
51b0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
51c0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
51d0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
51e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
51f0: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
5200: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
5210: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5220: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
5230: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
5240: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
5250: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
5280: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
52b0: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
52c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
52d0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5300: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
5310: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
5320: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5340: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
5350: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
5360: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
5390: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
53a0: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
53b0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61  ){.  int n;..  a
53c0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
53d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
53e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
53f0: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
5400: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
5410: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
5420: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
5430: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
5440: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
5450: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
5460: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
5470: 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73  than later. This
5480: 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73 65  .   * is because
5490: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73   the call to res
54a0: 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c  izeOpArray() bel
54b0: 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68  ow may shrink th
54c0: 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20  e.   * p->aOp[] 
54d0: 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65  array to save me
54e0: 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77  mory if called w
54f0: 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49  hen in VDBE_MAGI
5500: 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74  C_RUN .   * stat
5510: 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61  e..   */.  p->ma
5520: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
5530: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69  _RUN;..  /* No i
5540: 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20  nstruction ever 
5550: 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e  pushes more than
5560: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
5570: 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  t onto the.  ** 
5580: 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20  stack.  And the 
5590: 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77  stack never grow
55a0: 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20  s on successive 
55b0: 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68  executions of th
55c0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70  e.  ** same loop
55d0: 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20  .  So the total 
55e0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75  number of instru
55f0: 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70  ctions is an upp
5600: 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e  er bound.  ** on
5610: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61   the maximum sta
5620: 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72 65  ck depth require
5630: 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65 72  d.  (Added later
5640: 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73  :)  The.  ** res
5650: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20 63  olveP2Values() c
5660: 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74  all computes a t
5670: 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f 75  ighter upper bou
5680: 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73  nd on the.  ** s
5690: 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a  tack size..  **.
56a0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20    ** Allocation 
56b0: 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70  all the stack sp
56c0: 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72  ace we will ever
56d0: 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   need..  */.  if
56e0: 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29  ( p->aStack==0 )
56f0: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20  {.    int nArg; 
5700: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
5710: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
5720: 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72  passed to a user
5730: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
5740: 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20    int nStack;   
5750: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
5760: 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74  ber of stack ent
5770: 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f  ries required */
5780: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
5790: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26  lues(p, &nArg, &
57a0: 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73  nStack);.    res
57b0: 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d  izeOpArray(p, p-
57c0: 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72  >nOp);.    asser
57d0: 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20  t( nVar>=0 );.  
57e0: 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b    assert( nStack
57f0: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 6e  <p->nOp );.    n
5800: 53 74 61 63 6b 20 3d 20 69 73 45 78 70 6c 61 69  Stack = isExplai
5810: 6e 20 3f 20 31 30 20 3a 20 6e 53 74 61 63 6b 3b  n ? 10 : nStack;
5820: 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d  .    p->aStack =
5830: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 0a 20   sqliteMalloc(. 
5840: 20 20 20 20 20 20 20 6e 53 74 61 63 6b 2a 73 69         nStack*si
5850: 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30  zeof(p->aStack[0
5860: 5d 29 20 20 20 20 2f 2a 20 61 53 74 61 63 6b 20  ])    /* aStack 
5870: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a  */.      + nArg*
5880: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20  sizeof(Mem*)    
5890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41            /* apA
58a0: 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56  rg */.      + nV
58b0: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  ar*sizeof(Mem)  
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58d0: 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aVar */.      + 
58e0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72  nVar*sizeof(char
58f0: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  *)             /
5900: 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20  * azVar */.     
5910: 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d   + nMem*sizeof(M
5920: 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20  em)             
5930: 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20    /* aMem */.   
5940: 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a     + nCursor*siz
5950: 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 20 20 20  eof(Cursor*)    
5960: 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a      /* apCsr */.
5970: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
5980: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
5990: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 20 20 70  led() ){.      p
59a0: 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74  ->aMem = &p->aSt
59b0: 61 63 6b 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20  ack[nStack];.   
59c0: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
59d0: 6d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  m;.      p->aVar
59e0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d   = &p->aMem[nMem
59f0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72  ];.      p->nVar
5a00: 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70   = nVar;.      p
5a10: 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20  ->okVar = 0;.   
5a20: 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d     p->apArg = (M
5a30: 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56  em**)&p->aVar[nV
5a40: 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a  ar];.      p->az
5a50: 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70  Var = (char**)&p
5a60: 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20  ->apArg[nArg];. 
5a70: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20       p->apCsr = 
5a80: 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a  (Cursor**)&p->az
5a90: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
5aa0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
5ab0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72  ursor;.      for
5ac0: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
5ad0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
5ae0: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
5af0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d  EM_Null;.      }
5b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
5b10: 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b  (n=0; n<p->nMem;
5b20: 20 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d   n++){.    p->aM
5b30: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
5b40: 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 23 69 66  M_Null;.  }..#if
5b50: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5b60: 0a 20 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66  .  if( (p->db->f
5b70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
5b80: 62 65 4c 69 73 74 69 6e 67 29 21 3d 30 0a 20 20  beListing)!=0.  
5b90: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4f 73 46 69    || sqlite3OsFi
5ba0: 6c 65 45 78 69 73 74 73 28 22 76 64 62 65 5f 65  leExists("vdbe_e
5bb0: 78 70 6c 61 69 6e 22 29 0a 20 20 29 7b 0a 20 20  xplain").  ){.  
5bc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 72 69    int i;.    pri
5bd0: 6e 74 66 28 22 56 44 42 45 20 50 72 6f 67 72 61  ntf("VDBE Progra
5be0: 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a  m Listing:\n");.
5bf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
5c00: 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20  rintSql(p);.    
5c10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
5c20: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  p; i++){.      s
5c30: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
5c40: 70 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 70 2d  p(stdout, i, &p-
5c50: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  >aOp[i]);.    }.
5c60: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5c70: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22 76  3OsFileExists("v
5c80: 64 62 65 5f 74 72 61 63 65 22 29 20 29 7b 0a 20  dbe_trace") ){. 
5c90: 20 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 73 74     p->trace = st
5ca0: 64 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  dout;.  }.#endif
5cb0: 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d  .  p->pTos = &p-
5cc0: 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70  >aStack[-1];.  p
5cd0: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
5ce0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5cf0: 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d    p->uniqueCnt =
5d00: 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44   0;.  p->returnD
5d10: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  epth = 0;.  p->e
5d20: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
5d30: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53  Abort;.  p->popS
5d40: 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e  tack =  0;.  p->
5d50: 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70  explain |= isExp
5d60: 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  lain;.  p->magic
5d70: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
5d80: 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  N;.  p->nChange 
5d90: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
5da0: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
5db0: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
5dc0: 3d 20 32 35 35 3b 0a 23 69 66 64 65 66 20 56 44  = 255;.#ifdef VD
5dd0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
5de0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
5df0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
5e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
5e10: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
5e20: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
5e30: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20  cycles = 0;.    
5e40: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
5e50: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
5e60: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
5e70: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
5e80: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 68  es that cursor h
5e90: 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c  appens.** to hol
5ea0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
5eb0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
5ec0: 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73 6f 72  (Vdbe *p, Cursor
5ed0: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
5ee0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
5ef0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
5f00: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
5f10: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
5f20: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
5f30: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  Cursor);.  }.  i
5f40: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
5f50: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
5f60: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
5f70: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
5f80: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
5f90: 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e  ABLE.  if( pCx->
5fa0: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
5fb0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
5fc0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
5fd0: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
5fe0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
5ff0: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
6000: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d   *pModule = pCx-
6010: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d  >pModule;.    p-
6020: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
6030: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  1;.    sqlite3Sa
6040: 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a  fetyOff(p->db);.
6050: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
6060: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29  ose(pVtabCursor)
6070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66  ;.    sqlite3Saf
6080: 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20  etyOn(p->db);.  
6090: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
60a0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
60b0: 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  f.  sqliteFree(p
60c0: 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71  Cx->pData);.  sq
60d0: 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 61 54  liteFree(pCx->aT
60e0: 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ype);.  sqliteFr
60f0: 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(pCx);.}../*.*
6100: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
6110: 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ors.*/.static vo
6120: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
6130: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
6140: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
6150: 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
6160: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6170: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
6180: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 6e 56  .    if( !p->inV
6190: 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 28 70 2d  tabMethod || (p-
61a0: 3e 61 70 43 73 72 5b 69 5d 20 26 26 20 21 70 2d  >apCsr[i] && !p-
61b0: 3e 61 70 43 73 72 5b 69 5d 2d 3e 70 56 74 61 62  >apCsr[i]->pVtab
61c0: 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
61d0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
61e0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
61f0: 73 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  sr[i]);.      p-
6200: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
6210: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6220: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
6230: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
6240: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
6250: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
6260: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
6270: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
6280: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
6290: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
62a0: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
62b0: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
62c0: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
62d0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
62e0: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
62f0: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
6300: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  p(Vdbe *p){.  in
6310: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53  t i;.  if( p->aS
6320: 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65  tack ){.    rele
6330: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
6340: 53 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70  Stack, 1 + (p->p
6350: 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29  Tos - p->aStack)
6360: 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d  );.    p->pTos =
6370: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b   &p->aStack[-1];
6380: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  .  }.  closeAllC
6390: 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c  ursors(p);.  rel
63a0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
63b0: 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  aMem, p->nMem);.
63c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66    sqlite3VdbeFif
63d0: 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f  oClear(&p->sFifo
63e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74  );.  if( p->cont
63f0: 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  extStack ){.    
6400: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f  for(i=0; i<p->co
6410: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69  ntextStackTop; i
6420: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6430: 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28  e3VdbeFifoClear(
6440: 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  &p->contextStack
6450: 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20  [i].sFifo);.    
6460: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
6470: 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  (p->contextStack
6480: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74  );.  }.  p->cont
6490: 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  extStack = 0;.  
64a0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44  p->contextStackD
64b0: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  epth = 0;.  p->c
64c0: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d  ontextStackTop =
64d0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65   0;.  sqliteFree
64e0: 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  (p->zErrMsg);.  
64f0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
6500: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
6510: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
6520: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
6530: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
6540: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
6550: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
6560: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
6570: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
6580: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
6590: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
65a0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
65b0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
65c0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
65d0: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
65e0: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
65f0: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
6600: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
6610: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
6620: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
6630: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
6640: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
6650: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 72 65  e;.  int n;.  re
6660: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
6670: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
6680: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
6690: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  _N);.  sqliteFre
66a0: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
66b0: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
66c0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
66d0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
66e0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
66f0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
6700: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
6710: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
6720: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
6730: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
6740: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
6750: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
6760: 20 28 70 43 6f 6c 4e 61 6d 65 2b 2b 29 2d 3e 66   (pColName++)->f
6770: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
6780: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
6790: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
67a0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
67b0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
67c0: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
67d0: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
67e0: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
67f0: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
6800: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
6810: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
6820: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
6830: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
6840: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
6850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33  ..**.** If N==P3
6860: 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e  _STATIC  it mean
6870: 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20  s that zName is 
6880: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
6890: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
68a0: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
68b0: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
68c0: 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74  e pointer. If it
68d0: 20 69 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20   is P3_DYNAMIC, 
68e0: 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72  then .** the str
68f0: 69 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69  ing is freed usi
6900: 6e 67 20 73 71 6c 69 74 65 46 72 65 65 28 29 20  ng sqliteFree() 
6910: 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
6920: 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a   finished with.*
6930: 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  * it. Otherwise,
6940: 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d   N bytes of zNam
6950: 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f  e are copied..*/
6960: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
6970: 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20  SetColName(Vdbe 
6980: 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
6990: 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72   var, const char
69a0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b   *zName, int N){
69b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
69c0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73   *pColName;.  as
69d0: 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65  sert( idx<p->nRe
69e0: 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  sColumn );.  ass
69f0: 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45  ert( var<COLNAME
6a00: 5f 4e 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  _N );.  if( sqli
6a10: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
6a20: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
6a30: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72  E_NOMEM;.  asser
6a40: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
6a50: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
6a60: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
6a70: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
6a80: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e  olumn]);.  if( N
6a90: 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20  ==P3_DYNAMIC || 
6aa0: 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a  N==P3_STATIC ){.
6ab0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6ac0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
6ad0: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
6ae0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
6af0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6b00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
6b10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
6b20: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
6b30: 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54   zName, N, SQLIT
6b40: 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52  E_UTF8,SQLITE_TR
6b50: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
6b60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6b70: 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d  K && N==P3_DYNAM
6b80: 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61  IC ){.    pColNa
6b90: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f  me->flags = (pCo
6ba0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d  lName->flags&(~M
6bb0: 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f  EM_Static))|MEM_
6bc0: 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  Dyn;.    pColNam
6bd0: 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d  e->xDel = 0;.  }
6be0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6bf0: 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72  ./*.** A read or
6c00: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
6c10: 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  on may or may no
6c20: 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64  t be active on d
6c30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
6c40: 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73  * db. If a trans
6c50: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
6c60: 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20  , commit it. If 
6c70: 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72  there is a.** wr
6c80: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6c90: 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68  spanning more th
6ca0: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
6cb0: 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69  file, this routi
6cc0: 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65  ne.** takes care
6cd0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
6ce0: 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e  ournal trickery.
6cf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
6d00: 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  dbeCommit(sqlite
6d10: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
6d20: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
6d30: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
6d40: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
6d50: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
6d60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
6d70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6d80: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
6d90: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  commit = 0;..  /
6da0: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
6db0: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
6dc0: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
6dd0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
6de0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
6df0: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
6e00: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
6e10: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
6e20: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
6e30: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
6e40: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
6e50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6e60: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
6e70: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
6e80: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
6e90: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
6ea0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
6eb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6ec0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
6ed0: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
6ee0: 2c 20 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21  , rc);.  if( rc!
6ef0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6f00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6f10: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
6f20: 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
6f30: 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
6f40: 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
6f50: 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
6f60: 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
6f70: 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
6f80: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
6f90: 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
6fa0: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
6fb0: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
6fc0: 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
6fd0: 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
6fe0: 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
6ff0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
7000: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
7010: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
7020: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
7030: 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
7040: 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
7050: 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
7060: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
7070: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
7080: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
7090: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
70a0: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
70b0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
70c0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
70d0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
70e0: 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
70f0: 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
7100: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
7110: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
7120: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
7130: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
7140: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
7150: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
7160: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
7170: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
7180: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
7190: 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ff(db);.    rc =
71a0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
71b0: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
71c0: 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
71d0: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20  3SafetyOn(db);. 
71e0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
71f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7200: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
7210: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
7220: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
7230: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
7240: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
7250: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
7260: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
7270: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
7280: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
7290: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
72a0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
72b0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
72c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
72d0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
72e0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
72f0: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
7300: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
7310: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
7320: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7330: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20  e is :memory:.  
7340: 49 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  In that case we 
7350: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70  do.  ** not supp
7360: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
7370: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
7380: 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65  o use the simple
7390: 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20   case then.  ** 
73a0: 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
73b0: 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65  0==strlen(sqlite
73c0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
73d0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
73e0: 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20  )) || nTrans<=1 
73f0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
7400: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7410: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7420: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
7430: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
7440: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
7450: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
7460: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
7470: 53 79 6e 63 28 70 42 74 2c 20 30 29 3b 0a 20 20  Sync(pBt, 0);.  
7480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
7490: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
74a0: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
74b0: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
74c0: 75 6c 6c 79 20 73 79 6e 63 65 64 20 2a 2f 0a 20  ully synced */. 
74d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
74e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 6f  E_OK ){.      fo
74f0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
7500: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7510: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
7520: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
7530: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
7540: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7550: 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74  3BtreeCommit(pBt
7560: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7570: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7580: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
7590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
75a0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
75b0: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
75c0: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
75d0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
75e0: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
75f0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
7600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
7610: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
7620: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
7630: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
7640: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
7650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
7660: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
7670: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
7680: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
7690: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
76a0: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
76b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
76c0: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
76d0: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
76e0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
76f0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
7700: 2e 70 42 74 29 3b 0a 20 20 20 20 4f 73 46 69 6c  .pBt);.    OsFil
7710: 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  e *master = 0;..
7720: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
7730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7740: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
7750: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72  do {.      u32 r
7760: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c  andom;.      sql
7770: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
7780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
7790: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
77a0: 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f  (random), &rando
77b0: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
77c0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
77d0: 74 66 28 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20  tf("%s-mj%08X", 
77e0: 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f  zMainFile, rando
77f0: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
7800: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
7810: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
7820: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  ;.      }.    }w
7840: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 46  hile( sqlite3OsF
7850: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
7860: 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  r) );..    /* Op
7870: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
7880: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63  urnal. */.    rc
7890: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
78a0: 45 78 63 6c 75 73 69 76 65 28 7a 4d 61 73 74 65  Exclusive(zMaste
78b0: 72 2c 20 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a  r, &master, 0);.
78c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
78d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
78e0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
78f0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
7900: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
7910: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
7920: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
7930: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
7940: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
7950: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
7960: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7970: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
7980: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
7990: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
79a0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
79b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
79c0: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
79d0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
79e0: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
79f0: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
7a00: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
7a10: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
7a20: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
7a30: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
7a40: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
7a50: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
7a60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7a70: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7a80: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
7a90: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
7aa0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
7ab0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
7ac0: 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65  nue;   /* Ignore
7ad0: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
7ae0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  se */.      if( 
7af0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
7b00: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
7b10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
7b20: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
7b30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7b40: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
7b50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
7b60: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
7b70: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
7b80: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
7b90: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
7ba0: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
7bb0: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
7bc0: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
7bd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
7be0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
7bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
7c00: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7c10: 6d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  master, zFile, s
7c20: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 29 3b  trlen(zFile)+1);
7c30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
7c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7c50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
7c60: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
7c70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7c80: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74  e3OsDelete(zMast
7c90: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
7ca0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
7cb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
7cc0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
7cd0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7ce0: 0a 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ...    /* Sync t
7cf0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7d00: 6c 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 64  l file. Before d
7d10: 6f 69 6e 67 20 74 68 69 73 2c 20 6f 70 65 6e 20  oing this, open 
7d20: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 20 20  the directory.  
7d30: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
7d40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
7d50: 73 74 6f 72 65 20 69 6e 20 73 6f 20 74 68 61 74  store in so that
7d60: 20 69 74 20 67 65 74 73 20 73 79 6e 63 65 64 20   it gets synced 
7d70: 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
7d80: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
7d90: 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
7da0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
7db0: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
7dc0: 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74  ite3OsOpenDirect
7dd0: 6f 72 79 28 6d 61 73 74 65 72 2c 20 7a 4d 61 69  ory(master, zMai
7de0: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
7df0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
7e00: 0a 20 20 20 20 20 20 20 20 20 20 28 6e 65 65 64  .          (need
7e10: 53 79 6e 63 20 26 26 20 28 72 63 3d 73 71 6c 69  Sync && (rc=sqli
7e20: 74 65 33 4f 73 53 79 6e 63 28 6d 61 73 74 65 72  te3OsSync(master
7e30: 2c 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ,0))!=SQLITE_OK)
7e40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7e50: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
7e60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7e70: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
7e80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
7e90: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
7ea0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7eb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
7ec0: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
7ed0: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
7ee0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
7ef0: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
7f00: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
7f10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
7f20: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
7f30: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
7f40: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
7f50: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
7f60: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
7f70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7f80: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
7f90: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
7fa0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
7fb0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
7fc0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  to sqlite3BtreeS
7fd0: 79 6e 63 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  ync(),.    ** th
7fe0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
7ff0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6d 61  ance that the ma
8000: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8010: 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  e will be.    **
8020: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
8030: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
8040: 69 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  it, in case the 
8050: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
8060: 20 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 20     ** file name 
8070: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
8080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8090: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
80a0: 6c 75 72 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75  lure.    ** occu
80b0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
80c0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
80d0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
80e0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
80f0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8100: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
8110: 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20       if( pBt && 
8120: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
8130: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
8140: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8150: 65 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c  e3BtreeSync(pBt,
8160: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
8170: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8180: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
8190: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
81a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
81b0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
81c0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
81d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
81e0: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
81f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8200: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
8210: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
8220: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
8230: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
8240: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
8250: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
8260: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
8270: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
8280: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
8290: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
82a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
82b0: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
82c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
82d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
82e0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
82f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
8300: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  ster = 0;.    rc
8310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
8320: 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46  Directory(zMainF
8330: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ile);.    if( rc
8340: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8350: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
8360: 6e 6f 74 20 67 6f 6f 64 2e 20 54 68 65 20 6d 61  not good. The ma
8370: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8380: 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  e has been delet
8390: 65 64 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  ed, but.      **
83a0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
83b0: 79 6e 63 20 66 61 69 6c 65 64 2e 20 54 68 65 72  ync failed. Ther
83c0: 65 20 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 74 65  e is no complete
83d0: 6c 79 20 73 61 66 65 20 63 6f 75 72 73 65 20 6f  ly safe course o
83e0: 66 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 6f  f.      ** actio
83f0: 6e 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 65  n from here. The
8400: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
8410: 6e 61 6c 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  nals contain the
8420: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   name of the.   
8430: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
8440: 72 6e 61 6c 20 66 69 6c 65 2c 20 62 75 74 20 74  rnal file, but t
8450: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 6f  here is no way o
8460: 66 20 6b 6e 6f 77 69 6e 67 20 69 66 20 74 68 61  f knowing if tha
8470: 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65  t.      ** maste
8480: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
8490: 20 6e 6f 77 20 6f 72 20 69 66 20 69 74 20 77 69   now or if it wi
84a0: 6c 6c 20 65 78 69 73 74 20 61 66 74 65 72 20 74  ll exist after t
84b0: 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 20  he operating.   
84c0: 20 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61     ** system cra
84d0: 73 68 20 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c  sh that may foll
84e0: 6f 77 20 74 68 65 20 66 73 79 6e 63 28 29 20 66  ow the fsync() f
84f0: 61 69 6c 75 72 65 2e 0a 20 20 20 20 20 20 2a 2f  ailure..      */
8500: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8510: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8520: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
8530: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
8540: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
8550: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
8560: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
8570: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
8580: 65 43 6f 6d 6d 69 74 28 29 20 61 72 65 20 6f 6e  eCommit() are on
8590: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
85a0: 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 0a 20 20   and deleting.  
85b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20 49    ** journals. I
85c0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
85d0: 20 77 72 6f 6e 67 20 77 68 69 6c 65 20 74 68 69   wrong while thi
85e0: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
85f0: 65 20 64 6f 6e 27 74 0a 20 20 20 20 2a 2a 20 72  e don't.    ** r
8600: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
8610: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
8620: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8630: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
8640: 65 64 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 73  ed,.    ** but s
8650: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
8660: 20 6a 6f 75 72 6e 61 6c 73 20 6d 61 79 20 62 65   journals may be
8670: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
8680: 65 74 75 72 6e 69 6e 67 20 61 6e 0a 20 20 20 20  eturning an.    
8690: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  ** error code wo
86a0: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
86b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
86c0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
86d0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
86e0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
86f0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
8700: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
8710: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8720: 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
8730: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8740: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
8750: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
8760: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
8770: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
8780: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
8790: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
87a0: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
87b0: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
87c0: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
87d0: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
87e0: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
87f0: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
8800: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
8810: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
8820: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
8830: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
8840: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
8850: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
8860: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
8870: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
8880: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
8890: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
88a0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
88b0: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
88c0: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
88d0: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
88e0: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
88f0: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
8900: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
8910: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
8920: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
8930: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
8940: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
8950: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
8960: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
8970: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
8980: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
8990: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
89a0: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
89b0: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
89c0: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
89d0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
89e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
89f0: 69 6e 64 20 65 76 65 72 79 20 61 63 74 69 76 65  ind every active
8a00: 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e 20 70   VM other than p
8a10: 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67 65 20  Vdbe and change 
8a20: 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a 2a 2a  its status to.**
8a30: 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69 73 20   aborted.  This 
8a40: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f 6e 65  happens when one
8a50: 20 56 4d 20 63 61 75 73 65 73 20 61 20 72 6f 6c   VM causes a rol
8a60: 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61 6e 0a  lback due to an.
8a70: 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  ** ON CONFLICT R
8a80: 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65 20 28  OLLBACK clause (
8a90: 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20 20 54  for example).  T
8aa0: 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73  he other VMs mus
8ab0: 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65 64 20  t be.** aborted 
8ac0: 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20  so that they do 
8ad0: 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20 72 6f  not have data ro
8ae0: 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  lled out from un
8af0: 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68 65 6d  derneath.** them
8b00: 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20 73 65   leading to a se
8b10: 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gfault..*/.void 
8b20: 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65  sqlite3AbortOthe
8b30: 72 41 63 74 69 76 65 56 64 62 65 73 28 73 71 6c  rActiveVdbes(sql
8b40: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
8b50: 70 45 78 63 65 70 74 29 7b 0a 20 20 56 64 62 65  pExcept){.  Vdbe
8b60: 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f 72 28   *pOther;.  for(
8b70: 70 4f 74 68 65 72 3d 64 62 2d 3e 70 56 64 62 65  pOther=db->pVdbe
8b80: 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74 68 65 72  ; pOther; pOther
8b90: 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b  =pOther->pNext){
8ba0: 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 3d  .    if( pOther=
8bb0: 3d 70 45 78 63 65 70 74 20 29 20 63 6f 6e 74 69  =pExcept ) conti
8bc0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 74  nue;.    if( pOt
8bd0: 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  her->magic!=VDBE
8be0: 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 4f  _MAGIC_RUN || pO
8bf0: 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f 6e  ther->pc<0 ) con
8c00: 74 69 6e 75 65 3b 0a 20 20 20 20 63 68 65 63 6b  tinue;.    check
8c10: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
8c20: 29 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43  );.    closeAllC
8c30: 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29 3b 0a  ursors(pOther);.
8c40: 20 20 20 20 63 68 65 63 6b 41 63 74 69 76 65 56      checkActiveV
8c50: 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20 20  dbeCnt(db);.    
8c60: 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64 20  pOther->aborted 
8c70: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
8c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8c90: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
8ca0: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
8cb0: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
8cc0: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
8cd0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
8ce0: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
8cf0: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
8d00: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
8d10: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
8d20: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
8d30: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
8d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8d50: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
8d60: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
8d70: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
8d80: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
8d90: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
8da0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a  E_MAGIC_HALT..**
8db0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
8dc0: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
8dd0: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
8de0: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
8df0: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
8e00: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
8e10: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
8e20: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
8e30: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
8e40: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
8e50: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
8e60: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
8e70: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
8e80: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
8e90: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
8ea0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
8eb0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
8ec0: 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65  t (*xFunc)(Btree
8ed0: 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20   *pBt) = 0;  /* 
8ee0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
8ef0: 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20 62   on each btree b
8f00: 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ackend */.  int 
8f10: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
8f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
8f30: 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c  t to true if SQL
8f40: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45  ITE_NOMEM or IOE
8f50: 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  RR */..  /* This
8f60: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
8f70: 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
8f80: 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
8f90: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
8fa0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
8fb0: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
8fc0: 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
8fd0: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
8fe0: 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
8ff0: 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
9000: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
9010: 2a 0a 20 20 2a 2a 20 53 70 65 63 69 61 6c 20 65  *.  ** Special e
9020: 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors:.  **.  **
9030: 20 20 20 20 20 49 66 20 61 6e 20 53 51 4c 49 54       If an SQLIT
9040: 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f 72 20 68 61  E_NOMEM error ha
9050: 73 20 6f 63 63 75 72 65 64 20 69 6e 20 61 20 73  s occured in a s
9060: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 72  tatement that wr
9070: 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20 20 20 20  ites to.  **    
9080: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
9090: 68 65 6e 20 65 69 74 68 65 72 20 61 20 73 74 61  hen either a sta
90a0: 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
90b0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
90c0: 6c 6c 65 64 0a 20 20 2a 2a 20 20 20 20 20 62 61  lled.  **     ba
90d0: 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ck to ensure the
90e0: 20 74 72 65 65 2d 73 74 72 75 63 74 75 72 65 73   tree-structures
90f0: 20 61 72 65 20 69 6e 20 61 20 63 6f 6e 73 69 73   are in a consis
9100: 74 65 6e 74 20 73 74 61 74 65 2e 20 41 0a 20 20  tent state. A.  
9110: 2a 2a 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74  **     statement
9120: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9130: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 6f  rolled back if o
9140: 6e 65 20 69 73 20 6f 70 65 6e 2c 20 6f 74 68 65  ne is open, othe
9150: 72 77 69 73 65 20 74 68 65 0a 20 20 2a 2a 20 20  rwise the.  **  
9160: 20 20 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61     entire transa
9170: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
9180: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  lled back..  **.
9190: 20 20 2a 2a 20 20 20 20 20 49 66 20 61 6e 20 53    **     If an S
91a0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 65 72 72 6f  QLITE_IOERR erro
91b0: 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 69 6e  r has occured in
91c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61   a statement tha
91d0: 74 20 77 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a  t writes to.  **
91e0: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
91f0: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
9200: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  re transaction m
9210: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
9220: 63 6b 2e 20 54 68 65 0a 20 20 2a 2a 20 20 20 20  ck. The.  **    
9230: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 61 79 20 68   I/O error may h
9240: 61 76 65 20 63 61 75 73 65 64 20 67 61 72 62 61  ave caused garba
9250: 67 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ge to be written
9260: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9270: 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  .  **     file. 
9280: 57 65 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  Were the transac
9290: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
92a0: 20 61 6e 64 20 65 76 65 6e 74 75 61 6c 6c 79 20   and eventually 
92b0: 62 65 20 72 6f 6c 6c 65 64 20 0a 20 20 2a 2a 20  be rolled .  ** 
92c0: 20 20 20 20 62 61 63 6b 20 74 68 61 74 20 67 61      back that ga
92d0: 72 62 61 67 65 20 6d 69 67 68 74 20 65 6e 64 20  rbage might end 
92e0: 75 70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  up in the databa
92f0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 20 20  se file..  **   
9300: 20 20 0a 20 20 2a 2a 20 20 20 20 20 49 6e 20 62    .  **     In b
9310: 6f 74 68 20 6f 66 20 74 68 65 20 61 62 6f 76 65  oth of the above
9320: 20 63 61 73 65 73 2c 20 74 68 65 20 56 64 62 65   cases, the Vdbe
9330: 2e 65 72 72 6f 72 41 63 74 69 6f 6e 20 76 61 72  .errorAction var
9340: 69 61 62 6c 65 20 69 73 20 0a 20 20 2a 2a 20 20  iable is .  **  
9350: 20 20 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 74     ignored. If t
9360: 68 65 20 73 71 6c 69 74 65 33 2e 61 75 74 6f 43  he sqlite3.autoC
9370: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 66 61  ommit flag is fa
9380: 6c 73 65 20 61 6e 64 20 61 20 74 72 61 6e 73 61  lse and a transa
9390: 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69  ction.  **     i
93a0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 69  s rolled back, i
93b0: 74 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  t will be set to
93c0: 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   true..  **.  **
93d0: 20 4f 74 68 65 72 20 65 72 72 6f 72 73 3a 0a 20   Other errors:. 
93e0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20 65 72 72 6f   **.  ** No erro
93f0: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 0a 20 20  r:.  **.  */..  
9400: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
9410: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
9420: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9430: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
9440: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
9450: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
9460: 20 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 6c 74   /* Already halt
9470: 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20  ed.  Nothing to 
9480: 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  do. */.    asser
9490: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
94a0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a  E_MAGIC_HALT );.
94b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
94c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
94d0: 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  .    closeAllCur
94e0: 73 6f 72 73 28 70 29 3b 0a 23 65 6e 64 69 66 0a  sors(p);.#endif.
94f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9500: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  E_OK;.  }.  clos
9510: 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
9520: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
9530: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
9540: 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
9550: 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
9560: 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
9570: 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  r started */.  i
9580: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 0a  f( p->pc>=0 ){..
9590: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
95a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
95b0: 69 61 6c 20 65 72 72 6f 72 73 20 2d 20 53 51 4c  ial errors - SQL
95c0: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 53 51 4c  ITE_NOMEM or SQL
95d0: 49 54 45 5f 49 4f 45 52 52 20 2a 2f 0a 20 20 20  ITE_IOERR */.   
95e0: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
95f0: 3d 20 28 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  = ((p->rc==SQLIT
9600: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 2d 3e 72 63  E_NOMEM || p->rc
9610: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3f  ==SQLITE_IOERR)?
9620: 31 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73  1:0);.    if( is
9630: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
9640: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f        /* This lo
9650: 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63 20 61  op does static a
9660: 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 71  nalysis of the q
9670: 75 65 72 79 20 74 6f 20 73 65 65 20 77 68 69 63  uery to see whic
9680: 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  h of the.      *
9690: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  * following thre
96a0: 65 20 63 61 74 65 67 6f 72 69 65 73 20 69 74 20  e categories it 
96b0: 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20  falls into:.    
96c0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
96d0: 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20    Read-only.    
96e0: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
96f0: 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  ith statement jo
9700: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20  urnal.      **  
9710: 20 20 20 51 75 65 72 79 20 77 69 74 68 6f 75 74     Query without
9720: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9730: 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  al.      **.    
9740: 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f    ** We could do
9750: 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20   something more 
9760: 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68 69  elegant than thi
9770: 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  s static analysi
9780: 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a  s (i.e..      **
9790: 20 73 74 6f 72 65 20 74 68 65 20 74 79 70 65 20   store the type 
97a0: 6f 66 20 71 75 65 72 79 20 61 73 20 70 61 72 74  of query as part
97b0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61 74   of the compliat
97c0: 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74 20  ion phase), but 
97d0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69  .      ** handli
97e0: 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49  ng malloc() or I
97f0: 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61 20 66  O failure is a f
9800: 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64  airly obscure ed
9810: 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20 20 20  ge case so .    
9820: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 72 6f    ** this is pro
9830: 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20 54 6f  bably easier. To
9840: 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61 6e 20  do: Might be an 
9850: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
9860: 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  educe .      ** 
9870: 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65 72 79  code size a very
9880: 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68   small amount th
9890: 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  ough....      */
98a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 52 65 61  .      int isRea
98b0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  dOnly = 1;.     
98c0: 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74   int isStatement
98d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
98e0: 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e  rt(p->aOp || p->
98f0: 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66  nOp==0);.      f
9900: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
9910: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
9920: 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b   switch( p->aOp[
9930: 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  i].opcode ){.   
9940: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54         case OP_T
9950: 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20  ransaction:.    
9960: 20 20 20 20 20 20 20 20 69 73 52 65 61 64 4f 6e          isReadOn
9970: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
9980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9990: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
99a0: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
99b0: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
99c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
99d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
99e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  }.      }.  .   
99f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
9a00: 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
9a10: 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20  , we need do no 
9a20: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e  rollback at all.
9a30: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
9a40: 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74    ** proceed wit
9a50: 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61  h the special ha
9a60: 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  ndling..      */
9a70: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 52 65  .      if( !isRe
9a80: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
9a90: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
9aa0: 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 69 73 53  ITE_NOMEM && isS
9ab0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
9ac0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
9ad0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
9ae0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  ckStmt;.        
9af0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9b00: 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
9b10: 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
9b20: 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
9b30: 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
9b40: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
9b50: 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
9b60: 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
9b70: 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
9b80: 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
9b90: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
9ba0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9bb0: 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65  AbortOtherActive
9bc0: 56 64 62 65 73 28 64 62 2c 20 70 29 3b 0a 20 20  Vdbes(db, p);.  
9bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
9be0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
9bf0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
9c00: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
9c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9c20: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
9c30: 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
9c40: 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
9c50: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
9c60: 6e 6c 79 20 61 63 74 69 76 65 20 76 64 62 65 2c  nly active vdbe,
9c70: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   then.    ** we 
9c80: 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
9c90: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
9ca0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
9cb0: 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
9cc0: 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
9cd0: 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
9ce0: 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
9cf0: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
9d00: 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
9d10: 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
9d20: 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
9d30: 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
9d40: 6d 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76  mit && db->activ
9d50: 65 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20  eVdbeCnt==1 ){. 
9d60: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
9d70: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
9d80: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
9d90: 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
9da0: 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 09 2f 2a  ialError) ){../*
9db0: 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
9dc0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61   flag is true, a
9dd0: 6e 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  nd the vdbe prog
9de0: 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20  ram was .       
9df0: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f   ** successful o
9e00: 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
9e10: 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54  L' constraint. T
9e20: 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
9e30: 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  it .        ** i
9e40: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9e50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
9e60: 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d  nt rc = vdbeComm
9e70: 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  it(db);.        
9e80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
9e90: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  USY ){.         
9ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
9eb0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
9ec0: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
9ed0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9ee0: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
9ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
9f00: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
9f10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f30: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
9f40: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
9f50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9f70: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
9f80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9f90: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
9fa0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
9fb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
9fc0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
9fd0: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
9fe0: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
9ff0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
a000: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
a010: 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
a020: 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
a030: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
a040: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a050: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d  ackStmt;.      }
a060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a070: 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41  lite3AbortOtherA
a080: 63 74 69 76 65 56 64 62 65 73 28 64 62 2c 20 70  ctiveVdbes(db, p
a090: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a0a0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
a0b0: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
a0c0: 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
a0d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
a0e0: 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63 20      /* If xFunc 
a0f0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
a100: 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 73  n it is one of s
a110: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a120: 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20 2a  ackStmt or.    *
a130: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
a140: 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69  mmitStmt. Call i
a150: 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 62  t once on each b
a160: 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72  ackend. If an er
a170: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20 2a  ror occurs.    *
a180: 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  * and the return
a190: 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20 53   code is still S
a1a0: 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68  QLITE_OK, set th
a1b0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
a1c0: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
a1d0: 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20 20  error value..   
a1e0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21   */.    assert(!
a1f0: 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20 78  xFunc ||.      x
a200: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
a210: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a  eeCommitStmt ||.
a220: 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c        xFunc==sql
a230: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
a240: 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  kStmt.    );.   
a250: 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20   for(i=0; xFunc 
a260: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
a270: 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
a280: 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  c;.      Btree *
a290: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
a2a0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
a2b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
a2c0: 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a  c = xFunc(pBt);.
a2d0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26          if( rc &
a2e0: 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  & (p->rc==SQLITE
a2f0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
a300: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  LITE_CONSTRAINT)
a310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
a320: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
a330: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
a340: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
a350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
a360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a370: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
a380: 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
a390: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
a3a0: 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  and the statemen
a3b0: 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  t was committed,
a3c0: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
a3d0: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
a3e0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
a3f0: 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
a400: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
a410: 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63 20       if( !xFunc 
a420: 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65  || xFunc==sqlite
a430: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
a440: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a450: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
a460: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
a470: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a490: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
a4a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
a4b0: 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
a4c0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
a4d0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20   /* Rollback or 
a4e0: 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d  commit any schem
a4f0: 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f  a changes that o
a500: 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20  ccurred. */.    
a510: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
a520: 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67  E_OK && db->flag
a530: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
a540: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20  hanges ){.      
a550: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
a560: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
a570: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  );.      db->fla
a580: 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  gs = (db->flags 
a590: 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  | SQLITE_InternC
a5a0: 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 20  hanges);.    }. 
a5b0: 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
a5c0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
a5d0: 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
a5e0: 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
a5f0: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
a600: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
a610: 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
a620: 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70  beCnt--;.  }.  p
a630: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
a640: 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
a650: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
a660: 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  db);..  return S
a670: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a680: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
a690: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
a6a0: 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
a6b0: 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
a6c0: 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
a6d0: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
a6e0: 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
a6f0: 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
a700: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
a710: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
a720: 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
a730: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
a740: 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
a750: 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
a760: 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
a770: 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
a780: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
a790: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
a7a0: 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
a7b0: 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
a7c0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
a7d0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
a7e0: 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
a7f0: 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
a800: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
a810: 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
a820: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
a830: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20  BE_MAGIC_RUN && 
a840: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
a850: 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
a860: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d   sqlite3Error(p-
a870: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55  >db, SQLITE_MISU
a880: 53 45 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  SE, 0);.    retu
a890: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
a8a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
a8b0: 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
a8c0: 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
a8d0: 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
a8e0: 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
a8f0: 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
a900: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
a910: 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
a920: 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
a930: 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
a940: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
a950: 3e 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  >db);.  sqlite3V
a960: 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73 71  dbeHalt(p);.  sq
a970: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70  lite3SafetyOff(p
a980: 2d 3e 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ->db);..  /* If 
a990: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
a9a0: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
a9b0: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
a9c0: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
a9d0: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
a9e0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
a9f0: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
aa00: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
aa10: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
aa20: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
aa30: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
aa40: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
aa50: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
aa60: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
aa70: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
aa80: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
aa90: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
aaa0: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
aab0: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
aac0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
aad0: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
aae0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 2a  {.      sqlite3*
aaf0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20   db = p->db;.   
ab00: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
ab10: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
ab20: 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
ab30: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c  SQLITE_UTF8, sql
ab40: 69 74 65 33 46 72 65 65 58 29 3b 0a 20 20 20 20  ite3FreeX);.    
ab50: 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
ab60: 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e  p->rc;.      p->
ab70: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
ab80: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
ab90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
aba0: 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d  3Error(p->db, p-
abb0: 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  >rc, 0);.    }el
abc0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
abd0: 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51  3Error(p->db, SQ
abe0: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20  LITE_OK, 0);.   
abf0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
ac00: 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
ac10: 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
ac20: 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
ac30: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
ac40: 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
ac50: 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
ac60: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
ac70: 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
ac80: 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
ac90: 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
aca0: 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
acb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
acc0: 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
acd0: 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
ace0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
acf0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30  (p->db, p->rc, 0
ad00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  );.  }..  /* Rec
ad10: 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
ad20: 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
ad30: 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
ad40: 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
ad50: 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
ad60: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
ad70: 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20  DBE run..  */.  
ad80: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c  assert( p->pTos<
ad90: 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63  &p->aStack[p->pc
ada0: 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21  <0?0:p->pc] || !
adb0: 70 2d 3e 61 53 74 61 63 6b 20 29 3b 0a 23 69 66  p->aStack );.#if
adc0: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
add0: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
ade0: 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
adf0: 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
ae00: 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
ae10: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
ae20: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
ae30: 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
ae40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ae50: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
ae60: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
ae70: 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
ae80: 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
ae90: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
aea0: 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
aeb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
aec0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
aed0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
aee0: 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
aef0: 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
af00: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
af10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
af20: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
af30: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
af40: 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
af50: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
af60: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
af70: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
af80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
af90: 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
afa0: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
afb0: 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
afc0: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
afd0: 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
afe0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
aff0: 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64  IT;.  p->aborted
b000: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
b010: 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  c==SQLITE_SCHEMA
b020: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
b030: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
b040: 6d 61 28 70 2d 3e 64 62 2c 20 30 29 3b 0a 20 20  ma(p->db, 0);.  
b050: 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  }.  return p->rc
b060: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
b070: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
b080: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
b090: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
b0a0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
b0b0: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
b0c0: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
b0d0: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
b0e0: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
b0f0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
b100: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
b110: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
b120: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b130: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
b140: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
b150: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
b160: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
b170: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b180: 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
b190: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67  }else if( p->mag
b1a0: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
b1b0: 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  NIT ){.    retur
b1c0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
b1d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
b1e0: 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
b1f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b200: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74  ** Call the dest
b210: 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20  ructor for each 
b220: 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e  auxdata entry in
b230: 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77   pVdbeFunc for w
b240: 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72  hich.** the corr
b250: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
b260: 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20   mask is clear. 
b270: 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   Auxdata entries
b280: 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72   beyond 31.** ar
b290: 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79  e always destroy
b2a0: 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20  ed.  To destroy 
b2b0: 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72  all auxdata entr
b2c0: 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a  ies, call this.*
b2d0: 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d  * routine with m
b2e0: 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20  ask==0..*/.void 
b2f0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
b300: 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e  eAuxData(VdbeFun
b310: 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e  c *pVdbeFunc, in
b320: 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  t mask){.  int i
b330: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b340: 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20  VdbeFunc->nAux; 
b350: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
b360: 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
b370: 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41   &pVdbeFunc->apA
b380: 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28  ux[i];.    if( (
b390: 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28  i>31 || !(mask&(
b3a0: 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d  1<<i))) && pAux-
b3b0: 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69  >pAux ){.      i
b3c0: 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
b3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
b3e0: 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
b3f0: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
b400: 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20       pAux->pAux 
b410: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
b420: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
b430: 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
b440: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b450: 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
b460: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
b470: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
b480: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20  .  Cleanup(p);. 
b490: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
b4a0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
b4b0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
b4c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
b4d0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64  sert( p->db->pVd
b4e0: 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e  be==p );.    p->
b4f0: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
b500: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
b510: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
b520: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
b530: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
b540: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
b550: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b560: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
b570: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d     Op *pOp = &p-
b580: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66  >aOp[i];.      f
b590: 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70  reeP3(pOp->p3typ
b5a0: 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  e, pOp->p3);.   
b5b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
b5c0: 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20  e(p->aOp);.  }. 
b5d0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b5e0: 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
b5f0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  r);.  sqliteFree
b600: 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73  (p->aLabel);.  s
b610: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74  qliteFree(p->aSt
b620: 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  ack);.  releaseM
b630: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
b640: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
b650: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
b660: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61   sqliteFree(p->a
b670: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 70 2d 3e 6d  ColName);.  p->m
b680: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
b690: 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65  C_DEAD;.  sqlite
b6a0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
b6b0: 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
b6c0: 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
b6d0: 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
b6e0: 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
b6f0: 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
b700: 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ow.  Return an e
b710: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e  rror code.  If n
b720: 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64  o MoveTo is pend
b730: 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  ing, this.** rou
b740: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e  tine does nothin
b750: 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  g and returns SQ
b760: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
b770: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
b780: 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a  rMoveto(Cursor *
b790: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
b7a0: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
b7b0: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
b7c0: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
b7d0: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
b7e0: 75 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  unt;.    assert(
b7f0: 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
b800: 20 20 20 69 66 28 20 70 2d 3e 69 73 54 61 62 6c     if( p->isTabl
b810: 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
b820: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
b830: 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  to(p->pCursor, 0
b840: 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
b850: 74 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 65  t, &res);.    }e
b860: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
b870: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
b880: 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63  to(p->pCursor,(c
b890: 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54  har*)&p->movetoT
b8a0: 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 20 20 20 73 69 7a 65 6f 66 28 69 36 34 29       sizeof(i64)
b8d0: 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20  ,&res);.    }.  
b8e0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b8f0: 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49  n rc;.    *p->pI
b900: 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ncrKey = 0;.    
b910: 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b  p->lastRowid = k
b920: 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74  eyToInt(p->movet
b930: 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d  oTarget);.    p-
b940: 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
b950: 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20  res==0;.    if( 
b960: 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  res<0 ){.      r
b970: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b980: 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c  Next(p->pCursor,
b990: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
b9a0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
b9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b9c0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
b9d0: 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  ++;.    p->defer
b9e0: 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
b9f0: 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
ba00: 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
ba10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
ba20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ba30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ba40: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
ba50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
ba60: 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
ba70: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
ba80: 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
ba90: 33 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28  3VdbeSerialRead(
baa0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
bab0: 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
bac0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
bad0: 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  Write().**.** en
bae0: 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
baf0: 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
bb00: 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
bb10: 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
bb20: 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
bb30: 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
bb40: 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
bb50: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
bb60: 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
bb70: 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
bb80: 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
bb90: 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
bba0: 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
bbb0: 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
bbc0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
bbd0: 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
bbe0: 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
bbf0: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
bc00: 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
bc10: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
bc20: 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
bc30: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
bc40: 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
bc50: 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
bc60: 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
bc70: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
bc80: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
bc90: 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
bca0: 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
bcb0: 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
bcc0: 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
bcd0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
bce0: 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
bcf0: 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
bd00: 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
bd10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
bd20: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
bd30: 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
bd40: 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
bd50: 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
bd60: 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
bd70: 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
bd80: 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
bd90: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
bda0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
bdb0: 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
bdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
bdd0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
bde0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
bdf0: 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
be00: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
be10: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
be20: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
be30: 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
be60: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
be70: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
be80: 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
be90: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
bea0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
beb0: 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
bec0: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
bed0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
bee0: 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
bf10: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
bf20: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
bf30: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
bf40: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
bf50: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
bf80: 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
bf90: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
bfa0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
bfb0: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
bfc0: 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
bfd0: 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
bfe0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
bff0: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
c000: 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
c010: 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
c040: 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
c050: 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
c060: 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
c070: 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
c080: 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
c090: 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
c0a0: 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
c0b0: 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
c0c0: 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
c0d0: 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
c0e0: 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
c0f0: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
c100: 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
c110: 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
c120: 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
c130: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c140: 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
c150: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
c160: 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
c170: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c180: 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
c190: 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
c1a0: 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
c1b0: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a  = pMem->flags;..
c1c0: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
c1d0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
c1e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
c1f0: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
c200: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
c210: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
c220: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
c230: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
c240: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
c250: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31   ((((i64)0x00001
c260: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
c270: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69   i64 i = pMem->i
c280: 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
c290: 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
c2a0: 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
c2b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c2c0: 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  8+i;.    }.    u
c2d0: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
c2e0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
c2f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
c300: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
c310: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
c320: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
c330: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
c340: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
c350: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
c360: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
c370: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
c380: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
c390: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
c3a0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
c3b0: 37 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  7;.  }.  if( fla
c3c0: 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
c3d0: 20 20 69 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e    int n = pMem->
c3e0: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  n;.    assert( n
c3f0: 3e 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  >=0 );.    retur
c400: 6e 20 28 28 6e 2a 32 29 20 2b 20 31 33 29 3b 0a  n ((n*2) + 13);.
c410: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
c420: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
c430: 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a  return (pMem->n*
c440: 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72  2 + 12);.  }.  r
c450: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c460: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
c470: 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
c480: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
c490: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
c4a0: 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e  rial-type..*/.in
c4b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
c4c0: 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
c4d0: 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
c4e0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
c4f0: 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
c500: 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
c510: 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
c520: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
c530: 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
c540: 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
c550: 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
c560: 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
c570: 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
c580: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
c590: 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
c5a0: 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
c5b0: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
c5c0: 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
c5d0: 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
c5e0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
c5f0: 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
c600: 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
c610: 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
c620: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
c630: 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
c640: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
c650: 62 65 53 65 72 69 61 6c 50 75 74 28 75 6e 73 69  beSerialPut(unsi
c660: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
c670: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
c680: 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75  ile_format){.  u
c690: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  32 serial_type =
c6a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c6b0: 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c  alType(pMem, fil
c6c0: 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74  e_format);.  int
c6d0: 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
c6e0: 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
c6f0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
c700: 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
c710: 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
c720: 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   v;.    int i;. 
c730: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
c740: 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 76  pe==7 ){.      v
c750: 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d   = *(u64*)&pMem-
c760: 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >r;.    }else{. 
c770: 20 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29       v = *(u64*)
c780: 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 7d 0a  &pMem->i;.    }.
c790: 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
c7a0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
c7b0: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
c7c0: 70 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  pe);.    while( 
c7d0: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
c7e0: 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a  [i] = (v&0xFF);.
c7f0: 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
c800: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
c810: 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
c820: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
c830: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
c840: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 6c 65  pe>=12 ){.    le
c850: 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  n = sqlite3VdbeS
c860: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
c870: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6d  ial_type);.    m
c880: 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
c890: 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
c8a0: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
c8b0: 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
c8c0: 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
c8d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c8e0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
c8f0: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
c900: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
c910: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
c920: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
c930: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
c940: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
c950: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
c960: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
c970: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
c980: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
c990: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
c9a0: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
c9b0: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
c9c0: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
c9d0: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c9f0: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
ca00: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
ca10: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca30: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
ca40: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
ca50: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
ca60: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
ca70: 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
ca80: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
ca90: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
caa0: 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
cab0: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
cac0: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
cad0: 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
cae0: 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
caf0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
cb00: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
cb10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
cb20: 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
cb30: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
cb40: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20        pMem->i = 
cb50: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
cb60: 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
cb70: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
cb80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
cb90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cba0: 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
cbb0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
cbc0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20  /.      pMem->i 
cbd0: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
cbe0: 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
cbf0: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
cc00: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
cc10: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
cc20: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
cc30: 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
cc40: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
cc50: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
cc60: 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
cc70: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20  ar)buf[0])<<16) 
cc80: 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20  | (buf[1]<<8) | 
cc90: 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[2];.      pM
cca0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ccb0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
ccc0: 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
ccd0: 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
cce0: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
ccf0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
cd00: 3e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34  >i = (buf[0]<<24
cd10: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
cd20: 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
cd30: 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
cd40: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
cd50: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
cd60: 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
cd70: 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
cd80: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
cd90: 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  er */.      u64 
cda0: 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  x = (((signed ch
cdb0: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
cdc0: 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75   buf[1];.      u
cdd0: 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c  32 y = (buf[2]<<
cde0: 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31  24) | (buf[3]<<1
cdf0: 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29  6) | (buf[4]<<8)
ce00: 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20   | buf[5];.     
ce10: 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
ce20: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20  ;.      pMem->i 
ce30: 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
ce40: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ce50: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
ce60: 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
ce70: 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
ce80: 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
ce90: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
cea0: 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
ceb0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
cec0: 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20  /.      u64 x;. 
ced0: 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20       u32 y;.#if 
cee0: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
cef0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
cf00: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
cf10: 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f  G_POINT).      /
cf20: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
cf30: 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
cf40: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
cf50: 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
cf60: 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
cf70: 72 2e 20 20 54 68 65 20 62 79 74 65 20 6f 72 64  r.  The byte ord
cf80: 65 72 20 64 69 66 66 65 72 73 20 6f 6e 20 73 6f  er differs on so
cf90: 6d 65 20 28 62 72 6f 6b 65 6e 29 20 61 72 63 68  me (broken) arch
cfa0: 69 74 65 63 74 75 72 65 73 2e 0a 20 20 20 20 20  itectures..     
cfb0: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
cfc0: 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
cfd0: 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
cfe0: 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 61 73 73  )<<32;.      ass
cff0: 65 72 74 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62  ert( 1.0==*(doub
d000: 6c 65 2a 29 26 74 31 20 29 3b 0a 23 65 6e 64 69  le*)&t1 );.#endi
d010: 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
d020: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
d030: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
d040: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
d050: 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
d060: 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
d070: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
d080: 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
d090: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
d0a0: 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
d0b0: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
d0c0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
d0d0: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
d0e0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
d0f0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
d100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d110: 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64     pMem->r = *(d
d120: 6f 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20  ouble*)&x;.     
d130: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
d140: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
d150: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
d160: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  8;.    }.    cas
d170: 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
d180: 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
d190: 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
d1a0: 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  r 1 */.      pMe
d1b0: 6d 2d 3e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  m->i = serial_ty
d1c0: 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
d1d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
d1e0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
d1f0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
d200: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
d210: 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
d220: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
d230: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
d240: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
d250: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
d260: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
d270: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
d280: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
d290: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
d2a0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
d2b0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
d2c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d2d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
d2e0: 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
d2f0: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
d300: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
d310: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d320: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
d330: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 72  he header of a r
d340: 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f  ecord consists o
d350: 66 20 61 20 73 65 71 75 65 6e 63 65 20 76 61 72  f a sequence var
d360: 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74  iable-length int
d370: 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20  egers..** These 
d380: 69 6e 74 65 67 65 72 73 20 61 72 65 20 61 6c 6d  integers are alm
d390: 6f 73 74 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c  ost always small
d3a0: 20 61 6e 64 20 61 72 65 20 65 6e 63 6f 64 65 64   and are encoded
d3b0: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74   as a single byt
d3c0: 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  e..** The follow
d3d0: 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  ing macro takes 
d3e0: 61 64 76 61 6e 74 61 67 65 20 74 68 69 73 20 66  advantage this f
d3f0: 61 63 74 20 74 6f 20 70 72 6f 76 69 64 65 20 61  act to provide a
d400: 20 66 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20   fast decode.** 
d410: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  of the integers 
d420: 69 6e 20 61 20 72 65 63 6f 72 64 20 68 65 61 64  in a record head
d430: 65 72 2e 20 20 49 74 20 69 73 20 66 61 73 74 65  er.  It is faste
d440: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
d450: 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 74   case.** where t
d460: 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 61 20  he integer is a 
d470: 73 69 6e 67 6c 65 20 62 79 74 65 2e 20 20 49 74  single byte.  It
d480: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f   is a little slo
d490: 77 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  wer when the.** 
d4a0: 69 6e 74 65 67 65 72 20 69 73 20 74 77 6f 20 6f  integer is two o
d4b0: 72 20 6d 6f 72 65 20 62 79 74 65 73 2e 20 20 42  r more bytes.  B
d4c0: 75 74 20 6f 76 65 72 61 6c 6c 20 69 74 20 69 73  ut overall it is
d4d0: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   faster..**.** T
d4e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
d4f0: 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65 71 75  ressions are equ
d500: 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20  ivalent:.**.**  
d510: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 47 65     x = sqlite3Ge
d520: 74 56 61 72 69 6e 74 33 32 28 20 41 2c 20 26 42  tVarint32( A, &B
d530: 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20   );.**.**     x 
d540: 3d 20 47 65 74 56 61 72 69 6e 74 28 20 41 2c 20  = GetVarint( A, 
d550: 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69  B );.**.*/.#defi
d560: 6e 65 20 47 65 74 56 61 72 69 6e 74 28 41 2c 42  ne GetVarint(A,B
d570: 29 20 20 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d  )  ((B = *(A))<=
d580: 30 78 37 66 20 3f 20 31 20 3a 20 73 71 6c 69 74  0x7f ? 1 : sqlit
d590: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c  e3GetVarint32(A,
d5a0: 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   &B))../*.** Thi
d5b0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
d5c0: 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
d5d0: 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
d5e0: 72 65 63 6f 72 64 73 20 73 70 65 63 69 66 69 65  records specifie
d5f0: 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c  d by .** {nKey1,
d600: 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65   pKey1} and {nKe
d610: 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75  y2, pKey2}, retu
d620: 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65  rning a negative
d630: 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
d640: 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
d650: 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
d660: 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
d670: 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
d680: 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79  eater than {nKey
d690: 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68  2, pKey2}.  Both
d6a0: 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d   Key1 and Key2 m
d6b0: 75 73 74 20 62 65 20 62 79 74 65 20 73 74 72 69  ust be byte stri
d6c0: 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20  ngs.** composed 
d6d0: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
d6e0: 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
d6f0: 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20  he VDBE..*/.int 
d700: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
d710: 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64  dCompare(.  void
d720: 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e   *userData,.  in
d730: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
d740: 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69  oid *pKey1, .  i
d750: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
d760: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
d770: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
d780: 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75  fo = (KeyInfo*)u
d790: 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64  serData;.  u32 d
d7a0: 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20 20  1, d2;          
d7b0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
d7c0: 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
d7d0: 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
d7e0: 75 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20  u32 idx1, idx2; 
d7f0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
d800: 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
d810: 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
d820: 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
d830: 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e  1, szHdr2;  /* N
d840: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
d850: 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
d860: 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  t i = 0;.  int n
d870: 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20  Field;.  int rc 
d880: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
d890: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
d8a0: 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
d8b0: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
d8c0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
d8d0: 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d  ed char *aKey2 =
d8e0: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
d8f0: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a   char *)pKey2;..
d900: 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65    Mem mem1;.  Me
d910: 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65  m mem2;.  mem1.e
d920: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
d930: 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d  nc;.  mem2.enc =
d940: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
d950: 20 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56    .  idx1 = GetV
d960: 61 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48  arint(aKey1, szH
d970: 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
d980: 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47 65  dr1;.  idx2 = Ge
d990: 74 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20 73  tVarint(aKey2, s
d9a0: 7a 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20 73  zHdr2);.  d2 = s
d9b0: 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20  zHdr2;.  nField 
d9c0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
d9d0: 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78  ld;.  while( idx
d9e0: 31 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78 32  1<szHdr1 && idx2
d9f0: 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20 75  <szHdr2 ){.    u
da00: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
da10: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
da20: 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52  type2;..    /* R
da30: 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
da40: 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
da50: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
da60: 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
da70: 78 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28  x1 += GetVarint(
da80: 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
da90: 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20  ial_type1 );.   
daa0: 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
dab0: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
dac0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
dad0: 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
dae0: 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20  ak;.    idx2 += 
daf0: 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 32  GetVarint( aKey2
db00: 2b 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74 79  +idx2, serial_ty
db10: 70 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe2 );.    if( d
db20: 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69  2>=nKey2 && sqli
db30: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
db40: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
db50: 32 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  2)>0 ) break;.. 
db60: 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
db70: 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
db80: 68 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  h space left in 
db90: 65 61 63 68 20 6b 65 79 20 66 6f 72 20 74 68 65  each key for the
dba0: 20 62 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20   blob of.    ** 
dbb0: 64 61 74 61 20 74 6f 20 67 6f 20 77 69 74 68 20  data to go with 
dbc0: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
dbd0: 6a 75 73 74 20 72 65 61 64 2e 20 54 68 69 73 20  just read. This 
dbe0: 61 73 73 65 72 74 20 6d 61 79 20 66 61 69 6c 20  assert may fail 
dbf0: 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  if.    ** the fi
dc00: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  le is corrupted.
dc10: 20 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20    Then read the 
dc20: 76 61 6c 75 65 20 66 72 6f 6d 20 65 61 63 68 20  value from each 
dc30: 6b 65 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20  key into mem1.  
dc40: 20 20 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65    ** and mem2 re
dc50: 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20  spectively..    
dc60: 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
dc70: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
dc80: 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
dc90: 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
dca0: 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71  1);.    d2 += sq
dcb0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
dcc0: 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73  et(&aKey2[d2], s
dcd0: 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65  erial_type2, &me
dce0: 6d 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  m2);..    rc = s
dcf0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
dd00: 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69  (&mem1, &mem2, i
dd10: 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
dd20: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
dd30: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e  );.    if( mem1.
dd40: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
dd50: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
dd60: 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a  Release(&mem1);.
dd70: 20 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61      if( mem2.fla
dd80: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73  gs & MEM_Dyn ) s
dd90: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
dda0: 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20  ease(&mem2);.   
ddb0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
ddc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ddd0: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
dde0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b   /* One of the k
ddf0: 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
de00: 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74  ields, but all t
de10: 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
de20: 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20  that point.  ** 
de30: 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
de40: 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20  he incrKey flag 
de50: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
de60: 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a  e second key is.
de70: 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20    ** treated as 
de80: 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  larger..  */.  i
de90: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
dea0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e  if( pKeyInfo->in
deb0: 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  crKey ){.      r
dec0: 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  c = -1;.    }els
ded0: 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29  e if( d1<nKey1 )
dee0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
def0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32      }else if( d2
df00: 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20  <nKey2 ){.      
df10: 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  rc = -1;.    }. 
df20: 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
df30: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
df40: 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
df50: 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20  Field.          
df60: 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f       && pKeyInfo
df70: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
df80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
df90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
dfa0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
dfb0: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69  argument is an i
dfc0: 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f  ndex entry compo
dfd0: 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  sed using the OP
dfe0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
dff0: 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  de..** The last 
e000: 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65  entry in this re
e010: 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61  cord should be a
e020: 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69  n integer (speci
e030: 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  fically.** an in
e040: 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54  teger rowid).  T
e050: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
e060: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
e070: 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68  f bytes in.** th
e080: 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  at integer..*/.i
e090: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
e0a0: 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20  xRowidLen(const 
e0b0: 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
e0c0: 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
e0d0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
e0e0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
e0f0: 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
e100: 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
e110: 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71  e rowid */..  sq
e120: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
e130: 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a  (aKey, &szHdr);.
e140: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
e150: 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72  nt32(&aKey[szHdr
e160: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
e170: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
e180: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
e190: 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
e1a0: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  }.  ../*.** pCur
e1b0: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
e1c0: 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
e1d0: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
e1e0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
e1f0: 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
e200: 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
e210: 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
e220: 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
e230: 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
e240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
e250: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
e260: 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
e270: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
e280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e290: 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72  beIdxRowid(BtCur
e2a0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
e2b0: 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
e2c0: 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63  ellKey;.  int rc
e2d0: 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
e2e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e2f0: 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
e300: 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
e310: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
e320: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
e330: 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
e340: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
e350: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
e360: 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c  Mem m, v;..  sql
e370: 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
e380: 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
e390: 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
e3a0: 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y<=0 ){.    retu
e3b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e3c0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
e3d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
e3e0: 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
e3f0: 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
e400: 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
e410: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e420: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65  .  }.  sqlite3Ge
e430: 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
e440: 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  .z, &szHdr);.  s
e450: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
e460: 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
e470: 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
e480: 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
e490: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e4a0: 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
e4b0: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
e4c0: 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
e4d0: 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
e4e0: 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
e4f0: 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
e500: 76 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  v.i;.  sqlite3Vd
e510: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
e520: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e530: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e540: 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
e550: 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
e560: 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
e570: 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61   is point to aga
e580: 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
e590: 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28  string in pKey (
e5a0: 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e  of length nKey).
e5b0: 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
e5c0: 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
e5d0: 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
e5e0: 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
e5f0: 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
e600: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
e610: 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
e620: 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72  han pKey.  Retur
e630: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
e640: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b  uccess..**.** pK
e650: 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ey is either cre
e660: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
e670: 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
e680: 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
e690: 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
e6a0: 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
e6b0: 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
e6c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
e6d0: 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
e6e0: 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a  nored as well..*
e6f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
e700: 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
e710: 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20    Cursor *pC,   
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e730: 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
e740: 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
e750: 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  /.  int nKey, co
e760: 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20  nst u8 *pKey,   
e770: 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f  /* The key to co
e780: 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  mpare */.  int *
e790: 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
e7a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
e7b0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
e7c0: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
e7d0: 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b  .  i64 nCellKey;
e7e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
e7f0: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
e800: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ->pCursor;.  int
e810: 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d   lenRowid;.  Mem
e820: 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   m;..  sqlite3Bt
e830: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
e840: 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69   &nCellKey);.  i
e850: 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29  f( nCellKey<=0 )
e860: 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
e870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e880: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
e890: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
e8a0: 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
e8b0: 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  rsor, 0, nCellKe
e8c0: 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
e8d0: 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
e8e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  n rc;.  }.  lenR
e8f0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
e900: 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75  beIdxRowidLen((u
e910: 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20  8*)m.z);.  *res 
e920: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
e930: 6f 72 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70  ordCompare(pC->p
e940: 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e  KeyInfo, m.n-len
e950: 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79  Rowid, m.z, nKey
e960: 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  , pKey);.  sqlit
e970: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
e980: 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
e990: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e9a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e9b0: 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
e9c0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
e9d0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
e9e0: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
e9f0: 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
ea00: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ea10: 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
ea20: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
ea30: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
ea40: 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
ea50: 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
ea60: 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
ea70: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
ea80: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
ea90: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
eaa0: 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
eab0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
eac0: 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
ead0: 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
eae0: 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
eaf0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
eb00: 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
eb10: 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
eb20: 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
eb30: 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
eb40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
eb50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
eb60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
eb70: 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
eb80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
eb90: 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
eba0: 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
ebb0: 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
ebc0: 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
ebd0: 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
ebe0: 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
ebf0: 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
ec00: 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
ec10: 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
ec20: 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
ec30: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
ec40: 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
ec50: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
ec60: 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
ec70: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
ec80: 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
ec90: 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
eca0: 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
ecb0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
ecc0: 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
ecd0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
ece0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
ecf0: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
ed00: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
ed10: 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
ed20: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
ed30: 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
ed40: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
ed50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
ed60: 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
ed70: 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
ed80: 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
ed90: 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
eda0: 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
edb0: 64 62 3b 0a 7d 0a                                db;.}.