/ Hex Artifact Content
Login

Artifact 4002e6b19d7c9719cb81f9797316b9ad118e4370:


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: 20 6f 72 20 4f 50 5f 41 67 67 53 74 65 70 20 6f   or OP_AggStep o
1ad0: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
1ae0: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
1af0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
1b00: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
1b10: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
1b20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
1b30: 67 65 72 20 2a 70 4d 61 78 53 74 61 63 6b 20 69  ger *pMaxStack i
1b40: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78  s set to the max
1b50: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76  imum number of v
1b60: 64 62 65 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74  dbe stack.** ent
1b70: 72 69 65 73 20 74 68 61 74 20 73 74 61 74 69 63  ries that static
1b80: 20 61 6e 61 6c 79 73 69 73 20 72 65 76 65 61 6c   analysis reveal
1b90: 73 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 6d  s this program m
1ba0: 69 67 68 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a  ight need..**.**
1bb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
1bc0: 73 6f 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c  so does the foll
1bd0: 6f 77 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69  owing optimizati
1be0: 6f 6e 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f  on:  It scans fo
1bf0: 72 0a 2a 2a 20 48 61 6c 74 20 69 6e 73 74 72 75  r.** Halt instru
1c00: 63 74 69 6f 6e 73 20 77 68 65 72 65 20 50 31 3d  ctions where P1=
1c10: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
1c20: 4e 54 20 6f 72 20 50 32 3d 3d 4f 45 5f 41 62 6f  NT or P2==OE_Abo
1c30: 72 74 20 6f 72 20 66 6f 72 0a 2a 2a 20 49 64 78  rt or for.** Idx
1c40: 49 6e 73 65 72 74 20 69 6e 73 74 72 75 63 74 69  Insert instructi
1c50: 6f 6e 73 20 77 68 65 72 65 20 50 32 21 3d 30 2e  ons where P2!=0.
1c60: 20 20 49 66 20 6e 6f 20 73 75 63 68 20 69 6e 73    If no such ins
1c70: 74 72 75 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 66  truction is.** f
1c80: 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65 72 79  ound, then every
1c90: 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73 74 72   Statement instr
1ca0: 75 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65  uction is change
1cb0: 64 20 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e  d to a Noop.  In
1cc0: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 77 65  .** this way, we
1cd0: 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e 67 20   avoid creating 
1ce0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1cf0: 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63  urnal file unnec
1d00: 65 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61  essarily..*/.sta
1d10: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
1d20: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
1d30: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
1d40: 72 67 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74  rgs, int *pMaxSt
1d50: 61 63 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ack){.  int i;. 
1d60: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
1d70: 30 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74 61  0;.  int nMaxSta
1d80: 63 6b 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f  ck = p->nOp;.  O
1d90: 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61  p *pOp;.  int *a
1da0: 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65  Label = p->aLabe
1db0: 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61  l;.  int doesSta
1dc0: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d  tementRollback =
1dd0: 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61   0;.  int hasSta
1de0: 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b  tementBegin = 0;
1df0: 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f  .  for(pOp=p->aO
1e00: 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69  p, i=p->nOp-1; i
1e10: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29  >=0; i--, pOp++)
1e20: 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20  {.    u8 opcode 
1e30: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a  = pOp->opcode;..
1e40: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
1e50: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f  OP_Function || o
1e60: 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65  pcode==OP_AggSte
1e70: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  p ){.      if( p
1e80: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
1e90: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
1ea0: 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p2;.    }else 
1eb0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  if( opcode==OP_H
1ec0: 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  alt ){.      if(
1ed0: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
1ee0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
1ef0: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
1f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73   ){.        does
1f10: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1f20: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
1f30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1f40: 6f 64 65 3d 3d 4f 50 5f 49 64 78 49 6e 73 65 72  ode==OP_IdxInser
1f50: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
1f60: 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20 20 20 20  Op->p2 ){.      
1f70: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1f80: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1f90: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1fa0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  f( opcode==OP_St
1fb0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
1fc0: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
1fd0: 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  in = 1;.    }.. 
1fe0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50     if( opcodeNoP
1ff0: 75 73 68 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20  ush(opcode) ){. 
2000: 20 20 20 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d       nMaxStack--
2010: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2020: 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f   pOp->p2>=0 ) co
2030: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2040: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
2050: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
2060: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
2070: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
2080: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
2090: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
20a0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
20b0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
20c0: 4d 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78  MaxArgs;.  *pMax
20d0: 53 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63  Stack = nMaxStac
20e0: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e  k;..  /* If we n
20f0: 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20  ever rollback a 
2100: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2110: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74  ction, then stat
2120: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
2130: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
2140: 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e  needed.  So chan
2150: 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74  ge every OP_Stat
2160: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64  ement.  ** opcod
2170: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  e into an OP_Noo
2180: 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61  p.  This avoid a
2190: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
21a0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
21b0: 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e  ).  ** which can
21c0: 20 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e   be expensive on
21d0: 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e   some platforms.
21e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53  .  */.  if( hasS
21f0: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26  tatementBegin &&
2200: 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52   !doesStatementR
2210: 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66  ollback ){.    f
2220: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
2230: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
2240: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
2250: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2260: 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e  ode==OP_Statemen
2270: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  t ){.        pOp
2280: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
2290: 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
22a0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
22b0: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
22c0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
22d0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
22e0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
22f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2300: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
2310: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
2320: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2330: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
2340: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
2350: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
2360: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
2370: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
2380: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
2390: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
23a0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
23b0: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
23c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
23d0: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
23e0: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
23f0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
2400: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
2410: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2420: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2430: 49 4e 49 54 20 29 3b 0a 20 20 72 65 73 69 7a 65  INIT );.  resize
2440: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
2450: 70 20 2b 20 6e 4f 70 29 3b 0a 20 20 69 66 28 20  p + nOp);.  if( 
2460: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
2470: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74  led() ){.    ret
2480: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64  urn 0;.  }.  add
2490: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  r = p->nOp;.  if
24a0: 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69  ( nOp>0 ){.    i
24b0: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
24c0: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
24d0: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
24e0: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
24f0: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
2500: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
2510: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
2520: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
2530: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
2540: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
2550: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
2560: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
2570: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  ;.      pOut->p2
2580: 20 3d 20 70 32 3c 30 20 3f 20 61 64 64 72 20 2b   = p2<0 ? addr +
2590: 20 41 44 44 52 28 70 32 29 20 3a 20 70 32 3b 0a   ADDR(p2) : p2;.
25a0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d        pOut->p3 =
25b0: 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pIn->p3;.      
25c0: 70 4f 75 74 2d 3e 70 33 74 79 70 65 20 3d 20 70  pOut->p3type = p
25d0: 49 6e 2d 3e 70 33 20 3f 20 50 33 5f 53 54 41 54  In->p3 ? P3_STAT
25e0: 49 43 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b  IC : P3_NOTUSED;
25f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2600: 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 73  EBUG.      if( s
2610: 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f  qlite3_vdbe_addo
2620: 70 5f 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  p_trace ){.     
2630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
2640: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
2650: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
2660: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2670: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  f.    }.    p->n
2680: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20  Op += nOp;.  }. 
2690: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
26a0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
26b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
26c0: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
26d0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
26e0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
26f0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2700: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
2710: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
2720: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
2730: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
2740: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
2750: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
2760: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
2770: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
2780: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
2790: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
27a0: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
27b0: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
27c0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
27d0: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
27e0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
27f0: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2800: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2810: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2820: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2830: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
2840: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2850: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2860: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
2870: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2880: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2890: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
28a0: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
28b0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
28c0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
28d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
28e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
28f0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2900: 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b  ssert( val>=0 );
2910: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2920: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2930: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2940: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
2950: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
2960: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
2970: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
2980: 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p2 = val;.  }.}.
2990: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
29a0: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
29b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
29c0: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
29d0: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
29e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
29f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2a00: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
2a10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
2a20: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
2a30: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
2a40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2a50: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
2a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2a70: 65 20 61 20 50 33 20 76 61 6c 75 65 20 69 66 20  e a P3 value if 
2a80: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74  necessary..*/.st
2a90: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 33  atic void freeP3
2aa0: 28 69 6e 74 20 70 33 74 79 70 65 2c 20 76 6f 69  (int p3type, voi
2ab0: 64 20 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33  d *p3){.  if( p3
2ac0: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
2ad0: 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p3type ){.      
2ae0: 63 61 73 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a  case P3_DYNAMIC:
2af0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b  .      case P3_K
2b00: 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61  EYINFO:.      ca
2b10: 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  se P3_KEYINFO_HA
2b20: 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20  NDOFF: {.       
2b30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 33 29 3b   sqliteFree(p3);
2b40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
2b60: 73 65 20 50 33 5f 56 44 42 45 46 55 4e 43 3a 20  se P3_VDBEFUNC: 
2b70: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
2b80: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
2b90: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b 0a  (VdbeFunc *)p3;.
2ba0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2bb0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
2bc0: 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a  (pVdbeFunc, 0);.
2bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
2be0: 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20  ee(pVdbeFunc);. 
2bf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
2c10: 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P3_MEM: {.     
2c20: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
2c30: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
2c40: 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ue*)p3);.       
2c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2c60: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
2c70: 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63  .** Change N opc
2c80: 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  odes starting at
2c90: 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e   addr to No-ops.
2ca0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2cb0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2cc0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2cd0: 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56 64  dr, int N){.  Vd
2ce0: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
2cf0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 77 68 69  aOp[addr];.  whi
2d00: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 66  le( N-- ){.    f
2d10: 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70  reeP3(pOp->p3typ
2d20: 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  e, pOp->p3);.   
2d30: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
2d40: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
2d50: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
2d60: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
2d70: 70 4f 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pOp++;.  }.}../*
2d80: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2d90: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
2da0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
2db0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2dc0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2dd0: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
2de0: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
2df0: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
2e00: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
2e10: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
2e20: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
2e30: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
2e40: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
2e50: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
2e60: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
2e70: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
2e80: 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P3 operand is dy
2e90: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
2ea0: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
2eb0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
2ec0: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
2ed0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2ee0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
2ef0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
2f00: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
2f10: 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61  s of zP3 up to a
2f20: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
2f30: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
2f40: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
2f50: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
2f60: 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49   of zP3..**.** I
2f70: 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20  f n==P3_KEYINFO 
2f80: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
2f90: 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  3 is a pointer t
2fa0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
2fb0: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
2fc0: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
2fd0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2fe0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
2ff0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
3000: 71 6c 69 74 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20  qliteMalloc, to 
3010: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
3020: 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69  e Vdbe is finali
3030: 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45  zed..** n==P3_KE
3040: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e  YINFO_HANDOFF in
3050: 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 33  dicates that zP3
3060: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
3070: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
3080: 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  * stored in memo
3090: 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ry that the call
30a0: 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  er has obtained 
30b0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
30c0: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
30d0: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
30e0: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
30f0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
3100: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
3110: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
3120: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
3130: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 33 5f 53  alues of n (P3_S
3140: 54 41 54 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45  TATIC, P3_COLLSE
3150: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
3160: 20 74 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73   that zP3 points
3170: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
3180: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
3190: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
31a0: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
31b0: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
31c0: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
31d0: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
31e0: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
31f0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
3200: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
3210: 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P3 on the mos
3220: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
3230: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
3240: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3250: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
3260: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c  const char *zP3,
3280: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
3290: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  Op;.  assert( p=
32a0: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
32b0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
32c0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
32d0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 73 71   p->aOp==0 || sq
32e0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
32f0: 64 28 29 20 29 7b 0a 20 20 20 20 69 66 20 28 6e  d() ){.    if (n
3300: 20 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 29 20   != P3_KEYINFO) 
3310: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 6e  {.      freeP3(n
3320: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
3330: 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP3);.    }. 
3340: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3350: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
3360: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
3370: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
3380: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
3390: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
33a0: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
33b0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
33c0: 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20  P3(pOp->p3type, 
33d0: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 70 4f 70 2d  pOp->p3);.  pOp-
33e0: 3e 70 33 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  >p3 = 0;.  if( z
33f0: 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  P3==0 ){.    pOp
3400: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 70 4f  ->p3 = 0;.    pO
3410: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e  p->p3type = P3_N
3420: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
3430: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
3440: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
3450: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
3460: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
3470: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
3480: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 33 29   ((KeyInfo*)zP3)
3490: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
34a0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
34b0: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
34c0: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
34d0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
34e0: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
34f0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
3500: 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20  allocRaw( nByte 
3510: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
3520: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
3530: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e  ;.    if( pKeyIn
3540: 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  fo ){.      unsi
3550: 67 6e 65 64 20 63 68 61 72 20 2a 61 53 6f 72 74  gned char *aSort
3560: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
3570: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3580: 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  3, nByte);.     
3590: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
35a0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
35b0: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
35c0: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
35d0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
35e0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
35f0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
3600: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
3610: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
3620: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
3630: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
3640: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
3650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
3660: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45  ->p3type = P3_KE
3670: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3680: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  {.      pOp->p3t
3690: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
36a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
36b0: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
36c0: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
36d0: 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72   pOp->p3 = (char
36e0: 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP3;.    pOp->
36f0: 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49  p3type = P3_KEYI
3700: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
3710: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
3720: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
3730: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3740: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
3750: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
3760: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 3b 0a   = strlen(zP3);.
3770: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71      pOp->p3 = sq
3780: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 50 33 2c  liteStrNDup(zP3,
3790: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33   n);.    pOp->p3
37a0: 74 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49  type = P3_DYNAMI
37b0: 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  C;.  }.}..#ifnde
37c0: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
37d0: 65 70 6c 61 63 65 20 74 68 65 20 50 33 20 66 69  eplace the P3 fi
37e0: 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
37f0: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
3800: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 0a  nstruction with.
3810: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e  ** comment text.
3820: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3830: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
3840: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3850: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
3860: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3870: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
3880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3890: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
38a0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d 3d  p[p->nOp-1].p3==
38b0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0 .          || 
38c0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
38d0: 6c 65 64 28 29 20 29 3b 0a 20 20 76 61 5f 73 74  led() );.  va_st
38e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
38f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
3900: 68 61 6e 67 65 50 33 28 70 2c 20 2d 31 2c 20 73  hangeP3(p, -1, s
3910: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a  qlite3VMPrintf(z
3920: 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33 5f  Format, ap), P3_
3930: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f 65  DYNAMIC);.  va_e
3940: 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nd(ap);.}.#endif
3950: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3960: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
3970: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a  given address..*
3980: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
3990: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
39a0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
39b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
39c0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
39d0: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
39e0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
39f0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75  p->nOp );.  retu
3a00: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
3a10: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
3a20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
3a30: 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e  PLAIN) || !defin
3a40: 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20  ed(NDEBUG) \.   
3a50: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42    || defined(VDB
3a60: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
3a70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
3a80: 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  UG)./*.** Comput
3a90: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
3aa0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 33  describes the P3
3ab0: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
3ac0: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
3ad0: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
3ae0: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
3af0: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
3b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
3b10: 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f  displayP3(Op *pO
3b20: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
3b30: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
3b40: 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65 72  ar *zP3;.  asser
3b50: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
3b60: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
3b70: 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  3type ){.    cas
3b80: 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P3_KEYINFO: {.
3b90: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
3ba0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
3bb0: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
3bc0: 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  fo*)pOp->p3;.   
3bd0: 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70     sprintf(zTemp
3be0: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
3bf0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
3c00: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72  );.      i = str
3c10: 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  len(zTemp);.    
3c20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
3c30: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
3c40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
3c50: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
3c60: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
3c70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
3c80: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
3c90: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
3ca0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
3cb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e           if( i+n
3cc0: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
3cd0: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26          strcpy(&
3ce0: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 29  zTemp[i],",...")
3cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
3d00: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
3d10: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
3d20: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
3d30: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
3d40: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
3d50: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
3d60: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
3d70: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
3d80: 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  i++] = '-';.    
3d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3da0: 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b    strcpy(&zTemp[
3db0: 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  i], pColl->zName
3dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
3dd0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
3de0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
3df0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
3e00: 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  strcpy(&zTemp[i]
3e10: 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20  ,",nil");.      
3e20: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
3e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3e40: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
3e50: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
3e60: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
3e70: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
3e80: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
3e90: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
3ea0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3eb0: 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P3_COLLSEQ: {.
3ec0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3ed0: 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 2a  Coll = (CollSeq*
3ee0: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
3ef0: 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22  sprintf(zTemp, "
3f00: 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c  collseq(%.20s)",
3f10: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
3f20: 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d        zP3 = zTem
3f30: 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
3f40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
3f50: 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  3_FUNCDEF: {.   
3f60: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
3f70: 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70   = (FuncDef*)pOp
3f80: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 63 68 61 72  ->p3;.      char
3f90: 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20   zNum[30];.     
3fa0: 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20   sprintf(zTemp, 
3fb0: 22 25 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c 20 70  "%.*s", nTemp, p
3fc0: 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Def->zName);.   
3fd0: 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d 2c     sprintf(zNum,
3fe0: 22 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 6e 41  "(%d)", pDef->nA
3ff0: 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rg);.      if( s
4000: 74 72 6c 65 6e 28 7a 54 65 6d 70 29 2b 73 74 72  trlen(zTemp)+str
4010: 6c 65 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e 54 65  len(zNum)+1<=nTe
4020: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  mp ){.        st
4030: 72 63 61 74 28 7a 54 65 6d 70 2c 20 7a 4e 75 6d  rcat(zTemp, zNum
4040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4050: 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP3 = zTemp;.  
4060: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4070: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4080: 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d        zP3 = pOp-
4090: 3e 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  >p3;.      if( z
40a0: 50 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70  P3==0 || pOp->op
40b0: 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  code==OP_Noop ){
40c0: 0a 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22  .        zP3 = "
40d0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
40e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 50  .  }.  return zP
40f0: 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  3;.}.#endif...#i
4100: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
4110: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
4120: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4130: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
4140: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
4150: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4160: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
4170: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
4180: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4190: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
41a0: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
41b0: 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20  .  char *zP3;.  
41c0: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
41d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
41e0: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
41f0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
4200: 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  d %s\n";.  if( p
4210: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
4220: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20  stdout;.  zP3 = 
4230: 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a  displayP3(pOp, z
4240: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
4250: 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f  ));.  fprintf(pO
4260: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20  ut, zFormat1,.  
4270: 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33 4f      pc, sqlite3O
4280: 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e  pcodeNames[pOp->
4290: 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31  opcode], pOp->p1
42a0: 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b  , pOp->p2, zP3);
42b0: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
42c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
42d0: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
42e0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
42f0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
4300: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
4310: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
4320: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
4330: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29    while( N-->0 )
4340: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4350: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b  dbeMemRelease(p+
4360: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  +);.    }.  }.}.
4370: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4380: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
4390: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
43a0: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
43b0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
43c0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
43d0: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
43e0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
43f0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
4400: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
4410: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
4420: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
4430: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
4440: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
4450: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
4460: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
4470: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
4480: 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  LAIN"..*/.int sq
4490: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
44a0: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
44b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
44c0: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73  e VDBE */.){.  s
44d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
44e0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
44f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4500: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  K;..  assert( p-
4510: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  >explain );.  if
4520: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
4530: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74  _MAGIC_RUN ) ret
4540: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
4550: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  E;.  assert( db-
4560: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
4570: 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61  AGIC_BUSY );.  a
4580: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
4590: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
45a0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  ==SQLITE_BUSY );
45b0: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
45c0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
45d0: 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61  oes not put dyna
45e0: 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f  mic strings onto
45f0: 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   the.  ** the st
4600: 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65  ack, they may be
4610: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
4620: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
4630: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
4640: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
4650: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
4660: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
4670: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  oding..  */.  if
4680: 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61  ( p->pTos==&p->a
4690: 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20  Stack[4] ){.    
46a0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
46b0: 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20  p->aStack, 5);. 
46c0: 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61   }.  p->resOnSta
46d0: 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a 20  ck = 0;..  do{. 
46e0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
46f0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e    }while( i<p->n
4700: 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  Op && p->explain
4710: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
4720: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
4730: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
4740: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->nOp ){.    p-
4750: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
4760: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4770: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
4780: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
4790: 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74 20  QLITE_Interrupt 
47a0: 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  ){.    db->flags
47b0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
47c0: 72 72 75 70 74 3b 0a 20 20 20 20 70 2d 3e 72 63  rrupt;.    p->rc
47d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
47e0: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
47f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
4800: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
4810: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71  (&p->zErrMsg, sq
4820: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
4830: 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
4840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a   }else{.    Op *
4850: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
4860: 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  ;.    Mem *pMem 
4870: 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20  = p->aStack;.   
4880: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
4890: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
48a0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
48b0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
48c0: 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  m->i = i;       
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
48f0: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
4900: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
4910: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
4920: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
4930: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70  |MEM_Term;.    p
4940: 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33  Mem->z = sqlite3
4950: 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d  OpcodeNames[pOp-
4960: 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f 70  >opcode];  /* Op
4970: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  code */.    pMem
4980: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
4990: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  m->z);.    pMem-
49a0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
49b0: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  EXT;.    pMem->e
49c0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
49d0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
49e0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
49f0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
4a00: 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  em->i = pOp->p1;
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
4a30: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
4a40: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
4a50: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
4a60: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
4a70: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
4a80: 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70  pMem->i = pOp->p
4a90: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4ab0: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
4ac0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
4ad0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
4ae0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
4af0: 67 73 20 3d 20 4d 45 4d 5f 45 70 68 65 6d 7c 4d  gs = MEM_Ephem|M
4b00: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
4b10: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
4b20: 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61  pMem->z = displa
4b30: 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP3(pOp, pMem->z
4b40: 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d  Short, sizeof(pM
4b50: 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20  em->zShort));.  
4b60: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c    pMem->n = strl
4b70: 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  en(pMem->z);.   
4b80: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
4b90: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
4ba0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
4bb0: 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e  E_UTF8;..    p->
4bc0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d  nResColumn = 5 -
4bd0: 20 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   2*(p->explain-1
4be0: 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d  );.    p->pTos =
4bf0: 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63   pMem;.    p->rc
4c00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4c10: 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20    p->resOnStack 
4c20: 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
4c30: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
4c40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
4c50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4c60: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f  IT_EXPLAIN */../
4c70: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
4c80: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
4c90: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
4ca0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
4cb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4cc0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
4cd0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
4ce0: 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70  _DEBUG.  int nOp
4cf0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
4d00: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
4d10: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
4d20: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4d30: 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f  nOp-1];.  if( pO
4d40: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f  p->opcode==OP_No
4d50: 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30  op && pOp->p3!=0
4d60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
4d70: 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b  ar *z = pOp->p3;
4d80: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70  .    while( issp
4d90: 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a  ace(*(u8*)z) ) z
4da0: 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ++;.    printf("
4db0: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
4dc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
4dd0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
4de0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
4df0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  for execution.  
4e00: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
4e10: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
4e20: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
4e30: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
4e40: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
4e50: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
4e60: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
4e70: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
4e80: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
4e90: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
4ea0: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
4eb0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
4ec0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20   .**.** This is 
4ed0: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
4ee0: 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d  move a VDBE from
4ef0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
4f00: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
4f10: 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  C_RUN..*/.void s
4f20: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
4f30: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
4f60: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c  E */.  int nVar,
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4f90: 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68  of '?' see in th
4fa0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
4fb0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20  */.  int nMem,  
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4fe0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f   memory cells to
4ff0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
5000: 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20  nt nCursor,     
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5020: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
5030: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
5040: 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69  /.  int isExplai
5050: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
5060: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5070: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
5080: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ds is present */
5090: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  .){.  int n;..  
50a0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
50b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
50c0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
50d0: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
50e0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
50f0: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
5100: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
5110: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
5120: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
5130: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
5140: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
5150: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69   than later. Thi
5160: 73 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73  s.   * is becaus
5170: 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65  e the call to re
5180: 73 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65  sizeOpArray() be
5190: 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74  low may shrink t
51a0: 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d  he.   * p->aOp[]
51b0: 20 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d   array to save m
51c0: 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20  emory if called 
51d0: 77 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47  when in VDBE_MAG
51e0: 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61  IC_RUN .   * sta
51f0: 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d  te..   */.  p->m
5200: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
5210: 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  C_RUN;..  /* No 
5220: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72  instruction ever
5230: 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61   pushes more tha
5240: 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  n a single eleme
5250: 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nt onto the.  **
5260: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65   stack.  And the
5270: 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f   stack never gro
5280: 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65  ws on successive
5290: 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74   executions of t
52a0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f  he.  ** same loo
52b0: 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c  p.  So the total
52c0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72   number of instr
52d0: 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70  uctions is an up
52e0: 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f  per bound.  ** o
52f0: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74  n the maximum st
5300: 61 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72  ack depth requir
5310: 65 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65  ed.  (Added late
5320: 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65  r:)  The.  ** re
5330: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20  solveP2Values() 
5340: 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20  call computes a 
5350: 74 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f  tighter upper bo
5360: 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  und on the.  ** 
5370: 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a  stack size..  **
5380: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
5390: 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73   all the stack s
53a0: 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65  pace we will eve
53b0: 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  r need..  */.  i
53c0: 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20  f( p->aStack==0 
53d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
53e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
53f0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  m number of args
5400: 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65   passed to a use
5410: 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  r function. */. 
5420: 20 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20     int nStack;  
5430: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
5440: 6d 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e  mber of stack en
5450: 74 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a  tries required *
5460: 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56  /.    resolveP2V
5470: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20  alues(p, &nArg, 
5480: 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65  &nStack);.    re
5490: 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70  sizeOpArray(p, p
54a0: 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65  ->nOp);.    asse
54b0: 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20  rt( nVar>=0 );. 
54c0: 20 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63     assert( nStac
54d0: 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20  k<p->nOp );.    
54e0: 6e 53 74 61 63 6b 20 3d 20 69 73 45 78 70 6c 61  nStack = isExpla
54f0: 69 6e 20 3f 20 31 30 20 3a 20 6e 53 74 61 63 6b  in ? 10 : nStack
5500: 3b 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20  ;.    p->aStack 
5510: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 0a  = sqliteMalloc(.
5520: 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b 2a 73          nStack*s
5530: 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b  izeof(p->aStack[
5540: 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61 63 6b  0])    /* aStack
5550: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67   */.      + nArg
5560: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20  *sizeof(Mem*)   
5570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
5580: 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Arg */.      + n
5590: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Var*sizeof(Mem) 
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
55b0: 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b   aVar */.      +
55c0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
55d0: 72 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r*)             
55e0: 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20  /* azVar */.    
55f0: 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28    + nMem*sizeof(
5600: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
5610: 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20     /* aMem */.  
5620: 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69      + nCursor*si
5630: 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 20 20  zeof(Cursor*)   
5640: 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f       /* apCsr */
5650: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
5660: 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61  !sqlite3MallocFa
5670: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 20 20  iled() ){.      
5680: 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53  p->aMem = &p->aS
5690: 74 61 63 6b 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20  tack[nStack];.  
56a0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
56b0: 65 6d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  em;.      p->aVa
56c0: 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65  r = &p->aMem[nMe
56d0: 6d 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61  m];.      p->nVa
56e0: 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20  r = nVar;.      
56f0: 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20  p->okVar = 0;.  
5700: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28      p->apArg = (
5710: 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e  Mem**)&p->aVar[n
5720: 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Var];.      p->a
5730: 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26  zVar = (char**)&
5740: 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a  p->apArg[nArg];.
5750: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d        p->apCsr =
5760: 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61   (Cursor**)&p->a
5770: 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  zVar[nVar];.    
5780: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
5790: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f  Cursor;.      fo
57a0: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
57b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
57c0: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
57d0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
57e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
57f0: 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d  r(n=0; n<p->nMem
5800: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; n++){.    p->a
5810: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
5820: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 23 69  EM_Null;.  }..#i
5830: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5840: 47 0a 20 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e  G.  if( (p->db->
5850: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
5860: 64 62 65 4c 69 73 74 69 6e 67 29 21 3d 30 0a 20  dbeListing)!=0. 
5870: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4f 73 46     || sqlite3OsF
5880: 69 6c 65 45 78 69 73 74 73 28 22 76 64 62 65 5f  ileExists("vdbe_
5890: 65 78 70 6c 61 69 6e 22 29 0a 20 20 29 7b 0a 20  explain").  ){. 
58a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 72     int i;.    pr
58b0: 69 6e 74 66 28 22 56 44 42 45 20 50 72 6f 67 72  intf("VDBE Progr
58c0: 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e 22 29 3b  am Listing:\n");
58d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
58e0: 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20  PrintSql(p);.   
58f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5900: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
5910: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5920: 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 70  Op(stdout, i, &p
5930: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 7d  ->aOp[i]);.    }
5940: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5950: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22  e3OsFileExists("
5960: 76 64 62 65 5f 74 72 61 63 65 22 29 20 29 7b 0a  vdbe_trace") ){.
5970: 20 20 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 73      p->trace = s
5980: 74 64 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tdout;.  }.#endi
5990: 66 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70  f.  p->pTos = &p
59a0: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20  ->aStack[-1];.  
59b0: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
59c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
59d0: 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20  .  p->uniqueCnt 
59e0: 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e  = 0;.  p->return
59f0: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
5a00: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
5a10: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70  _Abort;.  p->pop
5a20: 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d  Stack =  0;.  p-
5a30: 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78  >explain |= isEx
5a40: 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69  plain;.  p->magi
5a50: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
5a60: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
5a70: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
5a80: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
5a90: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
5aa0: 20 3d 20 32 35 35 3b 0a 23 69 66 64 65 66 20 56   = 255;.#ifdef V
5ab0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
5ac0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
5ad0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
5ae0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
5af0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
5b00: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
5b10: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20  .cycles = 0;.   
5b20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
5b30: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
5b40: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
5b50: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
5b60: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
5b70: 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f  happens.** to ho
5b80: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
5b90: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
5ba0: 72 28 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  r(Cursor *pCx){.
5bb0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
5bc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5bd0: 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73    if( pCx->pCurs
5be0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
5bf0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
5c00: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
5c10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
5c20: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
5c30: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
5c40: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ->pBt);.  }.  sq
5c50: 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 70 44  liteFree(pCx->pD
5c60: 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ata);.  sqliteFr
5c70: 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 0a  ee(pCx->aType);.
5c80: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 78    sqliteFree(pCx
5c90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
5ca0: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a 2f  e all cursors.*/
5cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
5cc0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
5cd0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
5ce0: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d    if( p->apCsr==
5cf0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
5d00: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
5d10: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  sor; i++){.    s
5d20: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
5d30: 72 73 6f 72 28 70 2d 3e 61 70 43 73 72 5b 69 5d  rsor(p->apCsr[i]
5d40: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 5b  );.    p->apCsr[
5d50: 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = 0;.  }.}../
5d60: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
5d70: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
5d80: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
5d90: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
5da0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
5db0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
5dc0: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
5dd0: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
5de0: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
5df0: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
5e00: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
5e10: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
5e20: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
5e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
5e40: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
5e50: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
5e60: 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72  >aStack ){.    r
5e70: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
5e80: 2d 3e 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70  ->aStack, 1 + (p
5e90: 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61  ->pTos - p->aSta
5ea0: 63 6b 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f  ck));.    p->pTo
5eb0: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d  s = &p->aStack[-
5ec0: 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  1];.  }.  closeA
5ed0: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
5ee0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5ef0: 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
5f00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5f10: 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46  FifoClear(&p->sF
5f20: 69 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63  ifo);.  if( p->c
5f30: 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20  ontextStack ){. 
5f40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5f50: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
5f60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
5f70: 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65  lite3VdbeFifoCle
5f80: 61 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ar(&p->contextSt
5f90: 61 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20  ack[i].sFifo);. 
5fa0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
5fb0: 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ree(p->contextSt
5fc0: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ack);.  }.  p->c
5fd0: 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b  ontextStack = 0;
5fe0: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
5ff0: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  ckDepth = 0;.  p
6000: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
6010: 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46  p = 0;.  sqliteF
6020: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
6030: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
6040: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
6050: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
6060: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
6070: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
6080: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
6090: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
60a0: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
60b0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
60c0: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
60d0: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
60e0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
60f0: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
6100: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
6110: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
6120: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
6130: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
6140: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
6150: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6160: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
6170: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
6180: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
6190: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
61a0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
61b0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
61c0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
61d0: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
61e0: 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  Free(p->aColName
61f0: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
6200: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
6210: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
6220: 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70   nResColumn;.  p
6230: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
6240: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
6250: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6260: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
6270: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
6280: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
6290: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
62a0: 20 20 20 20 28 70 43 6f 6c 4e 61 6d 65 2b 2b 29      (pColName++)
62b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
62c0: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll;.  }.}../*.**
62d0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
62e0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
62f0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
6300: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
6310: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
6320: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
6330: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
6340: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
6350: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
6360: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
6370: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
6380: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
6390: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d  s()..**.** If N=
63a0: 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d  =P3_STATIC  it m
63b0: 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20  eans that zName 
63c0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
63d0: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
63e0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
63f0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
6400: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66   the pointer. If
6410: 20 69 74 20 69 73 20 50 33 5f 44 59 4e 41 4d 49   it is P3_DYNAMI
6420: 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20  C, then .** the 
6430: 73 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20  string is freed 
6440: 75 73 69 6e 67 20 73 71 6c 69 74 65 46 72 65 65  using sqliteFree
6450: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
6460: 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74   is finished wit
6470: 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69  h.** it. Otherwi
6480: 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a  se, N bytes of z
6490: 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e  Name are copied.
64a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
64b0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64  dbeSetColName(Vd
64c0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  be *p, int idx, 
64d0: 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63  int var, const c
64e0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
64f0: 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  N){.  int rc;.  
6500: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
6510: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
6520: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
6530: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
6540: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 73  AME_N );.  if( s
6550: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
6560: 65 64 28 29 20 29 20 72 65 74 75 72 6e 20 53 51  ed() ) return SQ
6570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73  LITE_NOMEM;.  as
6580: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
6590: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
65a0: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
65b0: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
65c0: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66  esColumn]);.  if
65d0: 28 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20  ( N==P3_DYNAMIC 
65e0: 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20  || N==P3_STATIC 
65f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
6600: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
6610: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
6620: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
6630: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
6640: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6650: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
6660: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
6670: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51  me, zName, N, SQ
6680: 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
6690: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
66a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
66b0: 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59  E_OK && N==P3_DY
66c0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f  NAMIC ){.    pCo
66d0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28  lName->flags = (
66e0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
66f0: 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d  (~MEM_Static))|M
6700: 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c  EM_Dyn;.    pCol
6710: 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  Name->xDel = 0;.
6720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
6740: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
6750: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
6760: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
6770: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
6780: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
6790: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
67a0: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
67b0: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
67c0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
67d0: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
67e0: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
67f0: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
6800: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
6810: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
6820: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
6830: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
6840: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
6850: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6860: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
6870: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
6880: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
6890: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
68a0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
68b0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
68c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
68d0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
68e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
68f0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
6900: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6910: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6920: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6930: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6940: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
6950: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
6960: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
6970: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
6980: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
6990: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
69a0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
69b0: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
69c0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
69d0: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
69e0: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
69f0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
6a00: 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79     sqlite3Safety
6a10: 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20  Off(db);.    rc 
6a20: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
6a30: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
6a40: 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  tArg);.    sqlit
6a50: 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a  e3SafetyOn(db);.
6a60: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
6a70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6a80: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
6a90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
6aa0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
6ab0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
6ac0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
6ad0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
6ae0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
6af0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
6b00: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
6b10: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
6b20: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
6b30: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
6b40: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
6b50: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
6b60: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
6b70: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
6b80: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
6b90: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
6ba0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6bb0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20  se is :memory:. 
6bc0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   In that case we
6bd0: 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70   do.  ** not sup
6be0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
6bf0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
6c00: 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c  so use the simpl
6c10: 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a  e case then.  **
6c20: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
6c30: 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74   0==strlen(sqlit
6c40: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
6c50: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
6c60: 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  t)) || nTrans<=1
6c70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6c80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c90: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
6ca0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
6cb0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
6cc0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
6cd0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
6ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6cf0: 65 53 79 6e 63 28 70 42 74 2c 20 30 29 3b 0a 20  eSync(pBt, 0);. 
6d00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6d10: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
6d20: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
6d30: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
6d40: 66 75 6c 6c 79 20 73 79 6e 63 65 64 20 2a 2f 0a  fully synced */.
6d50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6d60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
6d70: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
6d80: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; i++){.       
6d90: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6da0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6db0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
6dc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6dd0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42  e3BtreeCommit(pB
6de0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
6df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6e00: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
6e10: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
6e20: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
6e30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6e40: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
6e50: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
6e60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6e70: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
6e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
6e90: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
6ea0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
6eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6ec0: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
6ed0: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
6ee0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
6ef0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
6f00: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
6f10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6f20: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
6f30: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
6f40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
6f50: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
6f60: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 4f  b[0].pBt);.    O
6f70: 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20  sFile *master = 
6f80: 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  0;..    /* Selec
6f90: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
6fa0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
6fb0: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
6fc0: 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  32 random;.     
6fd0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
6fe0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
6ff0: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
7000: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
7010: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
7020: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
7030: 50 72 69 6e 74 66 28 22 25 73 2d 6d 6a 25 30 38  Printf("%s-mj%08
7040: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72  X", zMainFile, r
7050: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
7060: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
7070: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
7080: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7090: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
70a0: 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65    }while( sqlite
70b0: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d  3OsFileExists(zM
70c0: 61 73 74 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f  aster) );..    /
70d0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
70e0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
70f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7100: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d  OpenExclusive(zM
7110: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20  aster, &master, 
7120: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
7130: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7140: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
7150: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
7160: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
7170: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
7180: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
7190: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
71a0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
71b0: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
71c0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
71d0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
71e0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
71f0: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
7200: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
7210: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
7220: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
7230: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
7240: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
7250: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
7260: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
7270: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
7280: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
7290: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
72a0: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
72b0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
72c0: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
72d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
72e0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
72f0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
7300: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7310: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
7320: 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67  ontinue;   /* Ig
7330: 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  nore the TEMP da
7340: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
7350: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
7360: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
7370: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
7380: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
7390: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
73a0: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
73b0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
73c0: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
73d0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
73e0: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
73f0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
7400: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
7410: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
7420: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
7430: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
7440: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
7450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7460: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7470: 69 74 65 28 6d 61 73 74 65 72 2c 20 7a 46 69 6c  ite(master, zFil
7480: 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  e, strlen(zFile)
7490: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
74a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
74c0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
74d0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
74e0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
74f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
7500: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
7510: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
7520: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7540: 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79     }...    /* Sy
7550: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
7560: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f  urnal file. Befo
7570: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f  re doing this, o
7580: 70 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  pen the director
7590: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73  y.    ** the mas
75a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
75b0: 20 69 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20   is store in so 
75c0: 74 68 61 74 20 69 74 20 67 65 74 73 20 73 79 6e  that it gets syn
75d0: 63 65 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ced too..    */.
75e0: 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20      zMainFile = 
75f0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
7600: 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  irname(db->aDb[0
7610: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  ].pBt);.    rc =
7620: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
7630: 72 65 63 74 6f 72 79 28 6d 61 73 74 65 72 2c 20  rectory(master, 
7640: 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
7650: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7660: 4b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  K ||.          (
7670: 6e 65 65 64 53 79 6e 63 20 26 26 20 28 72 63 3d  needSync && (rc=
7680: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 6d 61  sqlite3OsSync(ma
7690: 73 74 65 72 2c 30 29 29 21 3d 53 51 4c 49 54 45  ster,0))!=SQLITE
76a0: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71  _OK) ){.      sq
76b0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
76c0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
76d0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
76e0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
76f0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
7700: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
7710: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
7720: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
7730: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
7740: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
7750: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
7760: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
7770: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7780: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
7790: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
77a0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
77b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
77c0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
77d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
77e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
77f0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
7800: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
7810: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
7820: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
7830: 72 65 65 53 79 6e 63 28 29 2c 0a 20 20 20 20 2a  reeSync(),.    *
7840: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
7850: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
7860: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7870: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20   file will be.  
7880: 20 20 2a 2a 20 6f 72 70 68 61 6e 65 64 2e 20 42    ** orphaned. B
7890: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
78a0: 65 74 65 20 69 74 2c 20 69 6e 20 63 61 73 65 20  ete it, in case 
78b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
78c0: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6e  al.    ** file n
78d0: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
78e0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
78f0: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
7900: 20 66 61 69 6c 75 72 65 0a 20 20 20 20 2a 2a 20   failure.    ** 
7910: 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  occured..    */.
7920: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
7930: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
7940: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
7950: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7960: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
7970: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
7980: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
7990: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79a0: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 70  lite3BtreeSync(p
79b0: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
79c0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
79d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
79e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
79f0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
7a00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
7a10: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
7a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
7a30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7a40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
7a50: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
7a60: 73 74 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  ster);..    /* D
7a70: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
7a80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
7a90: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
7aa0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
7ab0: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
7ac0: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
7ad0: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
7ae0: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
7af0: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
7b00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
7b10: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
7b20: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
7b30: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
7b40: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
7b50: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
7b60: 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OK );.    sqlite
7b70: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
7b80: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
7b90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7ba0: 4f 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28  OsSyncDirectory(
7bb0: 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
7bc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7bd0: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  K ){.      /* Th
7be0: 69 73 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e 20  is is not good. 
7bf0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
7c00: 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
7c10: 20 64 65 6c 65 74 65 64 2c 20 62 75 74 0a 20 20   deleted, but.  
7c20: 20 20 20 20 2a 2a 20 74 68 65 20 64 69 72 65 63      ** the direc
7c30: 74 6f 72 79 20 73 79 6e 63 20 66 61 69 6c 65 64  tory sync failed
7c40: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  . There is no co
7c50: 6d 70 6c 65 74 65 6c 79 20 73 61 66 65 20 63 6f  mpletely safe co
7c60: 75 72 73 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  urse of.      **
7c70: 20 61 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65 72   action from her
7c80: 65 2e 20 54 68 65 20 69 6e 64 69 76 69 64 75 61  e. The individua
7c90: 6c 20 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74 61  l journals conta
7ca0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  in the name of t
7cb0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74  he.      ** mast
7cc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
7cd0: 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   but there is no
7ce0: 20 77 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20   way of knowing 
7cf0: 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  if that.      **
7d00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7d10: 65 78 69 73 74 73 20 6e 6f 77 20 6f 72 20 69 66  exists now or if
7d20: 20 69 74 20 77 69 6c 6c 20 65 78 69 73 74 20 61   it will exist a
7d30: 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
7d40: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 73 79 73 74  ng.      ** syst
7d50: 65 6d 20 63 72 61 73 68 20 74 68 61 74 20 6d 61  em crash that ma
7d60: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73 79  y follow the fsy
7d70: 6e 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  nc() failure..  
7d80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
7d90: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
7da0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
7db0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
7dc0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
7dd0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
7de0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
7df0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
7e00: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20  e3BtreeCommit() 
7e10: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
7e20: 20 66 69 6c 65 73 20 61 6e 64 20 64 65 6c 65 74   files and delet
7e30: 69 6e 67 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  ing.    ** journ
7e40: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
7e50: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
7e60: 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
7e70: 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 0a 20 20  ning we don't.  
7e80: 20 20 2a 2a 20 72 65 61 6c 6c 79 20 63 61 72 65    ** really care
7e90: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
7ea0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
7eb0: 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
7ec0: 61 72 61 6e 74 65 65 64 2c 0a 20 20 20 20 2a 2a  aranteed,.    **
7ed0: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
7ee0: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 20  'cold' journals 
7ef0: 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
7f00: 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
7f10: 6e 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  n.    ** error c
7f20: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
7f30: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
7f40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
7f50: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
7f60: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
7f70: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7f80: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
7f90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7fa0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74  3BtreeCommit(pBt
7fb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7fc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
7fd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7fe0: 2a 2a 20 46 69 6e 64 20 65 76 65 72 79 20 61 63  ** Find every ac
7ff0: 74 69 76 65 20 56 4d 20 6f 74 68 65 72 20 74 68  tive VM other th
8000: 61 6e 20 70 56 64 62 65 20 61 6e 64 20 63 68 61  an pVdbe and cha
8010: 6e 67 65 20 69 74 73 20 73 74 61 74 75 73 20 74  nge its status t
8020: 6f 0a 2a 2a 20 61 62 6f 72 74 65 64 2e 20 20 54  o.** aborted.  T
8030: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
8040: 20 6f 6e 65 20 56 4d 20 63 61 75 73 65 73 20 61   one VM causes a
8050: 20 72 6f 6c 6c 62 61 63 6b 20 64 75 65 20 74 6f   rollback due to
8060: 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49   an.** ON CONFLI
8070: 43 54 20 52 4f 4c 4c 42 41 43 4b 20 63 6c 61 75  CT ROLLBACK clau
8080: 73 65 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  se (for example)
8090: 2e 20 20 54 68 65 20 6f 74 68 65 72 20 56 4d 73  .  The other VMs
80a0: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61 62 6f 72   must be.** abor
80b0: 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 79  ted so that they
80c0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 64 61 74   do not have dat
80d0: 61 20 72 6f 6c 6c 65 64 20 6f 75 74 20 66 72 6f  a rolled out fro
80e0: 6d 20 75 6e 64 65 72 6e 65 61 74 68 0a 2a 2a 20  m underneath.** 
80f0: 74 68 65 6d 20 6c 65 61 64 69 6e 67 20 74 6f 20  them leading to 
8100: 61 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76  a segfault..*/.v
8110: 6f 69 64 20 73 71 6c 69 74 65 33 41 62 6f 72 74  oid sqlite3Abort
8120: 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73  OtherActiveVdbes
8130: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
8140: 62 65 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  be *pExcept){.  
8150: 56 64 62 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20  Vdbe *pOther;.  
8160: 66 6f 72 28 70 4f 74 68 65 72 3d 64 62 2d 3e 70  for(pOther=db->p
8170: 56 64 62 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f  Vdbe; pOther; pO
8180: 74 68 65 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65  ther=pOther->pNe
8190: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 74  xt){.    if( pOt
81a0: 68 65 72 3d 3d 70 45 78 63 65 70 74 20 29 20 63  her==pExcept ) c
81b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
81c0: 20 70 4f 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d   pOther->magic!=
81d0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
81e0: 7c 20 70 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29  | pOther->pc<0 )
81f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63   continue;.    c
8200: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
8210: 4f 74 68 65 72 29 3b 0a 20 20 20 20 70 4f 74 68  Other);.    pOth
8220: 65 72 2d 3e 61 62 6f 72 74 65 64 20 3d 20 31 3b  er->aborted = 1;
8230: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  .  }.}../* .** T
8240: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
8250: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
8260: 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e  te3.activeVdbeCn
8270: 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  t count variable
8280: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
8290: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
82a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
82b0: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
82c0: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
82d0: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
82e0: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
82f0: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
8300: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
8310: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
8320: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
8330: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
8340: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
8350: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
8360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
8370: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
8380: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
8390: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
83a0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
83b0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
83c0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
83d0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
83e0: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
83f0: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
8400: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
8410: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
8420: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
8430: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
8440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
8450: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
8460: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
8470: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
8480: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
8490: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
84a0: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
84b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
84c0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
84d0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
84e0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
84f0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
8500: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
8510: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
8520: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
8530: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
8540: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
8550: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
8560: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
8570: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
8580: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
8590: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
85a0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
85b0: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
85c0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
85d0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
85e0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
85f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
8600: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
8610: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
8620: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
8630: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
8640: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8650: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
8660: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
8670: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
8680: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
8690: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
86a0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
86b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
86c0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
86d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
86e0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
86f0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74   int (*xFunc)(Bt
8700: 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20  ree *pBt) = 0;  
8710: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
8720: 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65  all on each btre
8730: 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69  e backend */.  i
8740: 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
8750: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
8760: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
8770: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
8780: 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54  IOERR */..  /* T
8790: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
87a0: 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
87b0: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
87c0: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
87d0: 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
87e0: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
87f0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
8800: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
8810: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
8820: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
8830: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
8840: 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 65 63 69 61    **.  ** Specia
8850: 6c 20 65 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20  l errors:.  **. 
8860: 20 2a 2a 20 20 20 20 20 49 66 20 61 6e 20 53 51   **     If an SQ
8870: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f 72  LITE_NOMEM error
8880: 20 68 61 73 20 6f 63 63 75 72 65 64 20 69 6e 20   has occured in 
8890: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  a statement that
88a0: 20 77 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20   writes to.  ** 
88b0: 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65      the database
88c0: 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 61 20  , then either a 
88d0: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61  statement or tra
88e0: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
88f0: 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 20 20 20   rolled.  **    
8900: 20 62 61 63 6b 20 74 6f 20 65 6e 73 75 72 65 20   back to ensure 
8910: 74 68 65 20 74 72 65 65 2d 73 74 72 75 63 74 75  the tree-structu
8920: 72 65 73 20 61 72 65 20 69 6e 20 61 20 63 6f 6e  res are in a con
8930: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 20 41  sistent state. A
8940: 0a 20 20 2a 2a 20 20 20 20 20 73 74 61 74 65 6d  .  **     statem
8950: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
8960: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  is rolled back i
8970: 66 20 6f 6e 65 20 69 73 20 6f 70 65 6e 2c 20 6f  f one is open, o
8980: 74 68 65 72 77 69 73 65 20 74 68 65 0a 20 20 2a  therwise the.  *
8990: 2a 20 20 20 20 20 65 6e 74 69 72 65 20 74 72 61  *     entire tra
89a0: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
89b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
89c0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20 61  **.  **     If a
89d0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 65  n SQLITE_IOERR e
89e0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
89f0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
8a00: 74 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a 20  that writes to. 
8a10: 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74 61   **     the data
8a20: 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65  base, then the e
8a30: 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
8a40: 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
8a50: 20 62 61 63 6b 2e 20 54 68 65 0a 20 20 2a 2a 20   back. The.  ** 
8a60: 20 20 20 20 49 2f 4f 20 65 72 72 6f 72 20 6d 61      I/O error ma
8a70: 79 20 68 61 76 65 20 63 61 75 73 65 64 20 67 61  y have caused ga
8a80: 72 62 61 67 65 20 74 6f 20 62 65 20 77 72 69 74  rbage to be writ
8a90: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
8aa0: 61 6c 20 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c  al .  **     fil
8ab0: 65 2e 20 57 65 72 65 20 74 68 65 20 74 72 61 6e  e. Were the tran
8ac0: 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69  saction to conti
8ad0: 6e 75 65 20 61 6e 64 20 65 76 65 6e 74 75 61 6c  nue and eventual
8ae0: 6c 79 20 62 65 20 72 6f 6c 6c 65 64 20 0a 20 20  ly be rolled .  
8af0: 2a 2a 20 20 20 20 20 62 61 63 6b 20 74 68 61 74  **     back that
8b00: 20 67 61 72 62 61 67 65 20 6d 69 67 68 74 20 65   garbage might e
8b10: 6e 64 20 75 70 20 69 6e 20 74 68 65 20 64 61 74  nd up in the dat
8b20: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
8b30: 20 20 20 20 20 0a 20 20 2a 2a 20 20 20 20 20 49       .  **     I
8b40: 6e 20 62 6f 74 68 20 6f 66 20 74 68 65 20 61 62  n both of the ab
8b50: 6f 76 65 20 63 61 73 65 73 2c 20 74 68 65 20 56  ove cases, the V
8b60: 64 62 65 2e 65 72 72 6f 72 41 63 74 69 6f 6e 20  dbe.errorAction 
8b70: 76 61 72 69 61 62 6c 65 20 69 73 20 0a 20 20 2a  variable is .  *
8b80: 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 20 49  *     ignored. I
8b90: 66 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 75  f the sqlite3.au
8ba0: 74 6f 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  toCommit flag is
8bb0: 20 66 61 6c 73 65 20 61 6e 64 20 61 20 74 72 61   false and a tra
8bc0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20  nsaction.  **   
8bd0: 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b    is rolled back
8be0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 73 65 74  , it will be set
8bf0: 20 74 6f 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20   to true..  **. 
8c00: 20 2a 2a 20 4f 74 68 65 72 20 65 72 72 6f 72 73   ** Other errors
8c10: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20 65  :.  **.  ** No e
8c20: 72 72 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rror:.  **.  */.
8c30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
8c40: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
8c50: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
8c60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
8c70: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
8c80: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
8c90: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 68      /* Already h
8ca0: 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20  alted.  Nothing 
8cb0: 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73  to do. */.    as
8cc0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
8cd0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
8ce0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
8cf0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
8d00: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
8d10: 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  );.  checkActive
8d20: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
8d30: 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
8d40: 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
8d50: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
8d60: 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
8d70: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
8d80: 7b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  {..    /* Check 
8d90: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
8da0: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2d 20  pecial errors - 
8db0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
8dc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 2a 2f 0a  SQLITE_IOERR */.
8dd0: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
8de0: 6f 72 20 3d 20 28 28 70 2d 3e 72 63 3d 3d 53 51  or = ((p->rc==SQ
8df0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 2d  LITE_NOMEM || p-
8e00: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc==SQLITE_IOER
8e10: 52 29 3f 31 3a 30 29 3b 0a 20 20 20 20 69 66 28  R)?1:0);.    if(
8e20: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
8e30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
8e40: 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69   loop does stati
8e50: 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68  c analysis of th
8e60: 65 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77  e query to see w
8e70: 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20  hich of the.    
8e80: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
8e90: 68 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20  hree categories 
8ea0: 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20  it falls into:. 
8eb0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
8ec0: 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20       Read-only. 
8ed0: 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72       **     Quer
8ee0: 79 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74  y with statement
8ef0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
8f00: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
8f10: 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  out statement jo
8f20: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20  urnal.      **. 
8f30: 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64       ** We could
8f40: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f   do something mo
8f50: 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20  re elegant than 
8f60: 74 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c  this static anal
8f70: 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20  ysis (i.e..     
8f80: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79   ** store the ty
8f90: 70 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70  pe of query as p
8fa0: 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c  art of the compl
8fb0: 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62  iation phase), b
8fc0: 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ut .      ** han
8fd0: 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f  dling malloc() o
8fe0: 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20  r IO failure is 
8ff0: 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65  a fairly obscure
9000: 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20   edge case so . 
9010: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
9020: 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e  probably easier.
9030: 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20   Todo: Might be 
9040: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
9050: 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20  o reduce .      
9060: 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76  ** code size a v
9070: 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74  ery small amount
9080: 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20   though....     
9090: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
90a0: 52 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  ReadOnly = 1;.  
90b0: 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d      int isStatem
90c0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ent = 0;.      a
90d0: 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20  ssert(p->aOp || 
90e0: 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20  p->nOp==0);.    
90f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
9100: 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nOp; i++){ .    
9110: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61      switch( p->a
9120: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a  Op[i].opcode ){.
9130: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
9140: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  P_Transaction:. 
9150: 20 20 20 20 20 20 20 20 20 20 20 69 73 52 65 61             isRea
9160: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
9170: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9180: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
9190: 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20  Statement:.     
91a0: 20 20 20 20 20 20 20 69 73 53 74 61 74 65 6d 65         isStateme
91b0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
91c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
91d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
91e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
91f0: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
9200: 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20  nly, we need do 
9210: 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61  no rollback at a
9220: 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ll. Otherwise,. 
9230: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20       ** proceed 
9240: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
9250: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
9260: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
9270: 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  sReadOnly ){.   
9280: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
9290: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
92a0: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
92b0: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
92c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
92d0: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
92e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92f0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
9300: 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
9310: 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
9320: 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
9330: 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
9340: 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
9350: 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
9360: 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
9370: 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
9380: 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
9390: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
93a0: 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74  te3AbortOtherAct
93b0: 69 76 65 56 64 62 65 73 28 64 62 2c 20 70 29 3b  iveVdbes(db, p);
93c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
93d0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
93e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
93f0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
9400: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9410: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
9420: 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
9430: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
9440: 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
9450: 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76 64  e only active vd
9460: 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  be, then.    ** 
9470: 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
9480: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
9490: 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
94a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
94b0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
94c0: 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
94d0: 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
94e0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
94f0: 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
9500: 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
9510: 63 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  ccured. .    */.
9520: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f      if( db->auto
9530: 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63  Commit && db->ac
9540: 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29  tiveVdbeCnt==1 )
9550: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
9560: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
9570: 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
9580: 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
9590: 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
95a0: 09 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d  ./* The auto-com
95b0: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
95c0: 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70  , and the vdbe p
95d0: 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20  rogram was .    
95e0: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
95f0: 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  l or hit an 'OR 
9600: 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
9610: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
9620: 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ommit .        *
9630: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  * is required.. 
9640: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9650: 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43    int rc = vdbeC
9660: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20  ommit(db);.     
9670: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9680: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
9690: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
96a0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
96b0: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
96c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
96d0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
96e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
96f0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
9700: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9710: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9720: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
9730: 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
9750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9760: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
9770: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
9780: 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e   }else if( !xFun
9790: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  c ){.      if( p
97a0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
97b0: 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
97c0: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
97d0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
97e0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
97f0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Stmt;.      }els
9800: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
9810: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
9820: 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20  {.        xFunc 
9830: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
9840: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
9850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9860: 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68   sqlite3AbortOth
9870: 65 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62  erActiveVdbes(db
9880: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , p);.        sq
9890: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
98a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
98b0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
98c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
98d0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
98e0: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
98f0: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
9900: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
9910: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
9920: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
9930: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
9940: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
9950: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
9960: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
9970: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
9980: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
9990: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
99a0: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
99b0: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
99c0: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
99d0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
99e0: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
99f0: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
9a00: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
9a10: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
9a20: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
9a30: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
9a40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
9a50: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
9a60: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
9a70: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
9a80: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
9a90: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
9aa0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
9ab0: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
9ac0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
9ad0: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
9ae0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
9af0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
9b00: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
9b10: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
9b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
9b30: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
9b40: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
9b50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9b60: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
9b70: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
9b80: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
9b90: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
9ba0: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
9bb0: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
9bc0: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
9bd0: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
9be0: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
9bf0: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
9c00: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
9c10: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
9c20: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
9c30: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
9c40: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
9c50: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
9c60: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
9c70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9c80: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
9c90: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
9ca0: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
9cb0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
9cc0: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
9cd0: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
9ce0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
9cf0: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
9d00: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
9d10: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
9d20: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
9d30: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
9d40: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
9d50: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
9d60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
9d70: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
9d80: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
9d90: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
9da0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  }.  }..  /* We h
9db0: 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
9dc0: 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
9dd0: 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
9de0: 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
9df0: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
9e00: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
9e10: 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a  eVdbeCnt--;.  }.
9e20: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
9e30: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
9e40: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
9e50: 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72  nt(db);..  retur
9e60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9e70: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
9e80: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
9e90: 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
9ea0: 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
9eb0: 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
9ec0: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
9ed0: 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
9ee0: 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
9ef0: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
9f00: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
9f10: 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
9f20: 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
9f30: 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
9f40: 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
9f50: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
9f60: 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
9f70: 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
9f80: 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
9f90: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
9fa0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
9fb0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
9fc0: 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
9fd0: 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
9fe0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
9ff0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
a000: 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
a010: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
a020: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
a030: 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  && p->magic!=VDB
a040: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
a050: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a060: 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d  (p->db, SQLITE_M
a070: 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 72  ISUSE, 0);.    r
a080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
a090: 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  USE;.  }..  /* I
a0a0: 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
a0b0: 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
a0c0: 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
a0d0: 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
a0e0: 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
a0f0: 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
a100: 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
a110: 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
a120: 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
a130: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
a140: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
a150: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
a160: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
a170: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
a180: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
a190: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
a1a0: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
a1b0: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
a1c0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
a1d0: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
a1e0: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
a1f0: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
a200: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
a210: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
a220: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
a230: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
a240: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
a250: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
a260: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
a270: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
a280: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
a290: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
a2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64        sqlite3* d
a2b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 20  b = p->db;.     
a2c0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
a2d0: 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
a2e0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
a2f0: 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
a300: 65 33 46 72 65 65 58 29 3b 0a 20 20 20 20 20 20  e3FreeX);.      
a310: 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d  db->errCode = p-
a320: 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  >rc;.      p->zE
a330: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
a340: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
a350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a360: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
a370: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
a380: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a390: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49  rror(p->db, SQLI
a3a0: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
a3b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a3c0: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
a3d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
a3e0: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
a3f0: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
a400: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
a410: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
a420: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
a430: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
a440: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
a450: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
a460: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
a470: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
a480: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
a490: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
a4a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70    sqlite3Error(p
a4b0: 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  ->db, p->rc, 0);
a4c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
a4d0: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
a4e0: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
a4f0: 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
a500: 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
a510: 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
a520: 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
a530: 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  E run..  */.  as
a540: 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70  sert( p->pTos<&p
a550: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30  ->aStack[p->pc<0
a560: 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d  ?0:p->pc] || !p-
a570: 3e 61 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65  >aStack );.#ifde
a580: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
a590: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
a5a0: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
a5b0: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
a5c0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
a5d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a5e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
a5f0: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
a600: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a610: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
a620: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
a630: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
a640: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
a650: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
a660: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
a670: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
a680: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
a690: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
a6a0: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
a6b0: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
a6c0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
a6d0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
a6e0: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
a6f0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
a700: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
a710: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
a720: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
a730: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
a740: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
a750: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
a760: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
a770: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
a780: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
a790: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
a7a0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
a7b0: 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d  ;.  p->aborted =
a7c0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
a7d0: 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29  =SQLITE_SCHEMA )
a7e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
a7f0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
a800: 28 70 2d 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  (p->db, 0);.  }.
a810: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
a820: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
a830: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
a840: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
a850: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
a860: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a870: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
a880: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
a890: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
a8a0: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
a8b0: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
a8c0: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
a8d0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
a8e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
a8f0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
a900: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
a910: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
a920: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
a930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
a940: 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 7d  dbeReset(p);.  }
a950: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69  else if( p->magi
a960: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
a970: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
a980: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
a990: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
a9a0: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
a9b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a9c0: 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
a9d0: 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
a9e0: 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
a9f0: 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
aa00: 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
aa10: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
aa20: 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
aa30: 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
aa40: 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
aa50: 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
aa60: 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
aa70: 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
aa80: 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
aa90: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
aaa0: 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
aab0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
aac0: 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
aad0: 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
aae0: 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
aaf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
ab00: 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
ab10: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
ab20: 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
ab30: 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
ab40: 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
ab50: 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31  >31 || !(mask&(1
ab60: 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
ab70: 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
ab80: 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
ab90: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
aba0: 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
abb0: 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
abc0: 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
abd0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
abe0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
abf0: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
ac00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
ac10: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
ac20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
ac30: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
ac40: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20    Cleanup(p);.  
ac50: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
ac60: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
ac70: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
ac80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
ac90: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
aca0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
acb0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
acc0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
acd0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
ace0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
acf0: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
ad00: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
ad10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
ad20: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
ad30: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e    Op *pOp = &p->
ad40: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72  aOp[i];.      fr
ad50: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
ad60: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  , pOp->p3);.    
ad70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
ad80: 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20  (p->aOp);.  }.  
ad90: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
ada0: 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
adb0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
adc0: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
add0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61  liteFree(p->aSta
ade0: 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ck);.  releaseMe
adf0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
ae00: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
ae10: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
ae20: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43  sqliteFree(p->aC
ae30: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 70 2d 3e 6d 61  olName);.  p->ma
ae40: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
ae50: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 46  _DEAD;.  sqliteF
ae60: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
ae70: 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
ae80: 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
ae90: 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
aea0: 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
aeb0: 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
aec0: 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  w.  Return an er
aed0: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f  ror code.  If no
aee0: 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69   MoveTo is pendi
aef0: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ng, this.** rout
af00: 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67  ine does nothing
af10: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
af20: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
af30: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
af40: 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70  Moveto(Cursor *p
af50: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
af60: 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
af70: 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 20    int res, rc;. 
af80: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
af90: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
afa0: 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
afb0: 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
afc0: 20 20 69 66 28 20 70 2d 3e 69 73 54 61 62 6c 65    if( p->isTable
afd0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
afe0: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
aff0: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
b000: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
b010: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , &res);.    }el
b020: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
b030: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
b040: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63 68  o(p->pCursor,(ch
b050: 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54 61  ar*)&p->movetoTa
b060: 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 20 20 20 73 69 7a 65 6f 66 28 69 36 34 29 2c      sizeof(i64),
b090: 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &res);.    }.   
b0a0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b0b0: 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e   rc;.    *p->pIn
b0c0: 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  crKey = 0;.    p
b0d0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65  ->lastRowid = ke
b0e0: 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f  yToInt(p->moveto
b0f0: 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e  Target);.    p->
b100: 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72  rowidIsValid = r
b110: 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72  es==0;.    if( r
b120: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  es<0 ){.      rc
b130: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
b140: 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
b150: 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
b160: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b170: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b180: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
b190: 2b 3b 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  +;.    p->deferr
b1a0: 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
b1b0: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
b1c0: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
b1d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b1e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b1f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
b200: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
b210: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
b220: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
b230: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
b240: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
b250: 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29  VdbeSerialRead()
b260: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
b270: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
b280: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57  lite3VdbeSerialW
b290: 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  rite().**.** enc
b2a0: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
b2b0: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
b2c0: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
b2d0: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
b2e0: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
b2f0: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
b300: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
b310: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
b320: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
b330: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
b340: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
b350: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
b360: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
b370: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
b380: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
b390: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
b3a0: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
b3b0: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
b3c0: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
b3d0: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
b3e0: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
b3f0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
b400: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
b410: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
b420: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
b430: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
b440: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
b450: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
b460: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
b470: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
b480: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
b490: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
b4a0: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
b4b0: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
b4c0: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
b4d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
b4e0: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
b4f0: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
b500: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
b510: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
b520: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
b530: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
b540: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
b550: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
b560: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
b570: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
b580: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
b590: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
b5a0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
b5b0: 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
b5c0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b5d0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
b5e0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
b5f0: 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
b620: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
b630: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
b640: 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
b650: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
b660: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
b690: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
b6a0: 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
b6d0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
b6e0: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
b6f0: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
b700: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
b710: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
b740: 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
b750: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
b760: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
b770: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
b780: 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
b790: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
b7a0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
b7b0: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
b7c0: 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
b7d0: 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
b800: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
b810: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
b820: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
b830: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
b840: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
b850: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
b860: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
b870: 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
b880: 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
b890: 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
b8a0: 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
b8b0: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
b8c0: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
b8d0: 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
b8e0: 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
b8f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
b900: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
b910: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
b920: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
b930: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
b940: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
b950: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
b960: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
b970: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
b980: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
b990: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
b9a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
b9b0: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
b9c0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
b9d0: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
b9e0: 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
b9f0: 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
ba00: 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
ba10: 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30  ((((i64)0x000010
ba20: 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
ba30: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b  i64 i = pMem->i;
ba40: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
ba50: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
ba60: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
ba70: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
ba80: 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  +i;.    }.    u 
ba90: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
baa0: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
bab0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
bac0: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
bad0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
bae0: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
baf0: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
bb00: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
bb10: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
bb20: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
bb30: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
bb40: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
bb50: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
bb60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
bb70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
bb80: 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  s&MEM_Str ){.   
bb90: 20 69 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e   int n = pMem->n
bba0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e  ;.    assert( n>
bbb0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
bbc0: 20 28 28 6e 2a 32 29 20 2b 20 31 33 29 3b 0a 20   ((n*2) + 13);. 
bbd0: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
bbe0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72  EM_Blob ){.    r
bbf0: 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32  eturn (pMem->n*2
bc00: 20 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65   + 12);.  }.  re
bc10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
bc20: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
bc30: 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
bc40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
bc50: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
bc60: 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74  ial-type..*/.int
bc70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
bc80: 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
bc90: 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
bca0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
bcb0: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
bcc0: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
bcd0: 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
bce0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
bcf0: 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
bd00: 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
bd10: 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
bd20: 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
bd30: 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
bd40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
bd50: 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
bd60: 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
bd70: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
bd80: 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
bd90: 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
bda0: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
bdb0: 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
bdc0: 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
bdd0: 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
bde0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
bdf0: 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  ytes written..*/
be00: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
be10: 65 53 65 72 69 61 6c 50 75 74 28 75 6e 73 69 67  eSerialPut(unsig
be20: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 4d  ned char *buf, M
be30: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
be40: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
be50: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
be60: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
be70: 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
be80: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20  _format);.  int 
be90: 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
bea0: 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
beb0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
bec0: 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
bed0: 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
bee0: 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  v;.    int i;.  
bef0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
bf00: 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 76 20  e==7 ){.      v 
bf10: 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e  = *(u64*)&pMem->
bf20: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
bf30: 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26      v = *(u64*)&
bf40: 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 7d 0a 20  pMem->i;.    }. 
bf50: 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
bf60: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
bf70: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
bf80: 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  e);.    while( i
bf90: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b  -- ){.      buf[
bfa0: 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20  i] = (v&0xFF);. 
bfb0: 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
bfc0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
bfd0: 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
bfe0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
bff0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
c000: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 6c 65 6e  e>=12 ){.    len
c010: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
c020: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
c030: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6d 65  al_type);.    me
c040: 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
c050: 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74  z, len);.    ret
c060: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
c070: 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
c080: 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
c090: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
c0a0: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
c0b0: 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
c0c0: 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
c0d0: 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
c0e0: 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
c0f0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
c100: 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
c110: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
c120: 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
c130: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
c140: 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
c150: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
c160: 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
c170: 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
c180: 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
c190: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1b0: 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
c1c0: 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
c1d0: 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1f0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
c200: 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
c210: 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
c220: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
c230: 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
c240: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
c250: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
c260: 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
c270: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
c280: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
c290: 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
c2a0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
c2b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c2c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c2d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
c2e0: 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
c2f0: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
c300: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28       pMem->i = (
c310: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
c320: 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
c330: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
c340: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
c350: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c360: 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
c370: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
c380: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  .      pMem->i =
c390: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
c3a0: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
c3b0: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[1];.      pMem
c3c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c3d0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
c3e0: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
c3f0: 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
c400: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
c410: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  */.      pMem->i
c420: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
c430: 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
c440: 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
c450: 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
c460: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
c470: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
c480: 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
c490: 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
c4a0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
c4b0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
c4c0: 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
c4d0: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
c4e0: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
c4f0: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
c500: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c510: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
c520: 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
c530: 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
c540: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
c550: 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
c560: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
c570: 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
c580: 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
c590: 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
c5a0: 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
c5b0: 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
c5c0: 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
c5d0: 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
c5e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  .      pMem->i =
c5f0: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
c600: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c610: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
c620: 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
c630: 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
c640: 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
c650: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
c660: 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
c670: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
c680: 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
c690: 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
c6a0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
c6b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
c6c0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
c6d0: 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
c6e0: 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
c6f0: 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
c700: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
c710: 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
c720: 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
c730: 2e 20 20 54 68 65 20 62 79 74 65 20 6f 72 64 65  .  The byte orde
c740: 72 20 64 69 66 66 65 72 73 20 6f 6e 20 73 6f 6d  r differs on som
c750: 65 20 28 62 72 6f 6b 65 6e 29 20 61 72 63 68 69  e (broken) archi
c760: 74 65 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20  tectures..      
c770: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
c780: 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
c790: 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
c7a0: 3c 3c 33 32 3b 0a 20 20 20 20 20 20 61 73 73 65  <<32;.      asse
c7b0: 72 74 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62 6c  rt( 1.0==*(doubl
c7c0: 65 2a 29 26 74 31 20 29 3b 0a 23 65 6e 64 69 66  e*)&t1 );.#endif
c7d0: 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
c7e0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
c7f0: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
c800: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
c810: 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
c820: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
c830: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
c840: 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
c850: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
c860: 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
c870: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
c880: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  .        pMem->i
c890: 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
c8a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c8b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
c8c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c8d0: 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f    pMem->r = *(do
c8e0: 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20 20  uble*)&x;.      
c8f0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c900: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
c910: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
c920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c930: 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
c940: 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
c950: 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
c960: 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
c970: 2d 3e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  ->i = serial_typ
c980: 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
c990: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
c9a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
c9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
c9c0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
c9d0: 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
c9e0: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
c9f0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
ca00: 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
ca10: 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
ca20: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
ca30: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
ca40: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
ca50: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
ca60: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
ca70: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
ca80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ca90: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
caa0: 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
cab0: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
cac0: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
cad0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
cae0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
caf0: 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 72 65  e header of a re
cb00: 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66  cord consists of
cb10: 20 61 20 73 65 71 75 65 6e 63 65 20 76 61 72 69   a sequence vari
cb20: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
cb30: 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20 69  gers..** These i
cb40: 6e 74 65 67 65 72 73 20 61 72 65 20 61 6c 6d 6f  ntegers are almo
cb50: 73 74 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c 20  st always small 
cb60: 61 6e 64 20 61 72 65 20 65 6e 63 6f 64 65 64 20  and are encoded 
cb70: 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  as a single byte
cb80: 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ..** The followi
cb90: 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  ng macro takes a
cba0: 64 76 61 6e 74 61 67 65 20 74 68 69 73 20 66 61  dvantage this fa
cbb0: 63 74 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ct to provide a 
cbc0: 66 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20 6f  fast decode.** o
cbd0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 69  f the integers i
cbe0: 6e 20 61 20 72 65 63 6f 72 64 20 68 65 61 64 65  n a record heade
cbf0: 72 2e 20 20 49 74 20 69 73 20 66 61 73 74 65 72  r.  It is faster
cc00: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
cc10: 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 74 68  case.** where th
cc20: 65 20 69 6e 74 65 67 65 72 20 69 73 20 61 20 73  e integer is a s
cc30: 69 6e 67 6c 65 20 62 79 74 65 2e 20 20 49 74 20  ingle byte.  It 
cc40: 69 73 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  is a little slow
cc50: 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 69  er when the.** i
cc60: 6e 74 65 67 65 72 20 69 73 20 74 77 6f 20 6f 72  nteger is two or
cc70: 20 6d 6f 72 65 20 62 79 74 65 73 2e 20 20 42 75   more bytes.  Bu
cc80: 74 20 6f 76 65 72 61 6c 6c 20 69 74 20 69 73 20  t overall it is 
cc90: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  faster..**.** Th
cca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
ccb0: 65 73 73 69 6f 6e 73 20 61 72 65 20 65 71 75 69  essions are equi
ccc0: 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  valent:.**.**   
ccd0: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74    x = sqlite3Get
cce0: 56 61 72 69 6e 74 33 32 28 20 41 2c 20 26 42 20  Varint32( A, &B 
ccf0: 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d  );.**.**     x =
cd00: 20 47 65 74 56 61 72 69 6e 74 28 20 41 2c 20 42   GetVarint( A, B
cd10: 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e   );.**.*/.#defin
cd20: 65 20 47 65 74 56 61 72 69 6e 74 28 41 2c 42 29  e GetVarint(A,B)
cd30: 20 20 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d 30    ((B = *(A))<=0
cd40: 78 37 66 20 3f 20 31 20 3a 20 73 71 6c 69 74 65  x7f ? 1 : sqlite
cd50: 33 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 20  3GetVarint32(A, 
cd60: 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  &B))../*.** This
cd70: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
cd80: 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
cd90: 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
cda0: 65 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 64  ecords specified
cdb0: 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20   by .** {nKey1, 
cdc0: 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79  pKey1} and {nKey
cdd0: 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72  2, pKey2}, retur
cde0: 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c  ning a negative,
cdf0: 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
ce00: 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
ce10: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69  {nKey1, pKey1} i
ce20: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
ce30: 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
ce40: 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32  ater than {nKey2
ce50: 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20  , pKey2}.  Both 
ce60: 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75  Key1 and Key2 mu
ce70: 73 74 20 62 65 20 62 79 74 65 20 73 74 72 69 6e  st be byte strin
ce80: 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62  gs.** composed b
ce90: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
cea0: 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
ceb0: 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73  e VDBE..*/.int s
cec0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
ced0: 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
cee0: 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74  *userData,.  int
cef0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
cf00: 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e  id *pKey1, .  in
cf10: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
cf20: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
cf30: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
cf40: 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73  o = (KeyInfo*)us
cf50: 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31  erData;.  u32 d1
cf60: 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f  , d2;          /
cf70: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
cf80: 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
cf90: 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
cfa0: 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20  32 idx1, idx2;  
cfb0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
cfc0: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
cfd0: 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
cfe0: 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
cff0: 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75  , szHdr2;  /* Nu
d000: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
d010: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
d020: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
d030: 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
d040: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
d050: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
d060: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
d070: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
d080: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
d090: 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20  d char *aKey2 = 
d0a0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
d0b0: 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20  char *)pKey2;.. 
d0c0: 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d   Mem mem1;.  Mem
d0d0: 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e   mem2;.  mem1.en
d0e0: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
d0f0: 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20  c;.  mem2.enc = 
d100: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
d110: 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56 61   .  idx1 = GetVa
d120: 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64  rint(aKey1, szHd
d130: 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
d140: 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74  r1;.  idx2 = Get
d150: 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a  Varint(aKey2, sz
d160: 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a  Hdr2);.  d2 = sz
d170: 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  Hdr2;.  nField =
d180: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
d190: 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
d1a0: 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c  <szHdr1 && idx2<
d1b0: 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33  szHdr2 ){.    u3
d1c0: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
d1d0: 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
d1e0: 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype2;..    /* Re
d1f0: 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
d200: 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
d210: 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
d220: 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
d230: 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20  1 += GetVarint( 
d240: 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
d250: 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
d260: 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
d270: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d280: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
d290: 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
d2a0: 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47  k;.    idx2 += G
d2b0: 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b  etVarint( aKey2+
d2c0: 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx2, serial_typ
d2d0: 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32  e2 );.    if( d2
d2e0: 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74  >=nKey2 && sqlit
d2f0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
d300: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32  Len(serial_type2
d310: 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
d320: 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
d330: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
d340: 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 65   space left in e
d350: 61 63 68 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ach key for the 
d360: 62 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64  blob of.    ** d
d370: 61 74 61 20 74 6f 20 67 6f 20 77 69 74 68 20 74  ata to go with t
d380: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6a  he serial type j
d390: 75 73 74 20 72 65 61 64 2e 20 54 68 69 73 20 61  ust read. This a
d3a0: 73 73 65 72 74 20 6d 61 79 20 66 61 69 6c 20 69  ssert may fail i
d3b0: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  f.    ** the fil
d3c0: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d3d0: 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 76   Then read the v
d3e0: 61 6c 75 65 20 66 72 6f 6d 20 65 61 63 68 20 6b  alue from each k
d3f0: 65 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20  ey into mem1.   
d400: 20 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65 73   ** and mem2 res
d410: 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a  pectively..    *
d420: 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
d430: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
d440: 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
d450: 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
d460: 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c  );.    d2 += sql
d470: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
d480: 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65  t(&aKey2[d2], se
d490: 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d  rial_type2, &mem
d4a0: 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  2);..    rc = sq
d4b0: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
d4c0: 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c  &mem1, &mem2, i<
d4d0: 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
d4e0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
d4f0: 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66  ;.    if( mem1.f
d500: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
d510: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
d520: 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20  elease(&mem1);. 
d530: 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67     if( mem2.flag
d540: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71  s & MEM_Dyn ) sq
d550: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
d560: 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20  ase(&mem2);.    
d570: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
d580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d590: 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
d5a0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65  /* One of the ke
d5b0: 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
d5c0: 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68  elds, but all th
d5d0: 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
d5e0: 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77  hat point.  ** w
d5f0: 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
d600: 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69  e incrKey flag i
d610: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
d620: 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20   second key is. 
d630: 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c   ** treated as l
d640: 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  arger..  */.  if
d650: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
d660: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63  f( pKeyInfo->inc
d670: 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  rKey ){.      rc
d680: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
d690: 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b   if( d1<nKey1 ){
d6a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
d6b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c     }else if( d2<
d6c0: 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20 72  nKey2 ){.      r
d6d0: 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  c = -1;.    }.  
d6e0: 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
d6f0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
d700: 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  & i<pKeyInfo->nF
d710: 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20  ield.           
d720: 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d      && pKeyInfo-
d730: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
d740: 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a  {.    rc = -rc;.
d750: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
d760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
d770: 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e  rgument is an in
d780: 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73  dex entry compos
d790: 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
d7a0: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
d7b0: 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65  e..** The last e
d7c0: 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63  ntry in this rec
d7d0: 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  ord should be an
d7e0: 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66   integer (specif
d7f0: 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74  ically.** an int
d800: 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68  eger rowid).  Th
d810: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
d820: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
d830: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61   bytes in.** tha
d840: 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e  t integer..*/.in
d850: 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
d860: 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75  RowidLen(const u
d870: 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
d880: 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
d890: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
d8a0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
d8b0: 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
d8c0: 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
d8d0: 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c   rowid */..  sql
d8e0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
d8f0: 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20  aKey, &szHdr);. 
d900: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
d910: 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d  t32(&aKey[szHdr-
d920: 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b  1], &typeRowid);
d930: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
d940: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
d950: 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d  en(typeRowid);.}
d960: 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  .  ../*.** pCur 
d970: 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
d980: 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
d990: 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
d9a0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
d9b0: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
d9c0: 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
d9d0: 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
d9e0: 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
d9f0: 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
da00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
da10: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
da20: 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
da30: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
da40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
da50: 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73  eIdxRowid(BtCurs
da60: 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
da70: 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
da80: 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b  llKey;.  int rc;
da90: 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
daa0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
dab0: 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
dac0: 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
dad0: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
dae0: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
daf0: 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
db00: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
db10: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
db20: 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
db30: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
db40: 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
db50: 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
db60: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
db70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
db80: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
db90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
dba0: 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
dbb0: 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
dbc0: 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
dbd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
dbe0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74    }.  sqlite3Get
dbf0: 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
dc00: 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71  z, &szHdr);.  sq
dc10: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
dc20: 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
dc30: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
dc40: 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  ;.  lenRowid = s
dc50: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
dc60: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
dc70: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
dc80: 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
dc90: 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
dca0: 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
dcb0: 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
dcc0: 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
dcd0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
dce0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dcf0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
dd00: 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
dd10: 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
dd20: 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
dd30: 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69  is point to agai
dd40: 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
dd50: 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f  tring in pKey (o
dd60: 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20  f length nKey). 
dd70: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
dd80: 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
dd90: 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
dda0: 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
ddb0: 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
ddc0: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
ddd0: 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
dde0: 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e  an pKey.  Return
ddf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
de00: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65  ccess..**.** pKe
de10: 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  y is either crea
de20: 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
de30: 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
de40: 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
de50: 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
de60: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
de70: 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
de80: 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
de90: 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
dea0: 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ored as well..*/
deb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
dec0: 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
ded0: 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20   Cursor *pC,    
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
def0: 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
df00: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
df10: 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
df20: 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f  st u8 *pKey,   /
df30: 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d  * The key to com
df40: 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  pare */.  int *r
df50: 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
df60: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
df70: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
df80: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
df90: 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
dfa0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
dfb0: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
dfc0: 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  >pCursor;.  int 
dfd0: 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20  lenRowid;.  Mem 
dfe0: 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
dff0: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
e000: 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66  &nCellKey);.  if
e010: 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b  ( nCellKey<=0 ){
e020: 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
e030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e040: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
e050: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
e060: 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
e070: 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  sor, 0, nCellKey
e080: 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
e090: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
e0a0: 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f   rc;.  }.  lenRo
e0b0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
e0c0: 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38  eIdxRowidLen((u8
e0d0: 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d  *)m.z);.  *res =
e0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
e0f0: 72 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b  rdCompare(pC->pK
e100: 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52  eyInfo, m.n-lenR
e110: 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c  owid, m.z, nKey,
e120: 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65   pKey);.  sqlite
e130: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
e140: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
e150: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e160: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
e170: 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
e180: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
e190: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
e1a0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
e1b0: 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
e1c0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
e1d0: 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
e1e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
e1f0: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
e200: 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
e210: 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
e220: 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
e230: 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
e240: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
e250: 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
e260: 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
e270: 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
e280: 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
e290: 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
e2a0: 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
e2b0: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
e2c0: 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
e2d0: 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
e2e0: 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
e2f0: 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
e300: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
e310: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
e320: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e330: 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
e340: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
e350: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
e360: 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
e370: 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
e380: 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
e390: 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
e3a0: 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
e3b0: 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
e3c0: 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
e3d0: 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
e3e0: 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
e3f0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
e400: 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
e410: 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
e420: 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
e430: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
e440: 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
e450: 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
e460: 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
e470: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
e480: 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
e490: 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
e4a0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
e4b0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
e4c0: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
e4d0: 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
e4e0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
e4f0: 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
e500: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
e510: 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
e520: 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
e530: 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
e540: 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
e550: 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
e560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
e570: 62 3b 0a 7d 0a                                   b;.}.