/ Hex Artifact Content
Login

Artifact 8d5726935c2e3c3a1c8b17caaaa5a03a470de6ff:


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 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
0ba0: 2c 20 69 2b 31 29 3b 0a 20 20 69 66 28 20 73 71  , i+1);.  if( sq
0bb0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
0bc0: 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d() ){.    retur
0bd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  n 0;.  }.  pOp =
0be0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
0bf0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b  Op->opcode = op;
0c00: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0c10: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0c20: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a  .  pOp->p3 = 0;.
0c30: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
0c40: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d  P3_NOTUSED;.  p-
0c50: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69  >expired = 0;.#i
0c60: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0c70: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  G.  if( sqlite3_
0c80: 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65  vdbe_addop_trace
0c90: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72   ) sqlite3VdbePr
0ca0: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
0cb0: 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a  aOp[i]);.#endif.
0cc0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
0cd0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
0ce0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
0cf0: 20 74 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a   the p3 value..*
0d00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0d10: 65 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  eOp3(Vdbe *p, in
0d20: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0d30: 74 20 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72  t p2, const char
0d40: 20 2a 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65   *zP3,int p3type
0d50: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
0d60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0d70: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b  (p, op, p1, p2);
0d80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
0d90: 61 6e 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20  angeP3(p, addr, 
0da0: 7a 50 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20  zP3, p3type);.  
0db0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
0dc0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
0dd0: 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  ew symbolic labe
0de0: 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63  l for an instruc
0df0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65  tion that has ye
0e00: 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64  t to be.** coded
0e10: 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20  .  The symbolic 
0e20: 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20  label is really 
0e30: 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20  just a negative 
0e40: 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20  number.  The.** 
0e50: 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65  label can be use
0e60: 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75  d as the P2 valu
0e70: 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  e of an operatio
0e80: 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a  n.  Later, when.
0e90: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20  ** the label is 
0ea0: 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70  resolved to a sp
0eb0: 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20  ecific address, 
0ec0: 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63  the VDBE will sc
0ed0: 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74  an.** through it
0ee0: 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74  s operation list
0ef0: 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20   and change all 
0f00: 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69  values of P2 whi
0f10: 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20  ch match.** the 
0f20: 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72  label into the r
0f30: 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e  esolved address.
0f40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
0f50: 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20  knows that a P2 
0f60: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
0f70: 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20   because labels 
0f80: 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65  are.** always ne
0f90: 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61  gative and P2 va
0fa0: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
0fb0: 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74   to be non-negat
0fc0: 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  ive..** Hence, a
0fd0: 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c   negative P2 val
0fe0: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68  ue is a label th
0ff0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1000: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a   resolved..**.**
1010: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
1020: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  d if a malloc() 
1030: 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fails..*/.int sq
1040: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1050: 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  el(Vdbe *p){.  i
1060: 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  nt i;.  i = p->n
1070: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
1080: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1090: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
10a0: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62    if( i>=p->nLab
10b0: 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70  elAlloc ){.    p
10c0: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20  ->nLabelAlloc = 
10d0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32  p->nLabelAlloc*2
10e0: 20 2b 20 31 30 3b 0a 20 20 20 20 73 71 6c 69 74   + 10;.    sqlit
10f0: 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28  eReallocOrFree((
1100: 76 6f 69 64 2a 2a 29 26 70 2d 3e 61 4c 61 62 65  void**)&p->aLabe
1110: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1130: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
1140: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1150: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1160: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1170: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
1180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1190: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
11a0: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
11b0: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
11c0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
11d0: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
11e0: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
11f0: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1200: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1210: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1220: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1230: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1240: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
1250: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1260: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
1270: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
1280: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
1290: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
12a0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
12b0: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
12c0: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
12d0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
12e0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
12f0: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1300: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1310: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1320: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1330: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
1340: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
1350: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
1360: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
1370: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
1380: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
1390: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
13a0: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
13b0: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
13c0: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
13d0: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
13e0: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
13f0: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
1400: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
1410: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1420: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1430: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
1440: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
1450: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
1460: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
1470: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
1480: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
1490: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
14a0: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
14b0: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
14c0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
14d0: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
14e0: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
14f0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
1500: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
1510: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1520: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1530: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1540: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
1550: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
1560: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
1570: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
1580: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
1590: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
15a0: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
15b0: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
15c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
15d0: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
15e0: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
15f0: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
1600: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
1610: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1620: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1630: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1640: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1650: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1660: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1670: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
1680: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
1690: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
16a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
16b0: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
16c0: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
16d0: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
16e0: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
16f0: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
1700: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
1710: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1720: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1730: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1740: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1750: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1760: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1770: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
1780: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
1790: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
17a0: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 28 28 75  SH_MASK_0 + (((u
17b0: 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d  nsigned)NOPUSH_M
17c0: 41 53 4b 5f 31 29 3c 3c 31 36 29 2c 0a 20 20 20  ASK_1)<<16),.   
17d0: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20 2b   NOPUSH_MASK_2 +
17e0: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
17f0: 55 53 48 5f 4d 41 53 4b 5f 33 29 3c 3c 31 36 29  USH_MASK_3)<<16)
1800: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1810: 4b 5f 34 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_4 + (((unsigne
1820: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 29  d)NOPUSH_MASK_5)
1830: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1840: 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 28 28 75 6e  H_MASK_6 + (((un
1850: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1860: 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_7)<<16),.    
1870: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1880: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1890: 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c 31 36 29 0a  SH_MASK_9)<<16).
18a0: 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f    };.  assert( o
18b0: 70 3c 33 32 2a 35 20 29 3b 0a 20 20 72 65 74 75  p<32*5 );.  retu
18c0: 72 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d  rn (masks[op>>5]
18d0: 20 26 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29   & (1<<(op&0x1F)
18e0: 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ));.}..#ifndef N
18f0: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1900: 33 56 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73  3VdbeOpcodeNoPus
1910: 68 28 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75  h(u8 op){.  retu
1920: 72 6e 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28  rn opcodeNoPush(
1930: 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  op);.}.#endif../
1940: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
1950: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
1960: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
1970: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
1980: 61 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73  ative..** Each s
1990: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
19a0: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
19b0: 68 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  he label by sett
19c0: 69 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61  ing the P2.** va
19d0: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
19e0: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
19f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1a00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1a10: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
1a20: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
1a30: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
1a40: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1a50: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1a60: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1a70: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1a80: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1a90: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 20   OP_Function or 
1aa0: 4f 50 5f 41 67 67 53 74 65 70 20 6f 70 63 6f 64  OP_AggStep opcod
1ab0: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
1ac0: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
1ad0: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
1ae0: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
1af0: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
1b00: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20  .** The integer 
1b10: 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73 65  *pMaxStack is se
1b20: 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  t to the maximum
1b30: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 20   number of vdbe 
1b40: 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65 73  stack.** entries
1b50: 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e 61   that static ana
1b60: 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74 68  lysis reveals th
1b70: 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68 74  is program might
1b80: 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   need..**.** Thi
1b90: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
1ba0: 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  oes the followin
1bb0: 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20  g optimization: 
1bc0: 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a   It scans for.**
1bd0: 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f   Halt instructio
1be0: 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51 4c  ns where P1==SQL
1bf0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6f  ITE_CONSTRAINT o
1c00: 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f  r P2==OE_Abort o
1c10: 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73 65  r for.** IdxInse
1c20: 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  rt instructions 
1c30: 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49 66  where P2!=0.  If
1c40: 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63   no such instruc
1c50: 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  tion is.** found
1c60: 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61  , then every Sta
1c70: 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69  tement instructi
1c80: 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  on is changed to
1c90: 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20   a Noop.  In.** 
1ca0: 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f  this way, we avo
1cb0: 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  id creating the 
1cc0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1cd0: 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61  l file unnecessa
1ce0: 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rily..*/.static 
1cf0: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
1d00: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
1d10: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2c  t *pMaxFuncArgs,
1d20: 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b 29   int *pMaxStack)
1d30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1d40: 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20   nMaxArgs = 0;. 
1d50: 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d   int nMaxStack =
1d60: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70   p->nOp;.  Op *p
1d70: 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  Op;.  int *aLabe
1d80: 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20  l = p->aLabel;. 
1d90: 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d 65   int doesStateme
1da0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ntRollback = 0;.
1db0: 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d 65    int hasStateme
1dc0: 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66  ntBegin = 0;.  f
1dd0: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
1de0: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
1df0: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
1e00: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
1e10: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
1e20: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
1e30: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
1e40: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b  e==OP_AggStep ){
1e50: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1e60: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
1e70: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
1e80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
1ea0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
1eb0: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->p1==SQLITE_CON
1ec0: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
1ed0: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  p2==OE_Abort ){.
1ee0: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1ef0: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1f00: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1f10: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1f20: 3d 4f 50 5f 49 64 78 49 6e 73 65 72 74 20 29 7b  =OP_IdxInsert ){
1f30: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1f40: 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  p2 ){.        do
1f50: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1f60: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
1f70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1f80: 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d  pcode==OP_Statem
1f90: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ent ){.      has
1fa0: 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d  StatementBegin =
1fb0: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
1fc0: 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28  f( opcodeNoPush(
1fd0: 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20 20  opcode) ){.     
1fe0: 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20 20   nMaxStack--;.  
1ff0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70    }..    if( pOp
2000: 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69 6e  ->p2>=0 ) contin
2010: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
2020: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c  -1-pOp->p2<p->nL
2030: 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70 2d  abel );.    pOp-
2040: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
2050: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20  pOp->p2];.  }.  
2060: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c  sqliteFree(p->aL
2070: 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62  abel);.  p->aLab
2080: 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78  el = 0;..  *pMax
2090: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
20a0: 72 67 73 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63  rgs;.  *pMaxStac
20b0: 6b 20 3d 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a  k = nMaxStack;..
20c0: 20 20 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72    /* If we never
20d0: 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   rollback a stat
20e0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
20f0: 6e 2c 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e  n, then statemen
2100: 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  t.  ** transacti
2110: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ons are not need
2120: 65 64 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65  ed.  So change e
2130: 76 65 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e  very OP_Statemen
2140: 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e  t.  ** opcode in
2150: 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20  to an OP_Noop.  
2160: 54 68 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c  This avoid a cal
2170: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2180: 65 6e 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20  enExclusive().  
2190: 2a 2a 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  ** which can be 
21a0: 65 78 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d  expensive on som
21b0: 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a  e platforms..  *
21c0: 2f 0a 20 20 69 66 28 20 68 61 73 53 74 61 74 65  /.  if( hasState
21d0: 6d 65 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f  mentBegin && !do
21e0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
21f0: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ack ){.    for(p
2200: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
2210: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
2220: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
2230: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2240: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
2250: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
2260: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
2270: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2280: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2290: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
22a0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
22b0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
22c0: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
22d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
22e0: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
22f0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
2300: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2310: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
2320: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  >nOp;.}../*.** A
2330: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
2340: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
2350: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
2360: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
2370: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
2380: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
2390: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
23a0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
23b0: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
23c0: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
23d0: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
23e0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
23f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
2400: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2410: 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70 41 72   );.  resizeOpAr
2420: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20  ray(p, p->nOp + 
2430: 6e 4f 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  nOp);.  if( sqli
2440: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
2450: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2460: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
2470: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p->nOp;.  if( nO
2480: 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p>0 ){.    int i
2490: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
24a0: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
24b0: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
24c0: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
24d0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
24e0: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
24f0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
2500: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
2510: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
2520: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
2530: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
2540: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
2550: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70      pOut->p2 = p
2560: 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44  2<0 ? addr + ADD
2570: 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20  R(p2) : p2;.    
2580: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
2590: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
25a0: 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e  ->p3type = pIn->
25b0: 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a  p3 ? P3_STATIC :
25c0: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66   P3_NOTUSED;.#if
25d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
25e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
25f0: 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
2600: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
2610: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
2620: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
2630: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
2640: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2650: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2660: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
2670: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2680: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2690: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
26a0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
26b0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
26c0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
26d0: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
26e0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
26f0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
2700: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
2710: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
2720: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
2730: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
2740: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2750: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2760: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
2770: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2780: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
2790: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
27a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
27b0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
27c0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
27d0: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
27e0: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
27f0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2800: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
2810: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2820: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2830: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
2840: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2850: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2860: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2870: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
2880: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
2890: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
28a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
28b0: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
28c0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
28d0: 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d  .  assert( val>=
28e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2900: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2910: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2920: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
2930: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
2940: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
2950: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2960: 2a 2a 20 43 68 61 6e 67 65 20 74 65 68 20 50 32  ** Change teh P2
2970: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
2980: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
2990: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
29a0: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
29b0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
29c0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
29d0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
29e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
29f0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
2a00: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
2a10: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
2a20: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
2a30: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
2a40: 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P3 value if nece
2a50: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
2a60: 20 76 6f 69 64 20 66 72 65 65 50 33 28 69 6e 74   void freeP3(int
2a70: 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p3type, void *p
2a80: 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29 7b 0a  3){.  if( p3 ){.
2a90: 20 20 20 20 73 77 69 74 63 68 28 20 70 33 74 79      switch( p3ty
2aa0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
2ab0: 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20   P3_DYNAMIC:.   
2ac0: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
2ad0: 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  FO:.      case P
2ae0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
2af0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  F: {.        sql
2b00: 69 74 65 46 72 65 65 28 70 33 29 3b 0a 20 20 20  iteFree(p3);.   
2b10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b20: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
2b30: 33 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  3_VDBEFUNC: {.  
2b40: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
2b50: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
2b60: 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20  eFunc *)p3;.    
2b70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
2b80: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64  eleteAuxData(pVd
2b90: 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20  beFunc, 0);.    
2ba0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2bb0: 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20  VdbeFunc);.     
2bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bd0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
2be0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MEM: {.        s
2bf0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
2c00: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
2c10: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
2c20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2c30: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
2c40: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2c50: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
2c60: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2c70: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2c90: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
2ca0: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
2cb0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
2cc0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
2cd0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
2ce0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
2cf0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
2d00: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2d10: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2d20: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
2d30: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33 20 6f  =0 then the P3 o
2d40: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
2d50: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
2d60: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
2d70: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
2d80: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
2d90: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2da0: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  Malloc()..** A v
2db0: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
2dc0: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
2dd0: 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69   zP3 up to and i
2de0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
2df0: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
2e00: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
2e10: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
2e20: 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP3..**.** If n=
2e30: 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P3_KEYINFO it m
2e40: 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73  eans that zP3 is
2e50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2e60: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2e70: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
2e80: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
2e90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
2ea0: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
2eb0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
2ec0: 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66  eMalloc, to be f
2ed0: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
2ee0: 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e  be is finalized.
2ef0: 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  .** n==P3_KEYINF
2f00: 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61  O_HANDOFF indica
2f10: 74 65 73 20 74 68 61 74 20 7a 50 33 20 70 6f 69  tes that zP3 poi
2f20: 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
2f30: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74   structure.** st
2f40: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74  ored in memory t
2f50: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
2f60: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2f70: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e 20 54   sqliteMalloc. T
2f80: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
2f90: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
2fa0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
2fb0: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
2fc0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
2fd0: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
2fe0: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
2ff0: 73 20 6f 66 20 6e 20 28 50 33 5f 53 54 41 54 49  s of n (P3_STATI
3000: 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P3_COLLSEQ et
3010: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
3020: 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP3 points.** 
3030: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
3040: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
3050: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
3060: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
3070: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
3080: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
3090: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
30a0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
30b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
30c0: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
30d0: 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  3 on the most re
30e0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
30f0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
3100: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3110: 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70  ChangeP3(Vdbe *p
3120: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
3130: 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74  t char *zP3, int
3140: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
3150: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3160: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3170: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
3180: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
3190: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
31a0: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 69  ailed() ){.    i
31b0: 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e  f (n != P3_KEYIN
31c0: 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  FO) {.      free
31d0: 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  P3(n, (void*)*(c
31e0: 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20  har**)&zP3);.   
31f0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
3200: 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20   }.  if( addr<0 
3210: 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20  || addr>=p->nOp 
3220: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
3230: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
3240: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
3250: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
3260: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3270: 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79  freeP3(pOp->p3ty
3280: 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  pe, pOp->p3);.  
3290: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 69  pOp->p3 = 0;.  i
32a0: 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20  f( zP3==0 ){.   
32b0: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
32c0: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
32d0: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P3_NOTUSED;.  }e
32e0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
32f0: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
3300: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
3310: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
3320: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
3330: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
3340: 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP3)->nField;.  
3350: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
3360: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
3370: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
3380: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3390: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
33a0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
33b0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
33c0: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
33d0: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
33e0: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
33f0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3400: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3410: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3420: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3430: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
3440: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3450: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3460: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3470: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3480: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3490: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
34a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
34b0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
34c0: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
34d0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
34e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
34f0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3500: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3510: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3520: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
3530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 2d  else{.      pOp-
3540: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  >p3type = P3_NOT
3550: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
3560: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
3570: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
3580: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28  .    pOp->p3 = (
3590: 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70  char*)zP3;.    p
35a0: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
35b0: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
35c0: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
35d0: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
35e0: 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP3;.    pOp->p
35f0: 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c  3type = n;.  }el
3600: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  se{.    if( n==0
3610: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50   ) n = strlen(zP
3620: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20  3);.    pOp->p3 
3630: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
3640: 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP3, n);.    pOp
3650: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
3660: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
3670: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3680: 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 50  ** Replace the P
3690: 33 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  3 field of the m
36a0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
36b0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  ed instruction w
36c0: 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74  ith.** comment t
36d0: 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ext..*/.void sql
36e0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
36f0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
3700: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
3710: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
3730: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
3740: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
3750: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
3760: 70 33 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  p3==0 .         
3770: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
3780: 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 76  cFailed() );.  v
3790: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
37a0: 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mat);.  sqlite3V
37b0: 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 2d  dbeChangeP3(p, -
37c0: 31 2c 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e  1, sqlite3VMPrin
37d0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c  tf(zFormat, ap),
37e0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
37f0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
3800: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
3810: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
3820: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
3830: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
3840: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
3850: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3860: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
3870: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3880: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3890: 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61  rt( addr>=0 && a
38a0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
38b0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
38c0: 64 64 72 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  ddr];.}..#if !de
38d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
38e0: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
38f0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
3900: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
3910: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
3920: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
3930: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
3940: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
3950: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
3960: 65 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 66  e P3 parameter f
3970: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
3980: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
3990: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
39a0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
39b0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
39c0: 61 72 20 2a 64 69 73 70 6c 61 79 50 33 28 4f 70  ar *displayP3(Op
39d0: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
39e0: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
39f0: 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61    char *zP3;.  a
3a00: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
3a10: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
3a20: 70 2d 3e 70 33 74 79 70 65 20 29 7b 0a 20 20 20  p->p3type ){.   
3a30: 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f   case P3_KEYINFO
3a40: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
3a50: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
3a60: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b  o *pKeyInfo = (K
3a70: 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b  eyInfo*)pOp->p3;
3a80: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3a90: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
3aa0: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
3ab0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
3ac0: 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a   strlen(zTemp);.
3ad0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3ae0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
3af0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
3b00: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3b10: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
3b20: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
3b30: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
3b40: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
3b50: 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  len(pColl->zName
3b60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
3b70: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 63              strc
3b90: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
3ba0: 2e 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ..");.          
3bb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
3bd0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
3be0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
3bf0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3c00: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
3c10: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
3c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
3c30: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
3c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3c50: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 54        strcpy(&zT
3c60: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
3c70: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
3c80: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20   i += n;.       
3c90: 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e   }else if( i+4<n
3ca0: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
3cb0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d      strcpy(&zTem
3cc0: 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20  p[i],",nil");.  
3cd0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
3ce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3cf0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
3d00: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
3d10: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
3d20: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
3d30: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33  emp );.      zP3
3d40: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
3d50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3d60: 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51   case P3_COLLSEQ
3d70: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
3d80: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
3d90: 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Seq*)pOp->p3;.  
3da0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d      sprintf(zTem
3db0: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
3dc0: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
3dd0: 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  e);.      zP3 = 
3de0: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
3df0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3e00: 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b  se P3_FUNCDEF: {
3e10: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
3e20: 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a  pDef = (FuncDef*
3e30: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
3e40: 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20  char zNum[30];. 
3e50: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65       sprintf(zTe
3e60: 6d 70 2c 20 22 25 2e 2a 73 22 2c 20 6e 54 65 6d  mp, "%.*s", nTem
3e70: 70 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b  p, pDef->zName);
3e80: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3e90: 4e 75 6d 2c 22 28 25 64 29 22 2c 20 70 44 65 66  Num,"(%d)", pDef
3ea0: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69  ->nArg);.      i
3eb0: 66 28 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29  f( strlen(zTemp)
3ec0: 2b 73 74 72 6c 65 6e 28 7a 4e 75 6d 29 2b 31 3c  +strlen(zNum)+1<
3ed0: 3d 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  =nTemp ){.      
3ee0: 20 20 73 74 72 63 61 74 28 7a 54 65 6d 70 2c 20    strcat(zTemp, 
3ef0: 7a 4e 75 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zNum);.      }. 
3f00: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
3f10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3f20: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
3f30: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  : {.      zP3 = 
3f40: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 69  pOp->p3;.      i
3f50: 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70  f( zP3==0 || pOp
3f60: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
3f70: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 33  p ){.        zP3
3f80: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20   = "";.      }. 
3f90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3fa0: 6e 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP3;.}.#endif.
3fb0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
3fc0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
3fd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
3fe0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
3ff0: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
4000: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
4010: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
4020: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
4030: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
4040: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
4050: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
4060: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33  Op){.  char *zP3
4070: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
4080: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
4090: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
40a0: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
40b0: 64 20 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69  d %4d %s\n";.  i
40c0: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
40d0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
40e0: 33 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f  3 = displayP3(pO
40f0: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
4100: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
4110: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
4120: 2c 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69  ,.      pc, sqli
4130: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
4140: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70  Op->opcode], pOp
4150: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a  ->p1, pOp->p2, z
4160: 50 33 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f  P3);.  fflush(pO
4170: 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
4180: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
4190: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
41a0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
41b0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
41c0: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
41d0: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 29  nt N){.  if( p )
41e0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d  {.    while( N--
41f0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
4200: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
4210: 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20  e(p++);.    }.  
4220: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
4230: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
4240: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
4250: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
4260: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
4270: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
4280: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
4290: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
42a0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
42b0: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
42c0: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
42d0: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
42e0: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
42f0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
4300: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4310: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
4320: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
4330: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e  "EXPLAIN"..*/.in
4340: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
4350: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4370: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
4380: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4390: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
43a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
43b0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
43c0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
43d0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
43e0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
43f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
4400: 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28  ISUSE;.  assert(
4410: 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49   db->magic==SQLI
4420: 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b  TE_MAGIC_BUSY );
4430: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
4440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
4450: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
4460: 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20  Y );..  /* Even 
4470: 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f  though this opco
4480: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20  de does not put 
4490: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20  dynamic strings 
44a0: 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  onto the.  ** th
44b0: 65 20 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61  e stack, they ma
44c0: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
44d0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
44e0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
44f0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
4500: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
4510: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
4520: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
4530: 20 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26    if( p->pTos==&
4540: 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a  p->aStack[4] ){.
4550: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
4560: 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35  ray(p->aStack, 5
4570: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f  );.  }.  p->resO
4580: 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64  nStack = 0;..  d
4590: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
45a0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
45b0: 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70  p->nOp && p->exp
45c0: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
45d0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
45e0: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
45f0: 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20   i>=p->nOp ){.  
4600: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4610: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
4620: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
4630: 73 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  se if( db->flags
4640: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72   & SQLITE_Interr
4650: 75 70 74 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66  upt ){.    db->f
4660: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
4670: 49 6e 74 65 72 72 75 70 74 3b 0a 20 20 20 20 70  Interrupt;.    p
4680: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
4690: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
46a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
46b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
46c0: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
46d0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
46e0: 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30  p->rc), (char*)0
46f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4700: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4710: 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70  p[i];.    Mem *p
4720: 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b  Mem = p->aStack;
4730: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
4740: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
4750: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
4760: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
4770: 20 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20   pMem->i = i;   
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47a0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
47b0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
47c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
47d0: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
47e0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
47f0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c     pMem->z = sql
4800: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b  ite3OpcodeNames[
4810: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f  pOp->opcode];  /
4820: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
4830: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e  pMem->n = strlen
4840: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70  (pMem->z);.    p
4850: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
4860: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
4870: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
4880: 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  UTF8;.    pMem++
4890: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
48a0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
48b0: 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d    pMem->i = pOp-
48c0: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
48e0: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P1 */.    pMem-
48f0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
4900: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
4910: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
4920: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
4930: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f      pMem->i = pO
4940: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
4970: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
4980: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
4990: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
49a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f  >flags = MEM_Sho
49b0: 72 74 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  rt|MEM_Str|MEM_T
49c0: 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a  erm;   /* P3 */.
49d0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69      pMem->z = di
49e0: 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d 65  splayP3(pOp, pMe
49f0: 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f  m->zShort, sizeo
4a00: 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29  f(pMem->zShort))
4a10: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  ;.    pMem->type
4a20: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
4a30: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
4a40: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20  SQLITE_UTF8;..  
4a50: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
4a60: 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c  = 5 - 2*(p->expl
4a70: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70  ain-1);.    p->p
4a80: 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20  Tos = pMem;.    
4a90: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
4aa0: 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53  K;.    p->resOnS
4ab0: 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63  tack = 1;.    rc
4ac0: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
4ad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4ae0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4af0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
4b00: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  */../*.** Print 
4b10: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
4b20: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
4b30: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
4b40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4b50: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
4b60: 62 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  be *p){.#ifdef S
4b70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
4b80: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
4b90: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
4ba0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
4bb0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
4bc0: 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69  >aOp[nOp-1];.  i
4bd0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
4be0: 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e  OP_Noop && pOp->
4bf0: 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  p3!=0 ){.    con
4c00: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70  st char *z = pOp
4c10: 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c 65 28  ->p3;.    while(
4c20: 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a   isspace(*(u8*)z
4c30: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69  ) ) z++;.    pri
4c40: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
4c50: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ", z);.  }.#endi
4c60: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
4c70: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
4c80: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
4c90: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  on.  This involv
4ca0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
4cb0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
4cc0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
4cd0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
4ce0: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
4cf0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
4d00: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
4d10: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
4d20: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
4d30: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
4d40: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
4d50: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
4d60: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
4d70: 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45  y to move a VDBE
4d80: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
4d90: 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45  _INIT to.** VDBE
4da0: 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76  _MAGIC_RUN..*/.v
4db0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
4dc0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
4dd0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
4de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4df0: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
4e00: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
4e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4e20: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
4e30: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
4e40: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
4e50: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
4e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4e70: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
4e80: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
4e90: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4ec0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
4ed0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ate */.  int isE
4ee0: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
4ef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4f00: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
4f10: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
4f20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
4f40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4f50: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4f60: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
4f70: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
4f80: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
4f90: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
4fa0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
4fb0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
4fc0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
4fd0: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
4fe0: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
4ff0: 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62  . This.   * is b
5000: 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
5010: 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  to resizeOpArray
5020: 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72  () below may shr
5030: 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e  ink the.   * p->
5040: 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73  aOp[] array to s
5050: 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61  ave memory if ca
5060: 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42  lled when in VDB
5070: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20  E_MAGIC_RUN .   
5080: 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20  * state..   */. 
5090: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
50a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f  _MAGIC_RUN;..  /
50b0: 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  * No instruction
50c0: 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72   ever pushes mor
50d0: 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20  e than a single 
50e0: 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65  element onto the
50f0: 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e  .  ** stack.  An
5100: 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65  d the stack neve
5110: 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65  r grows on succe
5120: 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73  ssive executions
5130: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   of the.  ** sam
5140: 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20  e loop.  So the 
5150: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
5160: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20  instructions is 
5170: 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  an upper bound. 
5180: 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d   ** on the maxim
5190: 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20 72  um stack depth r
51a0: 65 71 75 69 72 65 64 2e 20 20 28 41 64 64 65 64  equired.  (Added
51b0: 20 6c 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20   later:)  The.  
51c0: 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  ** resolveP2Valu
51d0: 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74  es() call comput
51e0: 65 73 20 61 20 74 69 67 68 74 65 72 20 75 70 70  es a tighter upp
51f0: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a  er bound on the.
5200: 20 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e    ** stack size.
5210: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  **.  ** Alloc
5220: 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74  ation all the st
5230: 61 63 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c  ack space we wil
5240: 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a  l ever need..  *
5250: 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  /.  if( p->aStac
5260: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  k==0 ){.    int 
5270: 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  nArg;       /* M
5280: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
5290: 20 61 72 67 73 20 70 61 73 73 65 64 20 74 6f 20   args passed to 
52a0: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e  a user function.
52b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61   */.    int nSta
52c0: 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  ck;     /* Maxim
52d0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61  um number of sta
52e0: 63 6b 20 65 6e 74 72 69 65 73 20 72 65 71 75 69  ck entries requi
52f0: 72 65 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c  red */.    resol
5300: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
5310: 41 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20  Arg, &nStack);. 
5320: 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79     resizeOpArray
5330: 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20  (p, p->nOp);.   
5340: 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30   assert( nVar>=0
5350: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
5360: 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b  nStack<p->nOp );
5370: 0a 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 69 73  .    nStack = is
5380: 45 78 70 6c 61 69 6e 20 3f 20 31 30 20 3a 20 6e  Explain ? 10 : n
5390: 53 74 61 63 6b 3b 0a 20 20 20 20 70 2d 3e 61 53  Stack;.    p->aS
53a0: 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c  tack = sqliteMal
53b0: 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 6e 53 74  loc(.        nSt
53c0: 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53  ack*sizeof(p->aS
53d0: 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61  tack[0])    /* a
53e0: 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b  Stack */.      +
53f0: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
5400: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
5410: 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20  /* apArg */.    
5420: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
5430: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
5440: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
5450: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
5460: 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20  f(char*)        
5470: 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f       /* azVar */
5480: 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69  .      + nMem*si
5490: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20          /* aMem 
54b0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73  */.      + nCurs
54c0: 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72  or*sizeof(Cursor
54d0: 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43  *)        /* apC
54e0: 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20  sr */.    );.   
54f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c   if( !sqlite3Mal
5500: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
5510: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26       p->aMem = &
5520: 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b  p->aStack[nStack
5530: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  ];.      p->nMem
5540: 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70   = nMem;.      p
5550: 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65  ->aVar = &p->aMe
5560: 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70  m[nMem];.      p
5570: 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20  ->nVar = nVar;. 
5580: 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20       p->okVar = 
5590: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  0;.      p->apAr
55a0: 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61  g = (Mem**)&p->a
55b0: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
55c0: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61   p->azVar = (cha
55d0: 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41  r**)&p->apArg[nA
55e0: 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  rg];.      p->ap
55f0: 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29  Csr = (Cursor**)
5600: 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b  &p->azVar[nVar];
5610: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  .      p->nCurso
5620: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20  r = nCursor;.   
5630: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
5640: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
5650: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
5660: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
5670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5680: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d  .  for(n=0; n<p-
5690: 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  >nMem; n++){.   
56a0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
56b0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
56c0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
56d0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28 70 2d  _DEBUG.  if( (p-
56e0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
56f0: 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 29  ITE_VdbeListing)
5700: 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74  !=0.    || sqlit
5710: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22  e3OsFileExists("
5720: 76 64 62 65 5f 65 78 70 6c 61 69 6e 22 29 0a 20  vdbe_explain"). 
5730: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
5740: 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20     printf("VDBE 
5750: 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a  Program Listing:
5760: 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
5770: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29  3VdbePrintSql(p)
5780: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5790: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
57a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57b0: 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20  PrintOp(stdout, 
57c0: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
57d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
57e0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
57f0: 73 74 73 28 22 76 64 62 65 5f 74 72 61 63 65 22  sts("vdbe_trace"
5800: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63  ) ){.    p->trac
5810: 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a  e = stdout;.  }.
5820: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 54 6f 73  #endif.  p->pTos
5830: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31   = &p->aStack[-1
5840: 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  ];.  p->pc = -1;
5850: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
5860: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75  E_OK;.  p->uniqu
5870: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72  eCnt = 0;.  p->r
5880: 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a  eturnDepth = 0;.
5890: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
58a0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
58b0: 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b  ->popStack =  0;
58c0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
58d0: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
58e0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
58f0: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
5900: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
5910: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
5920: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
5930: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 23 69 66  ormat = 255;.#if
5940: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
5950: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
5960: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5970: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
5980: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
5990: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
59a0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
59b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
59c0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  if.}../*.** Clos
59d0: 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20 72  e a cursor and r
59e0: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
59f0: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
5a00: 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a 20  rsor happens.** 
5a10: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
5a20: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
5a30: 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20 2a 70  Cursor(Cursor *p
5a40: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
5a50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
5a60: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
5a70: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
5a80: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
5a90: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
5aa0: 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sor);.  }.  if( 
5ab0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
5ac0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
5ad0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d  e(pCx->pBt);.  }
5ae0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
5af0: 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71 6c  x->pData);.  sql
5b00: 69 74 65 46 72 65 65 28 70 43 78 2d 3e 61 54 79  iteFree(pCx->aTy
5b10: 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  pe);.  sqliteFre
5b20: 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(pCx);.}../*.**
5b30: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
5b40: 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  rs.*/.static voi
5b50: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
5b60: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
5b70: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
5b80: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
5b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5ba0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
5bb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
5bc0: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 61 70 43  reeCursor(p->apC
5bd0: 73 72 5b 69 5d 29 3b 0a 20 20 20 20 70 2d 3e 61  sr[i]);.    p->a
5be0: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  pCsr[i] = 0;.  }
5bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
5c00: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
5c10: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
5c20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
5c30: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
5c40: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
5c50: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
5c60: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
5c70: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
5c80: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
5c90: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
5ca0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
5cb0: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
5cc0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
5cd0: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
5ce0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
5cf0: 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a  f( p->aStack ){.
5d00: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
5d10: 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 31  ray(p->aStack, 1
5d20: 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70 2d   + (p->pTos - p-
5d30: 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 70  >aStack));.    p
5d40: 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74  ->pTos = &p->aSt
5d50: 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20 63  ack[-1];.  }.  c
5d60: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
5d70: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
5d80: 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
5d90: 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >nMem);.  sqlite
5da0: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
5db0: 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66 28  p->sFifo);.  if(
5dc0: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
5dd0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5de0: 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61   i<p->contextSta
5df0: 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ckTop; i++){.   
5e00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69     sqlite3VdbeFi
5e10: 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e 74  foClear(&p->cont
5e20: 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69 66  extStack[i].sFif
5e30: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  o);.    }.    sq
5e40: 6c 69 74 65 46 72 65 65 28 70 2d 3e 63 6f 6e 74  liteFree(p->cont
5e50: 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20  extStack);.  }. 
5e60: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
5e70: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65   = 0;.  p->conte
5e80: 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30  xtStackDepth = 0
5e90: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
5ea0: 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71  ackTop = 0;.  sq
5eb0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72  liteFree(p->zErr
5ec0: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
5ed0: 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sg = 0;.}../*.**
5ee0: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
5ef0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
5f00: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
5f10: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
5f20: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
5f30: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
5f40: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
5f50: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
5f60: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
5f70: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
5f80: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
5f90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
5fa0: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
5fb0: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
5fc0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
5fd0: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
5fe0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5ff0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
6000: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
6010: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
6020: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
6030: 20 6e 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   n;.  releaseMem
6040: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
6050: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
6060: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
6070: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f  qliteFree(p->aCo
6080: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
6090: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
60a0: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
60b0: 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e  umn = nResColumn
60c0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
60d0: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
60e0: 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  m*)sqliteMalloc(
60f0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
6100: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
6110: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6120: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
6130: 30 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61  0 ){.    (pColNa
6140: 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d  me++)->flags = M
6150: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a  EM_Null;.  }.}..
6160: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
6170: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
6180: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
6190: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
61a0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
61b0: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
61c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
61d0: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
61e0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
61f0: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
6200: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
6210: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
6220: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
6230: 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20  If N==P3_STATIC 
6240: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a   it means that z
6250: 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Name is a pointe
6260: 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20  r to a constant 
6270: 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67  static.** string
6280: 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74   and we can just
6290: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
62a0: 72 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44  r. If it is P3_D
62b0: 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a  YNAMIC, then .**
62c0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66   the string is f
62d0: 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
62e0: 65 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  eFree() when the
62f0: 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65   vdbe is finishe
6300: 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74  d with.** it. Ot
6310: 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73  herwise, N bytes
6320: 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f   of zName are co
6330: 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pied..*/.int sql
6340: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6350: 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  me(Vdbe *p, int 
6360: 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f  idx, int var, co
6370: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6380: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72   int N){.  int r
6390: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
63a0: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
63b0: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
63c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
63d0: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
63e0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
63f0: 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
6400: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6410: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
6420: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
6430: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
6440: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
6450: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
6460: 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e  .  if( N==P3_DYN
6470: 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54  AMIC || N==P3_ST
6480: 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  ATIC ){.    rc =
6490: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
64a0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
64b0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
64c0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
64d0: 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
64e0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
64f0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
6500: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
6510: 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53  N, SQLITE_UTF8,S
6520: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
6530: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
6540: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d  SQLITE_OK && N==
6550: 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P3_DYNAMIC ){.  
6560: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
6570: 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66  s = (pColName->f
6580: 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69  lags&(~MEM_Stati
6590: 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  c))|MEM_Dyn;.   
65a0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20   pColName->xDel 
65b0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
65c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
65d0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
65e0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
65f0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
6600: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
6610: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
6620: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
6630: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
6640: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
6650: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
6660: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
6670: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
6680: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
6690: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
66a0: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
66b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
66c0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
66d0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
66e0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
66f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
6700: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
6710: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
6720: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
6730: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
6740: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
6750: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
6760: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
6770: 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
6780: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
6790: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
67a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
67b0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
67c0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
67d0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
67e0: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
67f0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
6800: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
6810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
6820: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
6830: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
6840: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
6850: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
6860: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
6870: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
6880: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
6890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
68a0: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
68b0: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
68c0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
68d0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
68e0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
68f0: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  db);.    if( rc 
6900: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6910: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
6920: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
6930: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
6940: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
6950: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
6960: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
6970: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
6980: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
6990: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
69a0: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
69b0: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
69c0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
69d0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
69e0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
69f0: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
6a00: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
6a10: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
6a20: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
6a30: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
6a40: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
6a50: 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ry:.  In that ca
6a60: 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f  se we do.  ** no
6a70: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
6a80: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
6a90: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
6aa0: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
6ab0: 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a  .  ** too..  */.
6ac0: 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28    if( 0==strlen(
6ad0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
6ae0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
6af0: 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61  0].pBt)) || nTra
6b00: 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  ns<=1 ){.    for
6b10: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
6b20: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
6b30: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
6b40: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6b50: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6b60: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6b70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6b80: 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20  3BtreeSync(pBt, 
6b90: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6ba0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
6bb0: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
6bc0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
6bd0: 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
6be0: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  d */.    if( rc=
6bf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6c00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
6c10: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6c20: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
6c30: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6c40: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
6c50: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
6c60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
6c70: 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  it(pBt);.       
6c80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6c90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
6ca0: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
6cb0: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
6cc0: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
6cd0: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
6ce0: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
6cf0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6d00: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
6d10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6d20: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
6d30: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
6d40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6d50: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
6d60: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65  lse{.    int nee
6d70: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
6d80: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
6d90: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
6da0: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
6db0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
6dc0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
6dd0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
6de0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
6df0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
6e00: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74      OsFile *mast
6e10: 65 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  er = 0;..    /* 
6e20: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
6e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
6e40: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
6e50: 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a      u32 random;.
6e60: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
6e70: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
6e80: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
6e90: 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  ss(sizeof(random
6ea0: 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20  ), &random);.   
6eb0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
6ec0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2d  ite3MPrintf("%s-
6ed0: 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69  mj%08X", zMainFi
6ee0: 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66  le, random&0x7ff
6ef0: 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66  fffff);.      if
6f00: 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !zMaster ){.  
6f10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6f20: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6f30: 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73   }.    }while( s
6f40: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
6f50: 74 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a 0a  ts(zMaster) );..
6f60: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
6f70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
6f80: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
6f90: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
6fa0: 76 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ve(zMaster, &mas
6fb0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ter, 0);.    if(
6fc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6fd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
6fe0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
6ff0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7000: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
7010: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
7020: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
7030: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
7040: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
7050: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
7060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
7070: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7080: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
7090: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
70a0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
70b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
70c0: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
70d0: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
70e0: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
70f0: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
7100: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7110: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
7120: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
7130: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
7140: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
7150: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
7160: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7170: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
7180: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
7190: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
71a0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  t;.      if( i==
71b0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  1 ) continue;   
71c0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45  /* Ignore the TE
71d0: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
71e0: 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20       if( pBt && 
71f0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
7200: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
7210: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
7220: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
7230: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
7240: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
7250: 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
7260: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
7270: 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72  /* Ignore :memor
7280: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
7290: 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
72a0: 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
72b0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
72c0: 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
72d0: 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
72e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
72f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7300: 33 4f 73 57 72 69 74 65 28 6d 61 73 74 65 72 2c  3OsWrite(master,
7310: 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a   zFile, strlen(z
7320: 46 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20 20  File)+1);.      
7330: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7340: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
7350: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
7360: 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  &master);.      
7370: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
7380: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ete(zMaster);.  
7390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
73a0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
73b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
73c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
73d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20    }.    }...    
73e0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
73f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
7400: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
7410: 69 73 2c 20 6f 70 65 6e 20 74 68 65 20 64 69 72  is, open the dir
7420: 65 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74 68  ectory.    ** th
7430: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7440: 20 66 69 6c 65 20 69 73 20 73 74 6f 72 65 20 69   file is store i
7450: 6e 20 73 6f 20 74 68 61 74 20 69 74 20 67 65 74  n so that it get
7460: 73 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20 20  s synced too..  
7470: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69    */.    zMainFi
7480: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
7490: 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e  eGetDirname(db->
74a0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
74b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
74c0: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 6d 61 73  penDirectory(mas
74d0: 74 65 72 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  ter, zMainFile);
74e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
74f0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
7500: 20 20 20 20 28 6e 65 65 64 53 79 6e 63 20 26 26      (needSync &&
7510: 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79   (rc=sqlite3OsSy
7520: 6e 63 28 6d 61 73 74 65 72 2c 30 29 29 21 3d 53  nc(master,0))!=S
7530: 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20  QLITE_OK) ){.   
7540: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
7550: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(&master);.    
7560: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
7570: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7580: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
7590: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
75a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
75b0: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
75c0: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
75d0: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
75e0: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
75f0: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
7600: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
7610: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
7620: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
7630: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
7640: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
7650: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
7660: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
7670: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
7680: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
7690: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
76a0: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
76b0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
76c0: 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 2c 0a  te3BtreeSync(),.
76d0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
76e0: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
76f0: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
7700: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
7710: 62 65 0a 20 20 20 20 2a 2a 20 6f 72 70 68 61 6e  be.    ** orphan
7720: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
7730: 74 20 64 65 6c 65 74 65 20 69 74 2c 20 69 6e 20  t delete it, in 
7740: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
7750: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
7760: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
7770: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
7780: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
7790: 65 20 74 68 65 20 66 61 69 6c 75 72 65 0a 20 20  e the failure.  
77a0: 20 20 2a 2a 20 6f 63 63 75 72 65 64 2e 0a 20 20    ** occured..  
77b0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
77c0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
77d0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
77e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
77f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
7800: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
7810: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
7820: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
7830: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
7840: 79 6e 63 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  ync(pBt, zMaster
7850: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
7860: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7870: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7880: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
7890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
78a0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
78b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
78c0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
78d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
78e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
78f0: 65 28 26 6d 61 73 74 65 72 29 3b 0a 0a 20 20 20  e(&master);..   
7900: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
7910: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7920: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
7930: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7940: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
7950: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
7960: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
7970: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
7980: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
7990: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
79a0: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
79b0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
79c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
79d0: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ete(zMaster);.  
79e0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
79f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73  LITE_OK );.    s
7a00: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
7a10: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
7a20: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
7a30: 6c 69 74 65 33 4f 73 53 79 6e 63 44 69 72 65 63  lite3OsSyncDirec
7a40: 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  tory(zMainFile);
7a50: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7a60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7a70: 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  /* This is not g
7a80: 6f 6f 64 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ood. The master 
7a90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
7aa0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 62   been deleted, b
7ab0: 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
7ac0: 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 66  directory sync f
7ad0: 61 69 6c 65 64 2e 20 54 68 65 72 65 20 69 73 20  ailed. There is 
7ae0: 6e 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61  no completely sa
7af0: 66 65 20 63 6f 75 72 73 65 20 6f 66 0a 20 20 20  fe course of.   
7b00: 20 20 20 2a 2a 20 61 63 74 69 6f 6e 20 66 72 6f     ** action fro
7b10: 6d 20 68 65 72 65 2e 20 54 68 65 20 69 6e 64 69  m here. The indi
7b20: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20  vidual journals 
7b30: 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65  contain the name
7b40: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
7b50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7b60: 66 69 6c 65 2c 20 62 75 74 20 74 68 65 72 65 20  file, but there 
7b70: 69 73 20 6e 6f 20 77 61 79 20 6f 66 20 6b 6e 6f  is no way of kno
7b80: 77 69 6e 67 20 69 66 20 74 68 61 74 0a 20 20 20  wing if that.   
7b90: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
7ba0: 72 6e 61 6c 20 65 78 69 73 74 73 20 6e 6f 77 20  rnal exists now 
7bb0: 6f 72 20 69 66 20 69 74 20 77 69 6c 6c 20 65 78  or if it will ex
7bc0: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 6f 70  ist after the op
7bd0: 65 72 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  erating.      **
7be0: 20 73 79 73 74 65 6d 20 63 72 61 73 68 20 74 68   system crash th
7bf0: 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68  at may follow th
7c00: 65 20 66 73 79 6e 63 28 29 20 66 61 69 6c 75 72  e fsync() failur
7c10: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
7c20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7c30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
7c40: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
7c50: 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
7c60: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
7c70: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
7c80: 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
7c90: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
7ca0: 69 74 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  it() are only cl
7cb0: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 20  osing files and 
7cc0: 64 65 6c 65 74 69 6e 67 0a 20 20 20 20 2a 2a 20  deleting.    ** 
7cd0: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
7ce0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7cf0: 67 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  g while this is 
7d00: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
7d10: 27 74 0a 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79  't.    ** really
7d20: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
7d30: 72 69 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e  rity of the tran
7d40: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
7d50: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 0a 20  dy guaranteed,. 
7d60: 20 20 20 2a 2a 20 62 75 74 20 73 6f 6d 65 20 73     ** but some s
7d70: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
7d80: 6e 61 6c 73 20 6d 61 79 20 62 65 20 6c 79 69 6e  nals may be lyin
7d90: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
7da0: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72  ing an.    ** er
7db0: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
7dc0: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
7dd0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
7de0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7df0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
7e00: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
7e10: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
7e20: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
7e30: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
7e40: 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  t(pBt);.      }.
7e50: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7e60: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
7e70: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65  ../*.** Find eve
7e80: 72 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68  ry active VM oth
7e90: 65 72 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e  er than pVdbe an
7ea0: 64 20 63 68 61 6e 67 65 20 69 74 73 20 73 74 61  d change its sta
7eb0: 74 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65  tus to.** aborte
7ec0: 64 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  d.  This happens
7ed0: 20 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75   when one VM cau
7ee0: 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64  ses a rollback d
7ef0: 75 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43  ue to an.** ON C
7f00: 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b  ONFLICT ROLLBACK
7f10: 20 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61   clause (for exa
7f20: 6d 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65  mple).  The othe
7f30: 72 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a  r VMs must be.**
7f40: 20 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74   aborted so that
7f50: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76   they do not hav
7f60: 65 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75  e data rolled ou
7f70: 74 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74  t from underneat
7f80: 68 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e  h.** them leadin
7f90: 67 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e  g to a segfault.
7fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7fb0: 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65  AbortOtherActive
7fc0: 56 64 62 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Vdbes(sqlite3 *d
7fd0: 62 2c 20 56 64 62 65 20 2a 70 45 78 63 65 70 74  b, Vdbe *pExcept
7fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65  ){.  Vdbe *pOthe
7ff0: 72 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d  r;.  for(pOther=
8000: 64 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65  db->pVdbe; pOthe
8010: 72 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72  r; pOther=pOther
8020: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
8030: 28 20 70 4f 74 68 65 72 3d 3d 70 45 78 63 65 70  ( pOther==pExcep
8040: 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
8050: 20 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61    if( pOther->ma
8060: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
8070: 52 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70  RUN || pOther->p
8080: 63 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  c<0 ) continue;.
8090: 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73      closeAllCurs
80a0: 6f 72 73 28 70 4f 74 68 65 72 29 3b 0a 20 20 20  ors(pOther);.   
80b0: 20 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64   pOther->aborted
80c0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20   = 1;.  }.}../* 
80d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
80e0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
80f0: 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56   sqlite3.activeV
8100: 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72  dbeCnt count var
8110: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
8120: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
8130: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
8140: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
8150: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
8160: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
8170: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
8180: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
8190: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
81a0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
81b0: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
81c0: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
81d0: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
81e0: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
81f0: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
8200: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
8210: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
8220: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
8230: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
8240: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
8250: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
8260: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
8270: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20   cnt = 0;.  p = 
8280: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
8290: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
82a0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
82b0: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
82c0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
82d0: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
82e0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
82f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
8300: 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  =db->activeVdbeC
8310: 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  nt );.}.#else.#d
8320: 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
8330: 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
8340: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
8350: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8360: 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
8370: 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
8380: 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
8390: 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
83a0: 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
83b0: 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
83c0: 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
83d0: 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
83e0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
83f0: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
8400: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
8410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8420: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
8430: 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
8440: 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
8450: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
8460: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
8470: 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  HALT..**.** Retu
8480: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
8490: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
84a0: 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
84b0: 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
84c0: 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
84d0: 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
84e0: 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
84f0: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
8500: 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
8510: 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
8520: 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
8530: 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
8540: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8550: 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
8560: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
8570: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
8580: 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e   i;.  int (*xFun
8590: 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d  c)(Btree *pBt) =
85a0: 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e   0;  /* Function
85b0: 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68   to call on each
85c0: 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a   btree backend *
85d0: 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69 61  /.  int isSpecia
85e0: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
85f0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
8600: 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e if SQLITE_NOME
8610: 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20  M or IOERR */.. 
8620: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
8630: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
8640: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
8650: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
8660: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
8670: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
8680: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
8690: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
86a0: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
86b0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
86c0: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
86d0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ne. .  **.  ** S
86e0: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 3a 0a 20  pecial errors:. 
86f0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20   **.  **     If 
8700: 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  an SQLITE_NOMEM 
8710: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
8720: 64 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  d in a statement
8730: 20 74 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a   that writes to.
8740: 20 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74    **     the dat
8750: 61 62 61 73 65 2c 20 74 68 65 6e 20 65 69 74 68  abase, then eith
8760: 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  er a statement o
8770: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  r transaction mu
8780: 73 74 20 62 65 20 72 6f 6c 6c 65 64 0a 20 20 2a  st be rolled.  *
8790: 2a 20 20 20 20 20 62 61 63 6b 20 74 6f 20 65 6e  *     back to en
87a0: 73 75 72 65 20 74 68 65 20 74 72 65 65 2d 73 74  sure the tree-st
87b0: 72 75 63 74 75 72 65 73 20 61 72 65 20 69 6e 20  ructures are in 
87c0: 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
87d0: 74 65 2e 20 41 0a 20 20 2a 2a 20 20 20 20 20 73  te. A.  **     s
87e0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
87f0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
8800: 61 63 6b 20 69 66 20 6f 6e 65 20 69 73 20 6f 70  ack if one is op
8810: 65 6e 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68  en, otherwise th
8820: 65 0a 20 20 2a 2a 20 20 20 20 20 65 6e 74 69 72  e.  **     entir
8830: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
8840: 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
8850: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k..  **.  **    
8860: 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f   If an SQLITE_IO
8870: 45 52 52 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ERR error has oc
8880: 63 75 72 65 64 20 69 6e 20 61 20 73 74 61 74 65  cured in a state
8890: 6d 65 6e 74 20 74 68 61 74 20 77 72 69 74 65 73  ment that writes
88a0: 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68 65   to.  **     the
88b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
88c0: 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
88d0: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
88e0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 65 0a  olled back. The.
88f0: 20 20 2a 2a 20 20 20 20 20 49 2f 4f 20 65 72 72    **     I/O err
8900: 6f 72 20 6d 61 79 20 68 61 76 65 20 63 61 75 73  or may have caus
8910: 65 64 20 67 61 72 62 61 67 65 20 74 6f 20 62 65  ed garbage to be
8920: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
8930: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 20 20  journal .  **   
8940: 20 20 66 69 6c 65 2e 20 57 65 72 65 20 74 68 65    file. Were the
8950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
8960: 63 6f 6e 74 69 6e 75 65 20 61 6e 64 20 65 76 65  continue and eve
8970: 6e 74 75 61 6c 6c 79 20 62 65 20 72 6f 6c 6c 65  ntually be rolle
8980: 64 20 0a 20 20 2a 2a 20 20 20 20 20 62 61 63 6b  d .  **     back
8990: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 6d 69   that garbage mi
89a0: 67 68 74 20 65 6e 64 20 75 70 20 69 6e 20 74 68  ght end up in th
89b0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
89c0: 0a 20 20 2a 2a 20 20 20 20 20 0a 20 20 2a 2a 20  .  **     .  ** 
89d0: 20 20 20 20 49 6e 20 62 6f 74 68 20 6f 66 20 74      In both of t
89e0: 68 65 20 61 62 6f 76 65 20 63 61 73 65 73 2c 20  he above cases, 
89f0: 74 68 65 20 56 64 62 65 2e 65 72 72 6f 72 41 63  the Vdbe.errorAc
8a00: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
8a10: 20 0a 20 20 2a 2a 20 20 20 20 20 69 67 6e 6f 72   .  **     ignor
8a20: 65 64 2e 20 49 66 20 74 68 65 20 73 71 6c 69 74  ed. If the sqlit
8a30: 65 33 2e 61 75 74 6f 43 6f 6d 6d 69 74 20 66 6c  e3.autoCommit fl
8a40: 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ag is false and 
8a50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  a transaction.  
8a60: 2a 2a 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64  **     is rolled
8a70: 20 62 61 63 6b 2c 20 69 74 20 77 69 6c 6c 20 62   back, it will b
8a80: 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 20  e set to true.. 
8a90: 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 20 65   **.  ** Other e
8aa0: 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors:.  **.  **
8ab0: 20 4e 6f 20 65 72 72 6f 72 3a 0a 20 20 2a 2a 0a   No error:.  **.
8ac0: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69    */..  if( sqli
8ad0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
8ae0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
8af0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8b00: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69   }.  if( p->magi
8b10: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
8b20: 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 72 65  N ){.    /* Alre
8b30: 61 64 79 20 68 61 6c 74 65 64 2e 20 20 4e 6f 74  ady halted.  Not
8b40: 68 69 6e 67 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20  hing to do. */. 
8b50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61     assert( p->ma
8b60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
8b70: 48 41 4c 54 20 29 3b 0a 20 20 20 20 72 65 74 75  HALT );.    retu
8b80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8b90: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
8ba0: 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41  ors(p);.  checkA
8bb0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
8bc0: 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
8bd0: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
8be0: 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
8bf0: 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
8c00: 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  d */.  if( p->pc
8c10: 3e 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43  >=0 ){..    /* C
8c20: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
8c30: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
8c40: 72 73 20 2d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rs - SQLITE_NOME
8c50: 4d 20 6f 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  M or SQLITE_IOER
8c60: 52 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69  R */.    isSpeci
8c70: 61 6c 45 72 72 6f 72 20 3d 20 28 28 70 2d 3e 72  alError = ((p->r
8c80: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8c90: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
8ca0: 5f 49 4f 45 52 52 29 3f 31 3a 30 29 3b 0a 20 20  _IOERR)?1:0);.  
8cb0: 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
8cc0: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
8cd0: 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20   This loop does 
8ce0: 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20  static analysis 
8cf0: 6f 66 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  of the query to 
8d00: 73 65 65 20 77 68 69 63 68 20 6f 66 20 74 68 65  see which of the
8d10: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
8d20: 69 6e 67 20 74 68 72 65 65 20 63 61 74 65 67 6f  ing three catego
8d30: 72 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e  ries it falls in
8d40: 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to:.      **.   
8d50: 20 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f     **     Read-o
8d60: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nly.      **    
8d70: 20 51 75 65 72 79 20 77 69 74 68 20 73 74 61 74   Query with stat
8d80: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  ement journal.  
8d90: 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79      **     Query
8da0: 20 77 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65   without stateme
8db0: 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt journal.     
8dc0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20   **.      ** We 
8dd0: 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69  could do somethi
8de0: 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20  ng more elegant 
8df0: 74 68 61 6e 20 74 68 69 73 20 73 74 61 74 69 63  than this static
8e00: 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a   analysis (i.e..
8e10: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74        ** store t
8e20: 68 65 20 74 79 70 65 20 6f 66 20 71 75 65 72 79  he type of query
8e30: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
8e40: 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61 73  compliation phas
8e50: 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20 20 2a  e), but .      *
8e60: 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f  * handling mallo
8e70: 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72  c() or IO failur
8e80: 65 20 69 73 20 61 20 66 61 69 72 6c 79 20 6f 62  e is a fairly ob
8e90: 73 63 75 72 65 20 65 64 67 65 20 63 61 73 65 20  scure edge case 
8ea0: 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  so .      ** thi
8eb0: 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20 65 61  s is probably ea
8ec0: 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68  sier. Todo: Migh
8ed0: 74 20 62 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e  t be an opportun
8ee0: 69 74 79 20 74 6f 20 72 65 64 75 63 65 20 0a 20  ity to reduce . 
8ef0: 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a       ** code siz
8f00: 65 20 61 20 76 65 72 79 20 73 6d 61 6c 6c 20 61  e a very small a
8f10: 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a  mount though....
8f20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
8f30: 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20  nt isReadOnly = 
8f40: 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53  1;.      int isS
8f50: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
8f60: 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f      assert(p->aO
8f70: 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b  p || p->nOp==0);
8f80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8f90: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20  i<p->nOp; i++){ 
8fa0: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
8fb0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
8fc0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  e ){.          c
8fd0: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
8fe0: 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  on:.            
8ff0: 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  isReadOnly = 0;.
9000: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9010: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
9020: 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a  e OP_Statement:.
9030: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74              isSt
9040: 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20  atement = 1;.   
9050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9070: 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  }.  .      /* If
9080: 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
9090: 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65  ead-only, we nee
90a0: 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  d do no rollback
90b0: 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69   at all. Otherwi
90c0: 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  se,.      ** pro
90d0: 63 65 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ceed with the sp
90e0: 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
90f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
9100: 66 28 20 21 69 73 52 65 61 64 4f 6e 6c 79 20 29  f( !isReadOnly )
9110: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
9120: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
9130: 4d 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74  M && isStatement
9140: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
9150: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
9160: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
9170: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9180: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
9190: 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
91a0: 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
91b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
91c0: 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
91d0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
91e0: 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
91f0: 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
9200: 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
9210: 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
9220: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
9230: 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68   sqlite3AbortOth
9240: 65 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62  erActiveVdbes(db
9250: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , p);.          
9260: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
9270: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
9280: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
9290: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
92a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
92c0: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
92d0: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
92e0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
92f0: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
9300: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
9310: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
9320: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
9330: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
9340: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
9350: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
9360: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
9370: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
9380: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
9390: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
93a0: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
93b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
93c0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
93d0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
93e0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
93f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9400: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
9410: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
9420: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
9430: 29 20 29 7b 0a 09 2f 2a 20 54 68 65 20 61 75 74  ) ){../* The aut
9440: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
9450: 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76   true, and the v
9460: 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
9470: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63  .        ** succ
9480: 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e  essful or hit an
9490: 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74   'OR FAIL' const
94a0: 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e  raint. This mean
94b0: 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
94c0: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
94d0: 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
94e0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
94f0: 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  vdbeCommit(db);.
9500: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
9510: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
9520: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9530: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9540: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
9550: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9560: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
9570: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
9580: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
9590: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
95a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
95b0: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
95c0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
95d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
95e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95f0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
9600: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
9610: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
9620: 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  !xFunc ){.      
9630: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9640: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
9650: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
9660: 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63  ){.        xFunc
9670: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
9680: 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20  ommitStmt;.     
9690: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
96a0: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
96b0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ort ){.        x
96c0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
96d0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b  reeRollbackStmt;
96e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
96f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f        sqlite3Abo
9700: 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62  rtOtherActiveVdb
9710: 65 73 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  es(db, p);.     
9720: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
9730: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
9740: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
9750: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
9760: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
9770: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
9780: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
9790: 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  one of sqlite3Bt
97a0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20  reeRollbackStmt 
97b0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
97c0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
97d0: 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f  . Call it once o
97e0: 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20  n each backend. 
97f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9800: 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  rs.    ** and th
9810: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
9820: 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b   still SQLITE_OK
9830: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
9840: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
9850: 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61  .    ** error va
9860: 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
9870: 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c  assert(!xFunc ||
9880: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
9890: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
98a0: 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46  Stmt ||.      xF
98b0: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
98c0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20  eRollbackStmt.  
98d0: 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30    );.    for(i=0
98e0: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
98f0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
9900: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
9910: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
9920: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
9930: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
9940: 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e         rc = xFun
9950: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  c(pBt);.        
9960: 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63  if( rc && (p->rc
9970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
9980: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->rc==SQLITE_CON
9990: 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20  STRAINT) ){.    
99a0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
99b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
99c0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
99d0: 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20  >zErrMsg, 0);.  
99e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
99f0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
9a00: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
9a10: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
9a20: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
9a30: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f  statement was co
9a40: 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a  mmitted, .    **
9a50: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
9a60: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
9a70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
9a80: 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63  geCntOn && p->pc
9a90: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
9aa0: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
9ab0: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
9ac0: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
9ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9ae0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
9af0: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
9b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9b10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
9b20: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
9b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
9b40: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
9b50: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
9b60: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
9b70: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
9b80: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
9b90: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
9ba0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
9bb0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
9bc0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
9bd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
9be0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
9bf0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
9c00: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
9c10: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
9c20: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
9c30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9c40: 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
9c50: 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
9c60: 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
9c70: 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
9c80: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
9c90: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
9ca0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b  activeVdbeCnt--;
9cb0: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
9cc0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
9cd0: 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
9ce0: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
9cf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9d00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
9d10: 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
9d20: 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
9d30: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
9d40: 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
9d50: 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
9d60: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
9d70: 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
9d80: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
9d90: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
9da0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9db0: 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
9dc0: 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
9dd0: 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
9de0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
9df0: 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
9e00: 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
9e10: 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
9e20: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
9e30: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
9e40: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
9e50: 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
9e60: 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
9e70: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
9e80: 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
9e90: 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
9ea0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d   *p){.  if( p->m
9eb0: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
9ec0: 5f 52 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63  _RUN && p->magic
9ed0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  !=VDBE_MAGIC_HAL
9ee0: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
9ef0: 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c  Error(p->db, SQL
9f00: 49 54 45 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a  ITE_MISUSE, 0);.
9f10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9f20: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20  E_MISUSE;.  }.. 
9f30: 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
9f40: 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
9f50: 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
9f60: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
9f70: 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
9f80: 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
9f90: 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
9fa0: 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
9fb0: 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
9fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
9fd0: 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
9fe0: 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
9ff0: 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
a000: 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
a010: 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
a020: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
a030: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
a040: 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
a050: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
a060: 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
a070: 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
a080: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
a090: 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
a0a0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
a0b0: 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
a0c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
a0d0: 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
a0e0: 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
a0f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
a100: 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
a110: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
a120: 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73     if( p->zErrMs
a130: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
a140: 65 33 2a 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3* db = p->db;.
a150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
a160: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
a170: 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
a180: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
a190: 73 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a 20  sqlite3FreeX);. 
a1a0: 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65       db->errCode
a1b0: 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
a1c0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
a1d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
a1e0: 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
a1f0: 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c  ite3Error(p->db,
a200: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
a210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
a220: 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c  ite3Error(p->db,
a230: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
a240: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
a250: 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
a260: 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
a270: 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
a280: 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
a290: 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
a2a0: 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
a2b0: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
a2c0: 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
a2d0: 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
a2e0: 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
a2f0: 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
a300: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
a310: 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
a320: 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
a330: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
a340: 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63  ror(p->db, p->rc
a350: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
a360: 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
a370: 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
a380: 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
a390: 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
a3a0: 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
a3b0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
a3c0: 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
a3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54  .  assert( p->pT
a3e0: 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d  os<&p->aStack[p-
a3f0: 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20 7c  >pc<0?0:p->pc] |
a400: 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29 3b 0a  | !p->aStack );.
a410: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
a420: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
a430: 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
a440: 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
a450: 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
a460: 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
a470: 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
a480: 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
a490: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a4a0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
a4b0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
a4c0: 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
a4d0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
a4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
a4f0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
a500: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a510: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
a520: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
a530: 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c  (out, "%6d %10ll
a540: 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20  d %8lld ",.     
a550: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
a560: 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
a570: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
a580: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
a590: 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
a5a0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
a5b0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
a5c0: 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
a5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a5e0: 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
a5f0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
a600: 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
a610: 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
a620: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61  }.#endif.  p->ma
a630: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
a640: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72  _INIT;.  p->abor
a650: 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ted = 0;.  if( p
a660: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48  ->rc==SQLITE_SCH
a670: 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EMA ){.    sqlit
a680: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
a690: 63 68 65 6d 61 28 70 2d 3e 64 62 2c 20 30 29 3b  chema(p->db, 0);
a6a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
a6b0: 3e 72 63 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  >rc;.}. ./*.** C
a6c0: 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
a6d0: 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
a6e0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
a6f0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
a700: 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
a710: 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
a720: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
a730: 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
a740: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
a750: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
a760: 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
a770: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a780: 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61  OK;..  if( p->ma
a790: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
a7a0: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
a7b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
a7c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
a7d0: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
a7e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
a7f0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
a800: 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72  IC_INIT ){.    r
a810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
a820: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
a830: 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
a840: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a850: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
a860: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
a870: 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
a880: 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
a890: 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
a8a0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
a8b0: 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
a8c0: 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
a8d0: 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
a8e0: 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
a8f0: 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
a900: 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
a910: 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
a920: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
a930: 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
a940: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
a950: 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
a960: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
a970: 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
a980: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
a990: 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
a9a0: 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
a9b0: 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
a9c0: 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
a9d0: 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
a9e0: 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
a9f0: 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70  sk&(1<<i))) && p
aa00: 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
aa10: 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
aa20: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
aa30: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
aa40: 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
aa50: 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
aa60: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
aa70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
aa80: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
aa90: 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
aaa0: 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
aab0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
aac0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
aad0: 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70  urn;.  Cleanup(p
aae0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
aaf0: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
ab00: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
ab10: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
ab20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
ab30: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
ab40: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20   p->db->pVdbe = 
ab50: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
ab60: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
ab70: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
ab80: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
ab90: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70    }.  if( p->aOp
aba0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
abb0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
abc0: 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  .      Op *pOp =
abd0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
abe0: 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70     freeP3(pOp->p
abf0: 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b  3type, pOp->p3);
ac00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ac10: 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20  eFree(p->aOp);. 
ac20: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
ac30: 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
ac40: 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65  >nVar);.  sqlite
ac50: 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  Free(p->aLabel);
ac60: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
ac70: 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c 65  >aStack);.  rele
ac80: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
ac90: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
aca0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
acb0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
acc0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
acd0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
ace0: 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71  MAGIC_DEAD;.  sq
acf0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
ad00: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
ad10: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
ad20: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
ad30: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
ad40: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
ad50: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
ad60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
ad70: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
ad80: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
ad90: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
ada0: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
adb0: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
adc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
add0: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
ade0: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
adf0: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
ae00: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
ae10: 72 63 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  rc;.    extern i
ae20: 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
ae30: 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61 73 73  h_count;.    ass
ae40: 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
ae50: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  );.    if( p->is
ae60: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  Table ){.      r
ae70: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
ae80: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
ae90: 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
aea0: 61 72 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20  arget, &res);.  
aeb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
aec0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
aed0: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
aee0: 72 2c 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76  r,(char*)&p->mov
aef0: 65 74 6f 54 61 72 67 65 74 2c 0a 20 20 20 20 20  etoTarget,.     
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
af20: 69 36 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20  i64),&res);.    
af30: 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
af40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70  eturn rc;.    *p
af50: 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a  ->pIncrKey = 0;.
af60: 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64      p->lastRowid
af70: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d   = keyToInt(p->m
af80: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20  ovetoTarget);.  
af90: 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69    p->rowidIsVali
afa0: 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20  d = res==0;.    
afb0: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
afc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
afd0: 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72  treeNext(p->pCur
afe0: 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
aff0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b000: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
b010: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
b020: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64  ount++;.    p->d
b030: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
b040: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
b050: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
b060: 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ALE;.  }.  retur
b070: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b080: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
b090: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
b0a0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
b0b0: 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
b0c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
b0d0: 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
b0e0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52  lite3VdbeSerialR
b0f0: 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ead().** sqlite3
b100: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
b110: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
b120: 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a  rialWrite().**.*
b130: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
b140: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
b150: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
b160: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
b170: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
b180: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
b190: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
b1a0: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
b1b0: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
b1c0: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
b1d0: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
b1e0: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
b1f0: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
b200: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
b210: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
b220: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
b230: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
b240: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
b250: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
b260: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
b270: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
b280: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
b290: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
b2a0: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
b2b0: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
b2c0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
b2d0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
b2e0: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
b2f0: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
b300: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
b310: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
b320: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
b330: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
b340: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
b350: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
b360: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
b370: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
b380: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
b390: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
b3a0: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
b3b0: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
b3c0: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
b3d0: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
b3e0: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
b3f0: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
b400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
b410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
b420: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
b430: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
b440: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
b450: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
b460: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
b470: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
b480: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
b490: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
b4a0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
b4b0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
b4c0: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
b4f0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
b500: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
b510: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
b520: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
b530: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
b560: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
b570: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
b590: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
b5a0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
b5b0: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
b5c0: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
b5d0: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
b5e0: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
b600: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
b610: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
b620: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
b630: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
b640: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
b650: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
b660: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
b690: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
b6a0: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
b6b0: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
b6c0: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
b6d0: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
b6e0: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
b6f0: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
b700: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
b710: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
b720: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
b730: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
b740: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
b750: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
b760: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
b770: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
b780: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
b790: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
b7a0: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
b7b0: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
b7c0: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
b7d0: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
b7e0: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
b7f0: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
b800: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
b810: 73 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  s;..  if( flags&
b820: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
b830: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b840: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
b850: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
b860: 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
b870: 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
b880: 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
b890: 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
b8a0: 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
b8b0: 30 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31 29  0001000)<<32)-1)
b8c0: 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
b8d0: 6d 2d 3e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  m->i;.    u64 u;
b8e0: 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
b8f0: 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
b900: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
b910: 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20  urn 8+i;.    }. 
b920: 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20     u = i<0 ? -i 
b930: 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  : i;.    if( u<=
b940: 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
b950: 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
b960: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
b970: 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
b980: 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
b990: 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
b9a0: 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
b9b0: 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
b9c0: 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
b9d0: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
b9e0: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
b9f0: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
ba00: 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 7;.  }.  if(
ba10: 20 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29   flags&MEM_Str )
ba20: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4d  {.    int n = pM
ba30: 65 6d 2d 3e 6e 3b 0a 20 20 20 20 61 73 73 65 72  em->n;.    asser
ba40: 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 72  t( n>=0 );.    r
ba50: 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
ba60: 33 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  3);.  }.  if( fl
ba70: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
ba80: 20 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d      return (pMem
ba90: 2d 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d  ->n*2 + 12);.  }
baa0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
bab0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
bac0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
bad0: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
bae0: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
baf0: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
bb00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
bb10: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
bb20: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
bb30: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
bb40: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
bb50: 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
bb60: 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
bb70: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
bb80: 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
bb90: 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
bba0: 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
bbb0: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
bbc0: 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
bbd0: 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
bbe0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
bbf0: 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
bc00: 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
bc10: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
bc20: 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
bc30: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
bc40: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
bc50: 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
bc60: 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
bc70: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
bc80: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
bc90: 6e 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  n..*/ .int sqlit
bca0: 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
bcb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
bcc0: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
bcd0: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
bce0: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
bcf0: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
bd00: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
bd10: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
bd20: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
bd30: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
bd40: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
bd50: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
bd60: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
bd70: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
bd80: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
bd90: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
bda0: 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70     v = *(u64*)&p
bdb0: 4d 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73  Mem->r;.    }els
bdc0: 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75  e{.      v = *(u
bdd0: 36 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20  64*)&pMem->i;.  
bde0: 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
bdf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
be00: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
be10: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69  l_type);.    whi
be20: 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
be30: 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46   buf[i] = (v&0xF
be40: 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
be50: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
be60: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
be70: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
be80: 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
be90: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
bea0: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56    len = sqlite3V
beb0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
bec0: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
bed0: 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
bee0: 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
bef0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
bf00: 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
bf10: 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
bf20: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
bf30: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
bf40: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
bf50: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
bf60: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
bf70: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
bf80: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
bf90: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
bfa0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
bfb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
bfc0: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
bfd0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
bfe0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
bff0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
c000: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
c010: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
c020: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
c030: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
c040: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
c050: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
c060: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
c090: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
c0a0: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
c0b0: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
c0c0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
c0d0: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
c0e0: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
c0f0: 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
c100: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
c110: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
c120: 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
c130: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
c140: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c150: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
c160: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c170: 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
c180: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
c190: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
c1a0: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
c1b0: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
c1c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c1d0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
c1e0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
c1f0: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
c200: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
c210: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
c220: 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  ->i = (((signed 
c230: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
c240: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
c250: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c260: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
c270: 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
c280: 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
c290: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
c2a0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
c2b0: 65 6d 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e 65  em->i = (((signe
c2c0: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
c2d0: 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
c2e0: 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
c2f0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c300: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
c310: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
c320: 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
c330: 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
c340: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
c350: 4d 65 6d 2d 3e 69 20 3d 20 28 62 75 66 5b 30 5d  Mem->i = (buf[0]
c360: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
c370: 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
c380: 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
c390: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c3a0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
c3b0: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
c3c0: 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
c3d0: 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
c3e0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
c3f0: 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
c400: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
c410: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
c420: 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
c430: 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
c440: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
c450: 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
c460: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
c470: 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
c480: 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  ->i = *(i64*)&x;
c490: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c4a0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
c4b0: 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
c4c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
c4d0: 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
c4e0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
c4f0: 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
c500: 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
c510: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  nt */.      u64 
c520: 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a  x;.      u32 y;.
c530: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
c540: 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
c550: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
c560: 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
c570: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
c580: 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
c590: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
c5a0: 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
c5b0: 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
c5c0: 6f 72 64 65 72 2e 20 20 54 68 65 20 62 79 74 65  order.  The byte
c5d0: 20 6f 72 64 65 72 20 64 69 66 66 65 72 73 20 6f   order differs o
c5e0: 6e 20 73 6f 6d 65 20 28 62 72 6f 6b 65 6e 29 20  n some (broken) 
c5f0: 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 0a 20  architectures.. 
c600: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
c610: 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
c620: 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
c630: 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
c640: 20 61 73 73 65 72 74 28 20 31 2e 30 3d 3d 2a 28   assert( 1.0==*(
c650: 64 6f 75 62 6c 65 2a 29 26 74 31 20 29 3b 0a 23  double*)&t1 );.#
c660: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
c670: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
c680: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
c690: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
c6a0: 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
c6b0: 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
c6c0: 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
c6d0: 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
c6e0: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
c6f0: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
c700: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
c710: 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
c720: 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26  em->i = *(i64*)&
c730: 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
c740: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
c750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c760: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d         pMem->r =
c770: 20 2a 28 64 6f 75 62 6c 65 2a 29 26 78 3b 0a 20   *(double*)&x;. 
c780: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
c790: 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  gs = MEM_Real;. 
c7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
c7b0: 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
c7c0: 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
c7d0: 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
c7e0: 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
c7f0: 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
c800: 20 70 4d 65 6d 2d 3e 69 20 3d 20 73 65 72 69 61   pMem->i = seria
c810: 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
c820: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c830: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
c840: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
c850: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c860: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72    int len = (ser
c870: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
c880: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
c890: 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
c8a0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
c8b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
c8c0: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
c8d0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
c8e0: 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
c8f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c900: 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
c910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c920: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c930: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
c940: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
c950: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
c960: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
c970: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c980: 2a 2a 20 54 68 65 20 68 65 61 64 65 72 20 6f 66  ** The header of
c990: 20 61 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73   a record consis
c9a0: 74 73 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65  ts of a sequence
c9b0: 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68   variable-length
c9c0: 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68   integers..** Th
c9d0: 65 73 65 20 69 6e 74 65 67 65 72 73 20 61 72 65  ese integers are
c9e0: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73   almost always s
c9f0: 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63  mall and are enc
ca00: 6f 64 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  oded as a single
ca10: 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f   byte..** The fo
ca20: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61  llowing macro ta
ca30: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 74 68  kes advantage th
ca40: 69 73 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69  is fact to provi
ca50: 64 65 20 61 20 66 61 73 74 20 64 65 63 6f 64 65  de a fast decode
ca60: 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67  .** of the integ
ca70: 65 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20  ers in a record 
ca80: 68 65 61 64 65 72 2e 20 20 49 74 20 69 73 20 66  header.  It is f
ca90: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
caa0: 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65  mmon case.** whe
cab0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  re the integer i
cac0: 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  s a single byte.
cad0: 20 20 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65    It is a little
cae0: 20 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65   slower when the
caf0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74  .** integer is t
cb00: 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73  wo or more bytes
cb10: 2e 20 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69  .  But overall i
cb20: 74 20 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  t is faster..**.
cb30: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
cb40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
cb50: 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a   equivalent:.**.
cb60: 2a 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  **     x = sqlit
cb70: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 20 41  e3GetVarint32( A
cb80: 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  , &B );.**.**   
cb90: 20 20 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28    x = GetVarint(
cba0: 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23   A, B );.**.*/.#
cbb0: 64 65 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74  define GetVarint
cbc0: 28 41 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41  (A,B)  ((B = *(A
cbd0: 29 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73  ))<=0x7f ? 1 : s
cbe0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
cbf0: 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a  2(A, &B))../*.**
cc00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
cc10: 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
cc20: 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
cc30: 64 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63  dex records spec
cc40: 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b  ified by .** {nK
cc50: 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
cc60: 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20  {nKey2, pKey2}, 
cc70: 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61  returning a nega
cc80: 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
cc90: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
cca0: 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  r if {nKey1, pKe
ccb0: 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e  y1} is less than
ccc0: 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
ccd0: 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b  * greater than {
cce0: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20  nKey2, pKey2}.  
ccf0: 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65  Both Key1 and Ke
cd00: 79 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20  y2 must be byte 
cd10: 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f  strings.** compo
cd20: 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  sed by the OP_Ma
cd30: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
cd40: 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a  of the VDBE..*/.
cd50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
cd60: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
cd70: 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a  void *userData,.
cd80: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
cd90: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
cda0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
cdb0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
cdc0: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ){.  KeyInfo *pK
cdd0: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66  eyInfo = (KeyInf
cde0: 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75  o*)userData;.  u
cdf0: 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20  32 d1, d2;      
ce00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
ce10: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
ce20: 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
ce30: 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64  /.  u32 idx1, id
ce40: 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  x2;      /* Offs
ce50: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
ce60: 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
ce70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
ce80: 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20  zHdr1, szHdr2;  
ce90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
cea0: 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
ceb0: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
cec0: 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
ced0: 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
cee0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
cef0: 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
cf00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
cf10: 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Key1;.  const un
cf20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
cf30: 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y2 = (const unsi
cf40: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
cf50: 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  2;..  Mem mem1;.
cf60: 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65    Mem mem2;.  me
cf70: 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
cf80: 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65  o->enc;.  mem2.e
cf90: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
cfa0: 6e 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20  nc;.  .  idx1 = 
cfb0: 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c  GetVarint(aKey1,
cfc0: 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
cfd0: 20 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20   szHdr1;.  idx2 
cfe0: 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79  = GetVarint(aKey
cff0: 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32  2, szHdr2);.  d2
d000: 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69   = szHdr2;.  nFi
d010: 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
d020: 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
d030: 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
d040: 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20  idx2<szHdr2 ){. 
d050: 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
d060: 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72  pe1;.    u32 ser
d070: 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20  ial_type2;..    
d080: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
d090: 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
d0a0: 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
d0b0: 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
d0c0: 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72    idx1 += GetVar
d0d0: 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  int( aKey1+idx1,
d0e0: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
d0f0: 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
d100: 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
d110: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
d120: 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
d130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32   break;.    idx2
d140: 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61   += GetVarint( a
d150: 4b 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61  Key2+idx2, seria
d160: 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69  l_type2 );.    i
d170: 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20  f( d2>=nKey2 && 
d180: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d190: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
d1a0: 74 79 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b  type2)>0 ) break
d1b0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73 65 72 74  ;..    /* Assert
d1c0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
d1d0: 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
d1e0: 20 69 6e 20 65 61 63 68 20 6b 65 79 20 66 6f 72   in each key for
d1f0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 0a 20 20 20   the blob of.   
d200: 20 2a 2a 20 64 61 74 61 20 74 6f 20 67 6f 20 77   ** data to go w
d210: 69 74 68 20 74 68 65 20 73 65 72 69 61 6c 20 74  ith the serial t
d220: 79 70 65 20 6a 75 73 74 20 72 65 61 64 2e 20 54  ype just read. T
d230: 68 69 73 20 61 73 73 65 72 74 20 6d 61 79 20 66  his assert may f
d240: 61 69 6c 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ail if.    ** th
d250: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
d260: 74 65 64 2e 20 20 54 68 65 6e 20 72 65 61 64 20  ted.  Then read 
d270: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 65  the value from e
d280: 61 63 68 20 6b 65 79 20 69 6e 74 6f 20 6d 65 6d  ach key into mem
d290: 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6d 65 6d  1.    ** and mem
d2a0: 32 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  2 respectively..
d2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
d2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d2d0: 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
d2e0: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
d2f0: 26 6d 65 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b  &mem1);.    d2 +
d300: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
d310: 69 61 6c 47 65 74 28 26 61 4b 65 79 32 5b 64 32  ialGet(&aKey2[d2
d320: 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 2c  ], serial_type2,
d330: 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20 72 63   &mem2);..    rc
d340: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
d350: 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d  pare(&mem1, &mem
d360: 32 2c 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b  2, i<nField ? pK
d370: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
d380: 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6d   : 0);.    if( m
d390: 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em1.flags & MEM_
d3a0: 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  Dyn ) sqlite3Vdb
d3b0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
d3c0: 31 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 32  1);.    if( mem2
d3d0: 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  .flags & MEM_Dyn
d3e0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
d3f0: 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b  mRelease(&mem2);
d400: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
d410: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
d420: 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
d430: 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  }..  /* One of t
d440: 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
d450: 6f 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61  of fields, but a
d460: 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
d470: 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20   to that point. 
d480: 20 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20   ** were equal. 
d490: 49 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66  If the incrKey f
d4a0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
d4b0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79  n the second key
d4c0: 20 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64   is.  ** treated
d4d0: 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f   as larger..  */
d4e0: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
d4f0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
d500: 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20  ->incrKey ){.   
d510: 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
d520: 7d 65 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65  }else if( d1<nKe
d530: 79 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  y1 ){.      rc =
d540: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
d550: 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20  ( d2<nKey2 ){.  
d560: 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
d570: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
d580: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
d590: 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66  der && i<pKeyInf
d5a0: 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20  o->nField.      
d5b0: 20 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79           && pKey
d5c0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
d5d0: 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [i] ){.    rc = 
d5e0: 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -rc;.  }..  retu
d5f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d600: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
d610: 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
d620: 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68  omposed using th
d630: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
d640: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c  opcode..** The l
d650: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ast entry in thi
d660: 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  s record should 
d670: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73  be an integer (s
d680: 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61  pecifically.** a
d690: 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29  n integer rowid)
d6a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d6b0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
d6c0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a  er of bytes in.*
d6d0: 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a  * that integer..
d6e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
d6f0: 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f  beIdxRowidLen(co
d700: 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
d710: 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
d720: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
d730: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
d740: 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
d750: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
d760: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a  f the rowid */..
d770: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
d780: 6e 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64  nt32(aKey, &szHd
d790: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
d7a0: 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
d7b0: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
d7c0: 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
d7d0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d7e0: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
d7f0: 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  d);.}.  ../*.** 
d800: 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
d810: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
d820: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
d830: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
d840: 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
d850: 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
d860: 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
d870: 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
d880: 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
d890: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
d8a0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
d8b0: 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
d8c0: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
d8d0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
d8e0: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
d8f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
d900: 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
d910: 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e  4 nCellKey;.  in
d920: 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
d930: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
d940: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
d950: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
d960: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
d970: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
d980: 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
d990: 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
d9a0: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
d9b0: 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
d9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
d9d0: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
d9e0: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
d9f0: 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
da00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
da10: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
da20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
da30: 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
da40: 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
da50: 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
da60: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
da70: 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   rc;.  }.  sqlit
da80: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
da90: 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b  8*)m.z, &szHdr);
daa0: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
dab0: 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
dac0: 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52  szHdr-1], &typeR
dad0: 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69  owid);.  lenRowi
dae0: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
daf0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
db00: 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  eRowid);.  sqlit
db10: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
db20: 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
db30: 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
db40: 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
db50: 64 20 3d 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74  d = v.i;.  sqlit
db60: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
db70: 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
db80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
db90: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
dba0: 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
dbb0: 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
dbc0: 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f  r pC is point to
dbd0: 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
dbe0: 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b  key string in pK
dbf0: 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b  ey (of length nK
dc00: 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ey).  Write into
dc10: 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
dc20: 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
dc30: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
dc40: 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
dc50: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
dc60: 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
dc70: 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52  er than pKey.  R
dc80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
dc90: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
dca0: 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72  * pKey is either
dcb0: 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
dcc0: 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
dcd0: 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
dce0: 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
dcf0: 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
dd00: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
dd10: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
dd20: 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
dd30: 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
dd40: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
dd50: 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
dd60: 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43  re(.  Cursor *pC
dd70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dd80: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
dd90: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
dda0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  st */.  int nKey
ddb0: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79  , const u8 *pKey
ddc0: 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74  ,   /* The key t
ddd0: 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
dde0: 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
ddf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
de00: 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
de10: 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
de20: 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
de30: 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Key;.  int rc;. 
de40: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
de50: 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
de60: 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20   int lenRowid;. 
de70: 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74   Mem m;..  sqlit
de80: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
de90: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
dea0: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
deb0: 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  =0 ){.    *res =
dec0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
ded0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
dee0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
def0: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
df00: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65  >pCursor, 0, nCe
df10: 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
df20: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
df30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
df40: 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
df50: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
df60: 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a  n((u8*)m.z);.  *
df70: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
df80: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70  eRecordCompare(p
df90: 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e  C->pKeyInfo, m.n
dfa0: 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20  -lenRowid, m.z, 
dfb0: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73  nKey, pKey);.  s
dfc0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
dfd0: 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
dfe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dff0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e000: 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
e010: 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
e020: 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
e030: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
e040: 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
e050: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
e060: 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
e070: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
e080: 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
e090: 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
e0a0: 67 65 29 7b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ge){.  db->nChan
e0b0: 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
e0c0: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
e0d0: 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
e0e0: 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
e0f0: 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
e100: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
e110: 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
e120: 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
e130: 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
e140: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
e150: 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
e160: 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
e170: 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
e180: 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
e190: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
e1a0: 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
e1b0: 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
e1c0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
e1d0: 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
e1e0: 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
e1f0: 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
e200: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
e210: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
e220: 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
e230: 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
e240: 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
e250: 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
e260: 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
e270: 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
e280: 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
e290: 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
e2a0: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
e2b0: 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
e2c0: 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
e2d0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
e2e0: 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
e2f0: 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
e300: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e310: 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
e320: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
e330: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
e340: 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
e350: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
e360: 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
e370: 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
e380: 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
e390: 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
e3a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e3b0: 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
e3c0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
e3d0: 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
e3e0: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
e3f0: 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
e400: 20 76 2d 3e 64 62 3b 0a 7d 0a                     v->db;.}.