/ Hex Artifact Content
Login

Artifact e7f448c58de1115cecf1d1e0fbb707778b630e00:


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 45 70 68  >flags = MEM_Eph
49b0: 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  em|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 6e 20 3d 20  ;.    pMem->n = 
4a20: 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b  strlen(pMem->z);
4a30: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
4a40: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
4a50: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
4a60: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20  QLITE_UTF8;..   
4a70: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
4a80: 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61   5 - 2*(p->expla
4a90: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54  in-1);.    p->pT
4aa0: 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70  os = pMem;.    p
4ab0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
4ac0: 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74  ;.    p->resOnSt
4ad0: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  ack = 1;.    rc 
4ae0: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
4af0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4b00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4b10: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
4b20: 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  /../*.** Print t
4b30: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
4b40: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
4b50: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
4b60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4b70: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
4b80: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
4b90: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
4ba0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
4bb0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
4bc0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
4bd0: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
4be0: 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66  aOp[nOp-1];.  if
4bf0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4c00: 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70  P_Noop && pOp->p
4c10: 33 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  3!=0 ){.    cons
4c20: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
4c30: 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  >p3;.    while( 
4c40: 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29  isspace(*(u8*)z)
4c50: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
4c60: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
4c70: 2c 20 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , z);.  }.#endif
4c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
4c90: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
4ca0: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
4cb0: 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  n.  This involve
4cc0: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
4cd0: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73   as allocating s
4ce0: 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69  tack space and i
4cf0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
4d00: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
4d10: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
4d20: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
4d30: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
4d40: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
4d50: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
4d60: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
4d70: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
4d80: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
4d90: 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20   to move a VDBE 
4da0: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
4db0: 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  INIT to.** VDBE_
4dc0: 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f  MAGIC_RUN..*/.vo
4dd0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
4de0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
4df0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
4e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4e10: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
4e20: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
4e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4e40: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
4e50: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
4e60: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ent */.  int nMe
4e70: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
4e80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4e90: 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  r of memory cell
4ea0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
4eb0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20  .  int nCursor, 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4ee0: 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61  ursors to alloca
4ef0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78  te */.  int isEx
4f00: 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20  plain           
4f10: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4f20: 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  f the EXPLAIN ke
4f30: 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e  ywords is presen
4f40: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  t */.){.  int n;
4f50: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
4f60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
4f70: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4f80: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
4f90: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
4fa0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
4fb0: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
4fc0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
4fd0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
4fe0: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
4ff0: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
5000: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
5010: 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65   This.   * is be
5020: 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
5030: 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28  o resizeOpArray(
5040: 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69  ) below may shri
5050: 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61  nk the.   * p->a
5060: 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61  Op[] array to sa
5070: 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c  ve memory if cal
5080: 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45  led when in VDBE
5090: 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a  _MAGIC_RUN .   *
50a0: 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20   state..   */.  
50b0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
50c0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a  MAGIC_RUN;..  /*
50d0: 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   No instruction 
50e0: 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65  ever pushes more
50f0: 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65   than a single e
5100: 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a  lement onto the.
5110: 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64    ** stack.  And
5120: 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72   the stack never
5130: 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73   grows on succes
5140: 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20  sive executions 
5150: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  of the.  ** same
5160: 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74   loop.  So the t
5170: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
5180: 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61  nstructions is a
5190: 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20  n upper bound.  
51a0: 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75  ** on the maximu
51b0: 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20 72 65  m stack depth re
51c0: 71 75 69 72 65 64 2e 20 20 28 41 64 64 65 64 20  quired.  (Added 
51d0: 6c 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a  later:)  The.  *
51e0: 2a 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  * resolveP2Value
51f0: 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65  s() call compute
5200: 73 20 61 20 74 69 67 68 74 65 72 20 75 70 70 65  s a tighter uppe
5210: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20  r bound on the. 
5220: 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a   ** stack size..
5230: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    **.  ** Alloca
5240: 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61  tion all the sta
5250: 63 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c  ck space we will
5260: 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f   ever need..  */
5270: 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  .  if( p->aStack
5280: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
5290: 41 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  Arg;       /* Ma
52a0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
52b0: 61 72 67 73 20 70 61 73 73 65 64 20 74 6f 20 61  args passed to a
52c0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20   user function. 
52d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63  */.    int nStac
52e0: 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75  k;     /* Maximu
52f0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63  m number of stac
5300: 6b 20 65 6e 74 72 69 65 73 20 72 65 71 75 69 72  k entries requir
5310: 65 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76  ed */.    resolv
5320: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
5330: 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20  rg, &nStack);.  
5340: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
5350: 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  p, p->nOp);.    
5360: 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20  assert( nVar>=0 
5370: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
5380: 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  Stack<p->nOp );.
5390: 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 69 73 45      nStack = isE
53a0: 78 70 6c 61 69 6e 20 3f 20 31 30 20 3a 20 6e 53  xplain ? 10 : nS
53b0: 74 61 63 6b 3b 0a 20 20 20 20 70 2d 3e 61 53 74  tack;.    p->aSt
53c0: 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ack = sqliteMall
53d0: 6f 63 28 0a 20 20 20 20 20 20 20 20 6e 53 74 61  oc(.        nSta
53e0: 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74  ck*sizeof(p->aSt
53f0: 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53  ack[0])    /* aS
5400: 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20  tack */.      + 
5410: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
5420: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
5430: 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20  * apArg */.     
5440: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d   + nVar*sizeof(M
5450: 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20  em)             
5460: 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20    /* aVar */.   
5470: 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66     + nVar*sizeof
5480: 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20 20  (char*)         
5490: 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a      /* azVar */.
54a0: 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a        + nMem*siz
54b0: 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20  eof(Mem)        
54c0: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a         /* aMem *
54d0: 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f  /.      + nCurso
54e0: 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a  r*sizeof(Cursor*
54f0: 29 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 73  )        /* apCs
5500: 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20  r */.    );.    
5510: 69 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c  if( !sqlite3Mall
5520: 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20  ocFailed() ){.  
5530: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26 70      p->aMem = &p
5540: 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b 5d  ->aStack[nStack]
5550: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  ;.      p->nMem 
5560: 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 2d  = nMem;.      p-
5570: 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d  >aVar = &p->aMem
5580: 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70 2d  [nMem];.      p-
5590: 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20  >nVar = nVar;.  
55a0: 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30      p->okVar = 0
55b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67  ;.      p->apArg
55c0: 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56   = (Mem**)&p->aV
55d0: 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20  ar[nVar];.      
55e0: 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72  p->azVar = (char
55f0: 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72  **)&p->apArg[nAr
5600: 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  g];.      p->apC
5610: 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26  sr = (Cursor**)&
5620: 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a  p->azVar[nVar];.
5630: 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72        p->nCursor
5640: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
5650: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
5660: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; n++){.       
5670: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
5680: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
5690: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
56a0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e    for(n=0; n<p->
56b0: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
56c0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
56d0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d   = MEM_Null;.  }
56e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
56f0: 44 45 42 55 47 0a 20 20 69 66 28 20 28 70 2d 3e  DEBUG.  if( (p->
5700: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5710: 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 21  TE_VdbeListing)!
5720: 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74 65  =0.    || sqlite
5730: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22 76  3OsFileExists("v
5740: 64 62 65 5f 65 78 70 6c 61 69 6e 22 29 0a 20 20  dbe_explain").  
5750: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5760: 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50    printf("VDBE P
5770: 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c  rogram Listing:\
5780: 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
5790: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
57a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
57b0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
57c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
57d0: 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69  rintOp(stdout, i
57e0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
57f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
5800: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
5810: 74 73 28 22 76 64 62 65 5f 74 72 61 63 65 22 29  ts("vdbe_trace")
5820: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65   ){.    p->trace
5830: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 23   = stdout;.  }.#
5840: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 54 6f 73 20  endif.  p->pTos 
5850: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d  = &p->aStack[-1]
5860: 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  ;.  p->pc = -1;.
5870: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
5880: 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65  _OK;.  p->unique
5890: 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65  Cnt = 0;.  p->re
58a0: 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20  turnDepth = 0;. 
58b0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
58c0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
58d0: 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a  >popStack =  0;.
58e0: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20    p->explain |= 
58f0: 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e  isExplain;.  p->
5900: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
5910: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
5920: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
5930: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
5940: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
5950: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 23 69 66 64  rmat = 255;.#ifd
5960: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
5970: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
5980: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5990: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
59a0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
59b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
59c0: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
59d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
59e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
59f0: 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65   a cursor and re
5a00: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
5a10: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
5a20: 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a 20 74  sor happens.** t
5a30: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
5a40: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
5a50: 75 72 73 6f 72 28 43 75 72 73 6f 72 20 2a 70 43  ursor(Cursor *pC
5a60: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
5a70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
5a80: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
5a90: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
5aa0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
5ab0: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
5ac0: 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  or);.  }.  if( p
5ad0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
5ae0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
5af0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a  (pCx->pBt);.  }.
5b00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 78    sqliteFree(pCx
5b10: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->pData);.  sqli
5b20: 74 65 46 72 65 65 28 70 43 78 2d 3e 61 54 79 70  teFree(pCx->aTyp
5b30: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
5b40: 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pCx);.}../*.** 
5b50: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
5b60: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
5b70: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
5b80: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5b90: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
5ba0: 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  sr==0 ) return;.
5bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5bc0: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
5bd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
5be0: 65 65 43 75 72 73 6f 72 28 70 2d 3e 61 70 43 73  eeCursor(p->apCs
5bf0: 72 5b 69 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 70  r[i]);.    p->ap
5c00: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  Csr[i] = 0;.  }.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
5c20: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
5c30: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
5c40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
5c50: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
5c60: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
5c70: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
5c80: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
5c90: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
5ca0: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
5cb0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
5cc0: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
5cd0: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
5ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5cf0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
5d00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
5d10: 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20  ( p->aStack ){. 
5d20: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
5d30: 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 31 20  ay(p->aStack, 1 
5d40: 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e  + (p->pTos - p->
5d50: 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 70 2d  aStack));.    p-
5d60: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
5d70: 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c  ck[-1];.  }.  cl
5d80: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
5d90: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
5da0: 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e  ray(p->aMem, p->
5db0: 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  nMem);.  sqlite3
5dc0: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
5dd0: 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66 28 20  ->sFifo);.  if( 
5de0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20  p->contextStack 
5df0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
5e00: 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  i<p->contextStac
5e10: 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  kTop; i++){.    
5e20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66    sqlite3VdbeFif
5e30: 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e 74 65  oClear(&p->conte
5e40: 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69 66 6f  xtStack[i].sFifo
5e50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5e60: 69 74 65 46 72 65 65 28 70 2d 3e 63 6f 6e 74 65  iteFree(p->conte
5e70: 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20  xtStack);.  }.  
5e80: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20  p->contextStack 
5e90: 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78  = 0;.  p->contex
5ea0: 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b  tStackDepth = 0;
5eb0: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
5ec0: 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c  ckTop = 0;.  sql
5ed0: 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d  iteFree(p->zErrM
5ee0: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
5ef0: 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
5f00: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
5f10: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5f20: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
5f30: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
5f40: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
5f50: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
5f60: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
5f70: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
5f80: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
5f90: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
5fa0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
5fb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
5fc0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
5fd0: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
5fe0: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
5ff0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
6000: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6010: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
6020: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
6030: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
6040: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
6050: 6e 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  n;.  releaseMemA
6060: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
6070: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
6080: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
6090: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c  liteFree(p->aCol
60a0: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
60b0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
60c0: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
60d0: 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b  mn = nResColumn;
60e0: 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
60f0: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
6100: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  *)sqliteMalloc( 
6110: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
6120: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
6130: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
6140: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
6150: 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61 6d   ){.    (pColNam
6160: 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  e++)->flags = ME
6170: 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  M_Null;.  }.}../
6180: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
6190: 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
61a0: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
61b0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
61c0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
61d0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
61e0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
61f0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
6200: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
6210: 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
6220: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
6230: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
6240: 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  mCols()..**.** I
6250: 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20  f N==P3_STATIC  
6260: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e  it means that zN
6270: 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ame is a pointer
6280: 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73   to a constant s
6290: 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20  tatic.** string 
62a0: 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20  and we can just 
62b0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
62c0: 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44 59  . If it is P3_DY
62d0: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20  NAMIC, then .** 
62e0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66 72  the string is fr
62f0: 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
6300: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
6310: 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65 64  vdbe is finished
6320: 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68   with.** it. Oth
6330: 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20  erwise, N bytes 
6340: 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70  of zName are cop
6350: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
6360: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6370: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
6380: 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e  dx, int var, con
6390: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
63a0: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63  int N){.  int rc
63b0: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
63c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
63d0: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
63e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
63f0: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
6400: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
6410: 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75 72  Failed() ) retur
6420: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
6440: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
6450: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
6460: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
6470: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
6480: 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41    if( N==P3_DYNA
6490: 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41  MIC || N==P3_STA
64a0: 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TIC ){.    rc = 
64b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
64c0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
64d0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
64e0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
64f0: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
6500: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6510: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
6520: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e  olName, zName, N
6530: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51  , SQLITE_UTF8,SQ
6540: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
6550: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
6560: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50  QLITE_OK && N==P
6570: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
6580: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
6590: 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c   = (pColName->fl
65a0: 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63  ags&(~MEM_Static
65b0: 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20  ))|MEM_Dyn;.    
65c0: 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d  pColName->xDel =
65d0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
65e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
65f0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
6600: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
6610: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
6620: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
6630: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
6640: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6650: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
6660: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
6670: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
6680: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
6690: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
66a0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
66b0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
66c0: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
66d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
66e0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
66f0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
6700: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
6710: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
6720: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
6730: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
6740: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
6750: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6760: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
6770: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
6780: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
6790: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
67a0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
67b0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
67c0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
67d0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
67e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
67f0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
6800: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
6810: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
6820: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
6830: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6840: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
6850: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
6860: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
6870: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
6880: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
6890: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
68a0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
68b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  ){.    sqlite3Sa
68c0: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
68d0: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
68e0: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
68f0: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73  ommitArg);.    s
6900: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
6910: 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  b);.    if( rc )
6920: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6930: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
6940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
6950: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
6960: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
6970: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
6980: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
6990: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
69a0: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
69b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
69c0: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
69d0: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
69e0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
69f0: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
6a00: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
6a10: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
6a20: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
6a30: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
6a40: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
6a50: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
6a60: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
6a70: 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  y:.  In that cas
6a80: 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  e we do.  ** not
6a90: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
6aa0: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
6ab0: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73  ts, so use the s
6ac0: 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a  imple case then.
6ad0: 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20    ** too..  */. 
6ae0: 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73   if( 0==strlen(s
6af0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
6b00: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
6b10: 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e  ].pBt)) || nTran
6b20: 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28  s<=1 ){.    for(
6b30: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6b40: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6b50: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
6b60: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
6b70: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
6b80: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
6b90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6ba0: 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20 30  BtreeSync(pBt, 0
6bb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6bc0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
6bd0: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
6be0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
6bf0: 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
6c00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
6c10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6c20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
6c30: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6c40: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
6c50: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
6c60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
6c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
6c80: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
6c90: 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  t(pBt);.        
6ca0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6cb0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
6cc0: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
6cd0: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
6ce0: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
6cf0: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
6d00: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
6d10: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6d20: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
6d30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
6d40: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
6d50: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
6d60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6d70: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
6d80: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  se{.    int need
6d90: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
6da0: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
6db0: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
6dc0: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
6dd0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
6de0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
6df0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
6e00: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
6e10: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
6e20: 20 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65     OsFile *maste
6e30: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  r = 0;..    /* S
6e40: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
6e50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6e60: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
6e70: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20     u32 random;. 
6e80: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6e90: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
6ea0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
6eb0: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
6ec0: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
6ed0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
6ee0: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2d 6d  te3MPrintf("%s-m
6ef0: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
6f00: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
6f10: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
6f20: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
6f30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6f40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6f50: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
6f60: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
6f70: 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a 0a 20  s(zMaster) );.. 
6f80: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
6f90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
6fa0: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
6fb0: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
6fc0: 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  e(zMaster, &mast
6fd0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
6fe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7000: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7010: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7020: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
7030: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
7040: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
7050: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
7060: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
7070: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
7080: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
7090: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
70a0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
70b0: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
70c0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
70d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
70e0: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
70f0: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
7100: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
7110: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
7120: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
7130: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
7140: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
7150: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
7160: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
7170: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
7180: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
7190: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
71a0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
71b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
71c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
71d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f   ) continue;   /
71e0: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d  * Ignore the TEM
71f0: 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
7200: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
7210: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
7220: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
7230: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
7240: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
7250: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
7260: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
7270: 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
7280: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
7290: 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79  * Ignore :memory
72a0: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
72b0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
72c0: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
72d0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
72e0: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
72f0: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
7300: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7310: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7320: 4f 73 57 72 69 74 65 28 6d 61 73 74 65 72 2c 20  OsWrite(master, 
7330: 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46  zFile, strlen(zF
7340: 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 20  ile)+1);.       
7350: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7360: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
7370: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7380: 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  master);.       
7390: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
73a0: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  te(zMaster);.   
73b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
73c0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
73d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
73e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
73f0: 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f   }.    }...    /
7400: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
7410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
7420: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
7430: 73 2c 20 6f 70 65 6e 20 74 68 65 20 64 69 72 65  s, open the dire
7440: 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74 68 65  ctory.    ** the
7450: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7460: 66 69 6c 65 20 69 73 20 73 74 6f 72 65 20 69 6e  file is store in
7470: 20 73 6f 20 74 68 61 74 20 69 74 20 67 65 74 73   so that it gets
7480: 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20 20 20   synced too..   
7490: 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c   */.    zMainFil
74a0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
74b0: 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61  GetDirname(db->a
74c0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
74d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
74e0: 65 6e 44 69 72 65 63 74 6f 72 79 28 6d 61 73 74  enDirectory(mast
74f0: 65 72 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  er, zMainFile);.
7500: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7510: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
7520: 20 20 20 28 6e 65 65 64 53 79 6e 63 20 26 26 20     (needSync && 
7530: 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e  (rc=sqlite3OsSyn
7540: 63 28 6d 61 73 74 65 72 2c 30 29 29 21 3d 53 51  c(master,0))!=SQ
7550: 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
7560: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7570: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
7580: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7590: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
75a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
75b0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
75c0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
75d0: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
75e0: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
75f0: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
7600: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
7610: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
7620: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
7630: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
7640: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
7650: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
7660: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
7670: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
7680: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
7690: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
76a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
76b0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
76c0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
76d0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
76e0: 65 33 42 74 72 65 65 53 79 6e 63 28 29 2c 0a 20  e3BtreeSync(),. 
76f0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
7700: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
7710: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
7720: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
7730: 65 0a 20 20 20 20 2a 2a 20 6f 72 70 68 61 6e 65  e.    ** orphane
7740: 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
7750: 20 64 65 6c 65 74 65 20 69 74 2c 20 69 6e 20 63   delete it, in c
7760: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
7770: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
7780: 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
7790: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
77a0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
77b0: 20 74 68 65 20 66 61 69 6c 75 72 65 0a 20 20 20   the failure.   
77c0: 20 2a 2a 20 6f 63 63 75 72 65 64 2e 0a 20 20 20   ** occured..   
77d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
77e0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
77f0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
7800: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
7810: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
7820: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
7830: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
7840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
7850: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  = sqlite3BtreeSy
7860: 6e 63 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  nc(pBt, zMaster)
7870: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
7880: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7890: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
78a0: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
78b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
78c0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
78d0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
78e0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
78f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7900: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7910: 28 26 6d 61 73 74 65 72 29 3b 0a 0a 20 20 20 20  (&master);..    
7920: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
7930: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
7940: 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
7950: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
7960: 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
7970: 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
7980: 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
7990: 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
79a0: 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
79b0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
79c0: 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
79d0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
79e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
79f0: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  te(zMaster);.   
7a00: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
7a10: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71  ITE_OK );.    sq
7a20: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
7a30: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
7a40: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
7a50: 69 74 65 33 4f 73 53 79 6e 63 44 69 72 65 63 74  ite3OsSyncDirect
7a60: 6f 72 79 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  ory(zMainFile);.
7a70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7a80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
7a90: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 6f  * This is not go
7aa0: 6f 64 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  od. The master j
7ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
7ac0: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 62 75  been deleted, bu
7ad0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  t.      ** the d
7ae0: 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 66 61  irectory sync fa
7af0: 69 6c 65 64 2e 20 54 68 65 72 65 20 69 73 20 6e  iled. There is n
7b00: 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 66  o completely saf
7b10: 65 20 63 6f 75 72 73 65 20 6f 66 0a 20 20 20 20  e course of.    
7b20: 20 20 2a 2a 20 61 63 74 69 6f 6e 20 66 72 6f 6d    ** action from
7b30: 20 68 65 72 65 2e 20 54 68 65 20 69 6e 64 69 76   here. The indiv
7b40: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 63  idual journals c
7b50: 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20  ontain the name 
7b60: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
7b70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7b80: 69 6c 65 2c 20 62 75 74 20 74 68 65 72 65 20 69  ile, but there i
7b90: 73 20 6e 6f 20 77 61 79 20 6f 66 20 6b 6e 6f 77  s no way of know
7ba0: 69 6e 67 20 69 66 20 74 68 61 74 0a 20 20 20 20  ing if that.    
7bb0: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
7bc0: 6e 61 6c 20 65 78 69 73 74 73 20 6e 6f 77 20 6f  nal exists now o
7bd0: 72 20 69 66 20 69 74 20 77 69 6c 6c 20 65 78 69  r if it will exi
7be0: 73 74 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  st after the ope
7bf0: 72 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  rating.      ** 
7c00: 73 79 73 74 65 6d 20 63 72 61 73 68 20 74 68 61  system crash tha
7c10: 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68 65  t may follow the
7c20: 20 66 73 79 6e 63 28 29 20 66 61 69 6c 75 72 65   fsync() failure
7c30: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7c40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7c50: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
7c60: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
7c70: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
7c80: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
7c90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
7ca0: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
7cb0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
7cc0: 74 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  t() are only clo
7cd0: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 20 64  sing files and d
7ce0: 65 6c 65 74 69 6e 67 0a 20 20 20 20 2a 2a 20 6a  eleting.    ** j
7cf0: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
7d00: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7d10: 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68   while this is h
7d20: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
7d30: 74 0a 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20  t.    ** really 
7d40: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
7d50: 69 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ity of the trans
7d60: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
7d70: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 0a 20 20  y guaranteed,.  
7d80: 20 20 2a 2a 20 62 75 74 20 73 6f 6d 65 20 73 74    ** but some st
7d90: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
7da0: 61 6c 73 20 6d 61 79 20 62 65 20 6c 79 69 6e 67  als may be lying
7db0: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
7dc0: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72 72  ng an.    ** err
7dd0: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
7de0: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
7df0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
7e00: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7e10: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
7e20: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7e30: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
7e40: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
7e50: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
7e60: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
7e70: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7e80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7e90: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72  ./*.** Find ever
7ea0: 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65  y active VM othe
7eb0: 72 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64  r than pVdbe and
7ec0: 20 63 68 61 6e 67 65 20 69 74 73 20 73 74 61 74   change its stat
7ed0: 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64  us to.** aborted
7ee0: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
7ef0: 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73  when one VM caus
7f00: 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75  es a rollback du
7f10: 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f  e to an.** ON CO
7f20: 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20  NFLICT ROLLBACK 
7f30: 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d  clause (for exam
7f40: 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72  ple).  The other
7f50: 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20   VMs must be.** 
7f60: 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20  aborted so that 
7f70: 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65  they do not have
7f80: 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74   data rolled out
7f90: 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68   from underneath
7fa0: 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67  .** them leading
7fb0: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a   to a segfault..
7fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7fd0: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
7fe0: 64 62 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  dbes(sqlite3 *db
7ff0: 2c 20 56 64 62 65 20 2a 70 45 78 63 65 70 74 29  , Vdbe *pExcept)
8000: 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72  {.  Vdbe *pOther
8010: 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 64  ;.  for(pOther=d
8020: 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72  b->pVdbe; pOther
8030: 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d  ; pOther=pOther-
8040: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
8050: 20 70 4f 74 68 65 72 3d 3d 70 45 78 63 65 70 74   pOther==pExcept
8060: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8070: 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67   if( pOther->mag
8080: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
8090: 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63  UN || pOther->pc
80a0: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
80b0: 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f     closeAllCurso
80c0: 72 73 28 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  rs(pOther);.    
80d0: 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64 20  pOther->aborted 
80e0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  = 1;.  }.}../* .
80f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8100: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
8110: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
8120: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
8130: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
8140: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
8150: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
8160: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
8170: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
8180: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
8190: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
81a0: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
81b0: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
81c0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
81d0: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
81e0: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
81f0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
8200: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
8210: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
8220: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
8230: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
8240: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
8250: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
8260: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
8270: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8280: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
8290: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  cnt = 0;.  p = d
82a0: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
82b0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
82c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
82d0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
82e0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
82f0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t++;.    }.    p
8300: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
8310: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
8320: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
8330: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
8340: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
8350: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
8360: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
8370: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8380: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
8390: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
83a0: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
83b0: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
83c0: 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
83d0: 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
83e0: 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
83f0: 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
8400: 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
8410: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
8420: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
8430: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
8440: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
8450: 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
8460: 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
8470: 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
8480: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
8490: 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ALT..**.** Retur
84a0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
84b0: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
84c0: 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
84d0: 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
84e0: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
84f0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
8500: 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
8510: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
8520: 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
8530: 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
8540: 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
8550: 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
8560: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8570: 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
8580: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8590: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
85a0: 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63  i;.  int (*xFunc
85b0: 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20  )(Btree *pBt) = 
85c0: 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  0;  /* Function 
85d0: 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20  to call on each 
85e0: 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f  btree backend */
85f0: 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c  .  int isSpecial
8600: 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
8610: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
8620: 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   if SQLITE_NOMEM
8630: 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20   or IOERR */..  
8640: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
8650: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
8660: 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
8670: 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
8680: 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
8690: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
86a0: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
86b0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
86c0: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
86d0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
86e0: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
86f0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  e. .  **.  ** Sp
8700: 65 63 69 61 6c 20 65 72 72 6f 72 73 3a 0a 20 20  ecial errors:.  
8710: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20 61  **.  **     If a
8720: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 65  n SQLITE_NOMEM e
8730: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
8740: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
8750: 74 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a 20  that writes to. 
8760: 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74 61   **     the data
8770: 62 61 73 65 2c 20 74 68 65 6e 20 65 69 74 68 65  base, then eithe
8780: 72 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  r a statement or
8790: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
87a0: 74 20 62 65 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t be rolled.  **
87b0: 20 20 20 20 20 62 61 63 6b 20 74 6f 20 65 6e 73       back to ens
87c0: 75 72 65 20 74 68 65 20 74 72 65 65 2d 73 74 72  ure the tree-str
87d0: 75 63 74 75 72 65 73 20 61 72 65 20 69 6e 20 61  uctures are in a
87e0: 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
87f0: 65 2e 20 41 0a 20 20 2a 2a 20 20 20 20 20 73 74  e. A.  **     st
8800: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
8810: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
8820: 63 6b 20 69 66 20 6f 6e 65 20 69 73 20 6f 70 65  ck if one is ope
8830: 6e 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65  n, otherwise the
8840: 0a 20 20 2a 2a 20 20 20 20 20 65 6e 74 69 72 65  .  **     entire
8850: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
8860: 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
8870: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
8880: 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  If an SQLITE_IOE
8890: 52 52 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  RR error has occ
88a0: 75 72 65 64 20 69 6e 20 61 20 73 74 61 74 65 6d  ured in a statem
88b0: 65 6e 74 20 74 68 61 74 20 77 72 69 74 65 73 20  ent that writes 
88c0: 74 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20  to.  **     the 
88d0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
88e0: 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
88f0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
8900: 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 65 0a 20  lled back. The. 
8910: 20 2a 2a 20 20 20 20 20 49 2f 4f 20 65 72 72 6f   **     I/O erro
8920: 72 20 6d 61 79 20 68 61 76 65 20 63 61 75 73 65  r may have cause
8930: 64 20 67 61 72 62 61 67 65 20 74 6f 20 62 65 20  d garbage to be 
8940: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
8950: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 20 20 20  ournal .  **    
8960: 20 66 69 6c 65 2e 20 57 65 72 65 20 74 68 65 20   file. Were the 
8970: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
8980: 6f 6e 74 69 6e 75 65 20 61 6e 64 20 65 76 65 6e  ontinue and even
8990: 74 75 61 6c 6c 79 20 62 65 20 72 6f 6c 6c 65 64  tually be rolled
89a0: 20 0a 20 20 2a 2a 20 20 20 20 20 62 61 63 6b 20   .  **     back 
89b0: 74 68 61 74 20 67 61 72 62 61 67 65 20 6d 69 67  that garbage mig
89c0: 68 74 20 65 6e 64 20 75 70 20 69 6e 20 74 68 65  ht end up in the
89d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
89e0: 20 20 2a 2a 20 20 20 20 20 0a 20 20 2a 2a 20 20    **     .  **  
89f0: 20 20 20 49 6e 20 62 6f 74 68 20 6f 66 20 74 68     In both of th
8a00: 65 20 61 62 6f 76 65 20 63 61 73 65 73 2c 20 74  e above cases, t
8a10: 68 65 20 56 64 62 65 2e 65 72 72 6f 72 41 63 74  he Vdbe.errorAct
8a20: 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20  ion variable is 
8a30: 0a 20 20 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65  .  **     ignore
8a40: 64 2e 20 49 66 20 74 68 65 20 73 71 6c 69 74 65  d. If the sqlite
8a50: 33 2e 61 75 74 6f 43 6f 6d 6d 69 74 20 66 6c 61  3.autoCommit fla
8a60: 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61  g is false and a
8a70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
8a80: 2a 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20  *     is rolled 
8a90: 62 61 63 6b 2c 20 69 74 20 77 69 6c 6c 20 62 65  back, it will be
8aa0: 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 20 20   set to true..  
8ab0: 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 20 65 72  **.  ** Other er
8ac0: 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors:.  **.  ** 
8ad0: 4e 6f 20 65 72 72 6f 72 3a 0a 20 20 2a 2a 0a 20  No error:.  **. 
8ae0: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
8af0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
8b00: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
8b10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8b20: 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  }.  if( p->magic
8b30: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
8b40: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61   ){.    /* Alrea
8b50: 64 79 20 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68  dy halted.  Noth
8b60: 69 6e 67 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  ing to do. */.  
8b70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
8b80: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
8b90: 41 4c 54 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ALT );.    retur
8ba0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8bb0: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
8bc0: 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63  rs(p);.  checkAc
8bd0: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
8be0: 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
8bf0: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
8c00: 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
8c10: 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
8c20: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
8c30: 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43 68  =0 ){..    /* Ch
8c40: 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
8c50: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
8c60: 73 20 2d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  s - SQLITE_NOMEM
8c70: 20 6f 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   or SQLITE_IOERR
8c80: 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61   */.    isSpecia
8c90: 6c 45 72 72 6f 72 20 3d 20 28 28 70 2d 3e 72 63  lError = ((p->rc
8ca0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
8cb0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
8cc0: 49 4f 45 52 52 29 3f 31 3a 30 29 3b 0a 20 20 20  IOERR)?1:0);.   
8cd0: 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
8ce0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
8cf0: 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73  This loop does s
8d00: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f  tatic analysis o
8d10: 66 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 73  f the query to s
8d20: 65 65 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a  ee which of the.
8d30: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
8d40: 6e 67 20 74 68 72 65 65 20 63 61 74 65 67 6f 72  ng three categor
8d50: 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74  ies it falls int
8d60: 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o:.      **.    
8d70: 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e    **     Read-on
8d80: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ly.      **     
8d90: 51 75 65 72 79 20 77 69 74 68 20 73 74 61 74 65  Query with state
8da0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ment journal.   
8db0: 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20     **     Query 
8dc0: 77 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e  without statemen
8dd0: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
8de0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 63  **.      ** We c
8df0: 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e  ould do somethin
8e00: 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20 74  g more elegant t
8e10: 68 61 6e 20 74 68 69 73 20 73 74 61 74 69 63 20  han this static 
8e20: 61 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20  analysis (i.e.. 
8e30: 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68       ** store th
8e40: 65 20 74 79 70 65 20 6f 66 20 71 75 65 72 79 20  e type of query 
8e50: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
8e60: 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61 73 65  ompliation phase
8e70: 29 2c 20 62 75 74 20 0a 20 20 20 20 20 20 2a 2a  ), but .      **
8e80: 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63   handling malloc
8e90: 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
8ea0: 20 69 73 20 61 20 66 61 69 72 6c 79 20 6f 62 73   is a fairly obs
8eb0: 63 75 72 65 20 65 64 67 65 20 63 61 73 65 20 73  cure edge case s
8ec0: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
8ed0: 20 69 73 20 70 72 6f 62 61 62 6c 79 20 65 61 73   is probably eas
8ee0: 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74  ier. Todo: Might
8ef0: 20 62 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   be an opportuni
8f00: 74 79 20 74 6f 20 72 65 64 75 63 65 20 0a 20 20  ty to reduce .  
8f10: 20 20 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65      ** code size
8f20: 20 61 20 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d   a very small am
8f30: 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20  ount though.... 
8f40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
8f50: 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 31  t isReadOnly = 1
8f60: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53 74  ;.      int isSt
8f70: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
8f80: 20 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70     assert(p->aOp
8f90: 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a   || p->nOp==0);.
8fa0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8fb0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a  <p->nOp; i++){ .
8fc0: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
8fd0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
8ff0: 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  se OP_Transactio
9000: 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  n:.            i
9010: 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  sReadOnly = 0;. 
9020: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9030: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
9040: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20   OP_Statement:. 
9050: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74 61             isSta
9060: 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  tement = 1;.    
9070: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9090: 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
90a0: 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
90b0: 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64  ad-only, we need
90c0: 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   do no rollback 
90d0: 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73  at all. Otherwis
90e0: 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e,.      ** proc
90f0: 65 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65  eed with the spe
9100: 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
9110: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
9120: 28 20 21 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b  ( !isReadOnly ){
9130: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
9140: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
9150: 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20   && isStatement 
9160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75  ){.          xFu
9170: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
9180: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
9190: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
91a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
91b0: 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
91c0: 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
91d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
91e0: 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
91f0: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
9200: 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
9210: 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
9220: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
9230: 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
9240: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
9250: 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65  sqlite3AbortOthe
9260: 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62 2c  rActiveVdbes(db,
9270: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   p);.          s
9280: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
9290: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
92a0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
92b0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
92c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
92d0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
92e0: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
92f0: 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
9300: 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
9310: 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20  e vdbe, then.   
9320: 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72   ** we do either
9330: 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
9340: 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
9350: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
9360: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
9370: 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
9380: 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
9390: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
93a0: 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
93b0: 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
93c0: 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20  as occured. .   
93d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
93e0: 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62  autoCommit && db
93f0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d  ->activeVdbeCnt=
9400: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
9410: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9420: 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
9430: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
9440: 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
9450: 20 29 7b 0a 09 2f 2a 20 54 68 65 20 61 75 74 6f   ){../* The auto
9460: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
9470: 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64  true, and the vd
9480: 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a  be program was .
9490: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65          ** succe
94a0: 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20  ssful or hit an 
94b0: 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
94c0: 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  aint. This means
94d0: 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
94e0: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
94f0: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
9500: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76        int rc = v
9510: 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  dbeCommit(db);. 
9520: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
9530: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
9540: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9550: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
9560: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
9570: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9580: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
9590: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
95a0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
95b0: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
95c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
95d0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
95e0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
95f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9610: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
9620: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
9630: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
9640: 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  xFunc ){.      i
9650: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9660: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
9670: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
9680: 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20  {.        xFunc 
9690: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
96a0: 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  mmitStmt;.      
96b0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
96c0: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
96d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46  rt ){.        xF
96e0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
96f0: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
9700: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9710: 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72       sqlite3Abor
9720: 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65  tOtherActiveVdbe
9730: 73 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  s(db, p);.      
9740: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
9750: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
9760: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
9770: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9780: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
9790: 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55   xFunc is not NU
97a0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f  LL, then it is o
97b0: 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ne of sqlite3Btr
97c0: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f  eeRollbackStmt o
97d0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
97e0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e  BtreeCommitStmt.
97f0: 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e   Call it once on
9800: 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49   each backend. I
9810: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9820: 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  s.    ** and the
9830: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
9840: 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c  still SQLITE_OK,
9850: 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
9860: 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a  code to the new.
9870: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c      ** error val
9880: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ue..    */.    a
9890: 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a  ssert(!xFunc ||.
98a0: 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c        xFunc==sql
98b0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
98c0: 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75  tmt ||.      xFu
98d0: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
98e0: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20  RollbackStmt.   
98f0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
9900: 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e   xFunc && i<db->
9910: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
9920: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
9930: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
9940: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9950: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
9960: 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63        rc = xFunc
9970: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
9980: 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d  f( rc && (p->rc=
9990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
99a0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >rc==SQLITE_CONS
99b0: 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20  TRAINT) ){.     
99c0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
99d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
99e0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
99f0: 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20  zErrMsg, 0);.   
9a00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9a10: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
9a20: 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
9a30: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
9a40: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 73  DELETE and the s
9a50: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d  tatement was com
9a60: 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20  mitted, .    ** 
9a70: 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20 63  set the change c
9a80: 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
9a90: 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
9aa0: 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e  eCntOn && p->pc>
9ab0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9ac0: 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d  !xFunc || xFunc=
9ad0: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d  =sqlite3BtreeCom
9ae0: 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  mitStmt ){.     
9af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9b00: 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
9b10: 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
9b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9b30: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
9b40: 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
9b50: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
9b60: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
9b70: 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62  .  .    /* Rollb
9b80: 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e  ack or commit an
9b90: 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  y schema changes
9ba0: 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20   that occurred. 
9bb0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
9bc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  !=SQLITE_OK && d
9bd0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
9be0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
9bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
9c00: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
9c10: 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  a(db, 0);.      
9c20: 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d  db->flags = (db-
9c30: 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f  >flags | SQLITE_
9c40: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
9c50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9c60: 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
9c70: 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
9c80: 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
9c90: 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
9ca0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
9cb0: 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
9cc0: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
9cd0: 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
9ce0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
9cf0: 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
9d00: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72  dbeCnt(db);..  r
9d10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
9d30: 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
9d40: 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
9d50: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
9d60: 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
9d70: 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
9d80: 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
9d90: 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
9da0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
9db0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
9dc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9dd0: 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
9de0: 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
9df0: 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
9e00: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
9e10: 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
9e20: 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
9e30: 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
9e40: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
9e50: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
9e60: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
9e70: 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
9e80: 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
9e90: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
9ea0: 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
9eb0: 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
9ec0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  *p){.  if( p->ma
9ed0: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
9ee0: 52 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21  RUN && p->magic!
9ef0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
9f00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
9f10: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49  rror(p->db, SQLI
9f20: 54 45 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20  TE_MISUSE, 0);. 
9f30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9f40: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
9f50: 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
9f60: 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
9f70: 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
9f80: 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
9f90: 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
9fa0: 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
9fb0: 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
9fc0: 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
9fd0: 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
9fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
9ff0: 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
a000: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
a010: 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
a020: 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
a030: 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
a040: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
a050: 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
a060: 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
a070: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
a080: 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
a090: 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
a0a0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
a0b0: 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
a0c0: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
a0d0: 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
a0e0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
a0f0: 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
a100: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
a110: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
a120: 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
a130: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
a140: 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
a150: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a160: 33 2a 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3* db = p->db;. 
a170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
a180: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
a190: 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
a1a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73  , SQLITE_UTF8, s
a1b0: 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a 20 20  qlite3FreeX);.  
a1c0: 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
a1d0: 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70  = p->rc;.      p
a1e0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
a1f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
a200: 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
a210: 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20  te3Error(p->db, 
a220: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d  p->rc, 0);.    }
a230: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
a240: 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20  te3Error(p->db, 
a250: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
a260: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
a270: 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
a280: 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
a290: 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
a2a0: 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
a2b0: 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
a2c0: 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
a2d0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
a2e0: 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
a2f0: 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
a300: 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
a310: 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
a320: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
a330: 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
a340: 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
a350: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
a360: 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c  or(p->db, p->rc,
a370: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   0);.  }..  /* R
a380: 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
a390: 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
a3a0: 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
a3b0: 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
a3c0: 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
a3d0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
a3e0: 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
a3f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 6f    assert( p->pTo
a400: 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e  s<&p->aStack[p->
a410: 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c  pc<0?0:p->pc] ||
a420: 20 21 70 2d 3e 61 53 74 61 63 6b 20 29 3b 0a 23   !p->aStack );.#
a430: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
a440: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
a450: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
a460: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
a470: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
a480: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
a490: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
a4a0: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
a4b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a4c0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
a4d0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
a4e0: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
a4f0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
a500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
a510: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
a520: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a530: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
a540: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
a550: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
a560: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
a570: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
a580: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
a590: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
a5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
a5b0: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
a5c0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
a5d0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
a5e0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
a5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
a600: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
a610: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
a620: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
a630: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
a640: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
a650: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
a660: 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74  INIT;.  p->abort
a670: 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  ed = 0;.  if( p-
a680: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45  >rc==SQLITE_SCHE
a690: 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MA ){.    sqlite
a6a0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
a6b0: 68 65 6d 61 28 70 2d 3e 64 62 2c 20 30 29 3b 0a  hema(p->db, 0);.
a6c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
a6d0: 72 63 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  rc;.}. ./*.** Cl
a6e0: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
a6f0: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
a700: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
a710: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
a720: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
a730: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
a740: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
a750: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
a760: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
a770: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
a780: 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
a790: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a7a0: 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  K;..  if( p->mag
a7b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
a7c0: 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
a7d0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
a7e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
a7f0: 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
a800: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a810: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
a820: 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65  C_INIT ){.    re
a830: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
a840: 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  SE;.  }.  sqlite
a850: 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
a860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a870: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
a880: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
a890: 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
a8a0: 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
a8b0: 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
a8c0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
a8d0: 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
a8e0: 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
a8f0: 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
a900: 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
a910: 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
a920: 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
a930: 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
a940: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
a950: 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
a960: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
a970: 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
a980: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
a990: 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
a9a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
a9b0: 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
a9c0: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
a9d0: 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
a9e0: 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
a9f0: 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
aa00: 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
aa10: 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41  k&(1<<i))) && pA
aa20: 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20  ux->pAux ){.    
aa30: 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
aa40: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
aa50: 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
aa60: 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
aa70: 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41  }.      pAux->pA
aa80: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
aa90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
aaa0: 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
aab0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
aac0: 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
aad0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
aae0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
aaf0: 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29  rn;.  Cleanup(p)
ab00: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
ab10: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
ab20: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
ab30: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
ab40: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
ab50: 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
ab60: 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70  p->db->pVdbe = p
ab70: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
ab80: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
ab90: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
aba0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
abb0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20   }.  if( p->aOp 
abc0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
abd0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
abe0: 20 20 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20        Op *pOp = 
abf0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
ac00: 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33    freeP3(pOp->p3
ac10: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a  type, pOp->p3);.
ac20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ac30: 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  Free(p->aOp);.  
ac40: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
ac50: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
ac60: 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  nVar);.  sqliteF
ac70: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
ac80: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
ac90: 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61  aStack);.  relea
aca0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
acb0: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
acc0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
acd0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
ace0: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 70  ->aColName);.  p
acf0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
ad00: 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c  AGIC_DEAD;.  sql
ad10: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
ad20: 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f  *.** If a MoveTo
ad30: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65   operation is pe
ad40: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76  nding on the giv
ad50: 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  en cursor, then 
ad60: 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54  do that.** MoveT
ad70: 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20 61  o now.  Return a
ad80: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
ad90: 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70  f no MoveTo is p
ada0: 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20  ending, this.** 
adb0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
adc0: 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73  hing and returns
add0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
ade0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
adf0: 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f  rsorMoveto(Curso
ae00: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
ae10: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
ae20: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
ae30: 63 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  c;.    extern in
ae40: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
ae50: 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 61 73 73 65  _count;.    asse
ae60: 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
ae70: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 54  ;.    if( p->isT
ae80: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  able ){.      rc
ae90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
aea0: 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72  oveto(p->pCursor
aeb0: 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
aec0: 72 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20 20  rget, &res);.   
aed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
aee0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
aef0: 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72  oveto(p->pCursor
af00: 2c 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65  ,(char*)&p->move
af10: 74 6f 54 61 72 67 65 74 2c 0a 20 20 20 20 20 20  toTarget,.      
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
af40: 36 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d  64),&res);.    }
af50: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
af60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d  turn rc;.    *p-
af70: 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20  >pIncrKey = 0;. 
af80: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
af90: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
afa0: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
afb0: 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
afc0: 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69   = res==0;.    i
afd0: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
afe0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
aff0: 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73  reeNext(p->pCurs
b000: 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
b010: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b020: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   rc;.    }.    s
b030: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
b040: 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64 65  unt++;.    p->de
b050: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
b060: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
b070: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
b080: 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LE;.  }.  return
b090: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b0a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
b0b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
b0c0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
b0d0: 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
b0e0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
b0f0: 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
b100: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52 65  ite3VdbeSerialRe
b110: 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ad().** sqlite3V
b120: 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
b130: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
b140: 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a  ialWrite().**.**
b150: 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
b160: 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
b170: 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
b180: 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
b190: 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
b1a0: 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
b1b0: 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
b1c0: 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
b1d0: 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
b1e0: 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
b1f0: 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
b200: 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
b210: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
b220: 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
b230: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
b240: 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
b250: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
b260: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
b270: 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
b280: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
b290: 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
b2a0: 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
b2b0: 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
b2c0: 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
b2d0: 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
b2e0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
b2f0: 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
b300: 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
b310: 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
b320: 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
b330: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
b340: 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
b350: 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
b360: 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
b370: 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74  ata blob seperat
b380: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
b390: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
b3a0: 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
b3b0: 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
b3c0: 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
b3d0: 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
b3e0: 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
b3f0: 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
b400: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
b410: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
b420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
b430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
b440: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
b450: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
b460: 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
b470: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
b480: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
b490: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
b4a0: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
b4d0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
b4e0: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
b500: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
b510: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
b520: 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
b530: 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
b540: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
b550: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
b580: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
b590: 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
b5b0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
b5c0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
b5d0: 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
b5e0: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
b5f0: 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
b600: 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
b620: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
b630: 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
b640: 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
b650: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
b660: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
b670: 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
b680: 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
b6b0: 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
b6c0: 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
b6d0: 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
b6e0: 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
b6f0: 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
b700: 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
b710: 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
b720: 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
b730: 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
b740: 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
b750: 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
b760: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
b770: 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
b780: 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
b790: 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
b7a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
b7b0: 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
b7c0: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
b7d0: 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
b7e0: 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
b7f0: 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
b800: 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
b810: 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
b820: 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
b830: 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
b840: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
b850: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b860: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
b870: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
b880: 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
b890: 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
b8a0: 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
b8b0: 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
b8c0: 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
b8d0: 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  001000)<<32)-1).
b8e0: 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
b8f0: 2d 3e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  ->i;.    u64 u;.
b900: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
b910: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
b920: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
b930: 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20  rn 8+i;.    }.  
b940: 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a    u = i<0 ? -i :
b950: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
b960: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
b970: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
b980: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
b990: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
b9a0: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
b9b0: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
b9c0: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
b9d0: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
b9e0: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
b9f0: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
ba00: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
ba10: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
ba20: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 7;.  }.  if( 
ba30: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
ba40: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4d 65  .    int n = pMe
ba50: 6d 2d 3e 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  m->n;.    assert
ba60: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 72 65  ( n>=0 );.    re
ba70: 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 33  turn ((n*2) + 13
ba80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  );.  }.  if( fla
ba90: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
baa0: 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d     return (pMem-
bab0: 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a  >n*2 + 12);.  }.
bac0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
bad0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
bae0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
baf0: 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
bb00: 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
bb10: 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
bb20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
bb30: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
bb40: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
bb50: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
bb60: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
bb70: 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
bb80: 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
bb90: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
bba0: 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
bbb0: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
bbc0: 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
bbd0: 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
bbe0: 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
bbf0: 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
bc00: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
bc10: 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
bc20: 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
bc30: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
bc40: 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
bc50: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
bc60: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
bc70: 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
bc80: 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
bc90: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
bca0: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
bcb0: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
bcc0: 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
bcd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
bce0: 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
bcf0: 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
bd00: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
bd10: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
bd20: 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
bd30: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
bd40: 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  int len;..  /* I
bd50: 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
bd60: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
bd70: 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
bd80: 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
bd90: 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69  u64 v;.    int i
bda0: 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
bdb0: 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
bdc0: 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d    v = *(u64*)&pM
bdd0: 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  em->r;.    }else
bde0: 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75 36  {.      v = *(u6
bdf0: 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20  4*)&pMem->i;.   
be00: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
be10: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
be20: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
be30: 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c  _type);.    whil
be40: 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
be50: 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46  buf[i] = (v&0xFF
be60: 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
be70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
be80: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
be90: 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
bea0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
beb0: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
bec0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64   len = sqlite3Vd
bed0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
bee0: 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
bef0: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
bf00: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
bf10: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
bf20: 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
bf30: 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
bf40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
bf50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
bf60: 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
bf70: 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
bf80: 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
bf90: 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
bfa0: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
bfb0: 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
bfc0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
bfd0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
bfe0: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
bff0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
c000: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
c010: 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
c020: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
c030: 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
c040: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
c050: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
c060: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
c070: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
c080: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
c0b0: 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
c0c0: 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
c0d0: 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
c0e0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
c0f0: 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
c100: 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
c110: 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
c120: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
c130: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
c140: 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
c150: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
c160: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c170: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
c180: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c190: 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
c1a0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
c1b0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  */.      pMem->i
c1c0: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
c1d0: 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
c1e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c1f0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
c200: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
c210: 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
c220: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
c230: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
c240: 3e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  >i = (((signed c
c250: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
c260: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
c270: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c280: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
c290: 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
c2a0: 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
c2b0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
c2c0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
c2d0: 6d 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  m->i = (((signed
c2e0: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
c2f0: 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
c300: 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
c310: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c320: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
c330: 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
c340: 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
c350: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
c360: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
c370: 65 6d 2d 3e 69 20 3d 20 28 62 75 66 5b 30 5d 3c  em->i = (buf[0]<
c380: 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
c390: 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
c3a0: 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
c3b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c3c0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
c3d0: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
c3e0: 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
c3f0: 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
c400: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  teger */.      u
c410: 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64  64 x = (((signed
c420: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
c430: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
c440: 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32    u32 y = (buf[2
c450: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d  ]<<24) | (buf[3]
c460: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c  <<16) | (buf[4]<
c470: 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20  <8) | buf[5];.  
c480: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
c490: 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  | y;.      pMem-
c4a0: 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  >i = *(i64*)&x;.
c4b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c4c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
c4d0: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
c4e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
c4f0: 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
c500: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
c510: 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
c520: 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
c530: 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  t */.      u64 x
c540: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23  ;.      u32 y;.#
c550: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
c560: 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
c570: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
c580: 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
c590: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
c5a0: 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
c5b0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
c5c0: 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
c5d0: 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  .      ** byte o
c5e0: 72 64 65 72 2e 20 20 54 68 65 20 62 79 74 65 20  rder.  The byte 
c5f0: 6f 72 64 65 72 20 64 69 66 66 65 72 73 20 6f 6e  order differs on
c600: 20 73 6f 6d 65 20 28 62 72 6f 6b 65 6e 29 20 61   some (broken) a
c610: 72 63 68 69 74 65 63 74 75 72 65 73 2e 0a 20 20  rchitectures..  
c620: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
c630: 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
c640: 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
c650: 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
c660: 61 73 73 65 72 74 28 20 31 2e 30 3d 3d 2a 28 64  assert( 1.0==*(d
c670: 6f 75 62 6c 65 2a 29 26 74 31 20 29 3b 0a 23 65  ouble*)&t1 );.#e
c680: 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
c690: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
c6a0: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
c6b0: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
c6c0: 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
c6d0: 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
c6e0: 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
c6f0: 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
c700: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
c710: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
c720: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
c730: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
c740: 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  m->i = *(i64*)&x
c750: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
c760: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
c770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c780: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20        pMem->r = 
c790: 2a 28 64 6f 75 62 6c 65 2a 29 26 78 3b 0a 20 20  *(double*)&x;.  
c7a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c7b0: 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  s = MEM_Real;.  
c7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
c7d0: 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 8;.    }.    
c7e0: 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
c7f0: 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
c800: 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
c810: 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
c820: 70 4d 65 6d 2d 3e 69 20 3d 20 73 65 72 69 61 6c  pMem->i = serial
c830: 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
c840: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c850: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
c860: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
c870: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
c880: 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69   int len = (seri
c890: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
c8a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
c8b0: 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
c8c0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
c8d0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65  .      pMem->xDe
c8e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  l = 0;.      if(
c8f0: 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30   serial_type&0x0
c900: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
c910: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
c920: 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  tr | MEM_Ephem;.
c930: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c940: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
c950: 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45   = MEM_Blob | ME
c960: 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
c970: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65  .      return le
c980: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
c990: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c9a0: 2a 20 54 68 65 20 68 65 61 64 65 72 20 6f 66 20  * The header of 
c9b0: 61 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74  a record consist
c9c0: 73 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20  s of a sequence 
c9d0: 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20  variable-length 
c9e0: 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65  integers..** The
c9f0: 73 65 20 69 6e 74 65 67 65 72 73 20 61 72 65 20  se integers are 
ca00: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d  almost always sm
ca10: 61 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f  all and are enco
ca20: 64 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ded as a single 
ca30: 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c  byte..** The fol
ca40: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b  lowing macro tak
ca50: 65 73 20 61 64 76 61 6e 74 61 67 65 20 74 68 69  es advantage thi
ca60: 73 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64  s fact to provid
ca70: 65 20 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a  e a fast decode.
ca80: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ** of the intege
ca90: 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68  rs in a record h
caa0: 65 61 64 65 72 2e 20 20 49 74 20 69 73 20 66 61  eader.  It is fa
cab0: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
cac0: 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72  mon case.** wher
cad0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73  e the integer is
cae0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20   a single byte. 
caf0: 20 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20   It is a little 
cb00: 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a  slower when the.
cb10: 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74 77  ** integer is tw
cb20: 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e  o or more bytes.
cb30: 20 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74    But overall it
cb40: 20 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a   is faster..**.*
cb50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
cb60: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
cb70: 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a  equivalent:.**.*
cb80: 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65  *     x = sqlite
cb90: 33 47 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c  3GetVarint32( A,
cba0: 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20   &B );.**.**    
cbb0: 20 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20   x = GetVarint( 
cbc0: 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64  A, B );.**.*/.#d
cbd0: 65 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28  efine GetVarint(
cbe0: 41 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29  A,B)  ((B = *(A)
cbf0: 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71  )<=0x7f ? 1 : sq
cc00: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
cc10: 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20  (A, &B))../*.** 
cc20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
cc30: 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
cc40: 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
cc50: 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69  ex records speci
cc60: 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65  fied by .** {nKe
cc70: 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b  y1, pKey1} and {
cc80: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72  nKey2, pKey2}, r
cc90: 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74  eturning a negat
cca0: 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
ccb0: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
ccc0: 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   if {nKey1, pKey
ccd0: 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  1} is less than,
cce0: 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
ccf0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e   greater than {n
cd00: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42  Key2, pKey2}.  B
cd10: 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  oth Key1 and Key
cd20: 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73  2 must be byte s
cd30: 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73  trings.** compos
cd40: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
cd50: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
cd60: 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69  f the VDBE..*/.i
cd70: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
cd80: 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76  cordCompare(.  v
cd90: 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20  oid *userData,. 
cda0: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
cdb0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a  t void *pKey1, .
cdc0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
cdd0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
cde0: 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  {.  KeyInfo *pKe
cdf0: 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f  yInfo = (KeyInfo
ce00: 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33  *)userData;.  u3
ce10: 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20  2 d1, d2;       
ce20: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
ce30: 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
ce40: 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
ce50: 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78  .  u32 idx1, idx
ce60: 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  2;      /* Offse
ce70: 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
ce80: 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
ce90: 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
cea0: 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f  Hdr1, szHdr2;  /
ceb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
cec0: 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
ced0: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
cee0: 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
cef0: 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
cf00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
cf10: 4b 65 79 31 20 3d 20 28 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 29 70 4b  signed char *)pK
cf30: 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ey1;.  const uns
cf40: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
cf50: 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  2 = (const unsig
cf60: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32  ned char *)pKey2
cf70: 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20  ;..  Mem mem1;. 
cf80: 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d   Mem mem2;.  mem
cf90: 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
cfa0: 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e  ->enc;.  mem2.en
cfb0: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
cfc0: 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 47  c;.  .  idx1 = G
cfd0: 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c 20  etVarint(aKey1, 
cfe0: 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
cff0: 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d  szHdr1;.  idx2 =
d000: 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 32   GetVarint(aKey2
d010: 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20  , szHdr2);.  d2 
d020: 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65  = szHdr2;.  nFie
d030: 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
d040: 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
d050: 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
d060: 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20  dx2<szHdr2 ){.  
d070: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
d080: 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69  e1;.    u32 seri
d090: 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f  al_type2;..    /
d0a0: 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
d0b0: 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
d0c0: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
d0d0: 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
d0e0: 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69   idx1 += GetVari
d0f0: 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  nt( aKey1+idx1, 
d100: 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
d110: 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
d120: 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
d130: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
d140: 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
d150: 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20  break;.    idx2 
d160: 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b  += GetVarint( aK
d170: 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61 6c  ey2+idx2, serial
d180: 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69 66  _type2 );.    if
d190: 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73  ( d2>=nKey2 && s
d1a0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d1b0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
d1c0: 79 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype2)>0 ) break;
d1d0: 0a 0a 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20  ..    /* Assert 
d1e0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
d1f0: 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74 20  ough space left 
d200: 69 6e 20 65 61 63 68 20 6b 65 79 20 66 6f 72 20  in each key for 
d210: 74 68 65 20 62 6c 6f 62 20 6f 66 0a 20 20 20 20  the blob of.    
d220: 2a 2a 20 64 61 74 61 20 74 6f 20 67 6f 20 77 69  ** data to go wi
d230: 74 68 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  th the serial ty
d240: 70 65 20 6a 75 73 74 20 72 65 61 64 2e 20 54 68  pe just read. Th
d250: 69 73 20 61 73 73 65 72 74 20 6d 61 79 20 66 61  is assert may fa
d260: 69 6c 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  il if.    ** the
d270: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
d280: 65 64 2e 20 20 54 68 65 6e 20 72 65 61 64 20 74  ed.  Then read t
d290: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 65 61  he value from ea
d2a0: 63 68 20 6b 65 79 20 69 6e 74 6f 20 6d 65 6d 31  ch key into mem1
d2b0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6d 65 6d 32  .    ** and mem2
d2c0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
d2d0: 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
d2e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d2f0: 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
d300: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
d310: 6d 65 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d  mem1);.    d2 +=
d320: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d330: 61 6c 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d  alGet(&aKey2[d2]
d340: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20  , serial_type2, 
d350: 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20 72 63 20  &mem2);..    rc 
d360: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
d370: 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32  are(&mem1, &mem2
d380: 2c 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65  , i<nField ? pKe
d390: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
d3a0: 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65  : 0);.    if( me
d3b0: 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  m1.flags & MEM_D
d3c0: 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  yn ) sqlite3Vdbe
d3d0: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
d3e0: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e  );.    if( mem2.
d3f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
d400: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
d410: 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a  Release(&mem2);.
d420: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
d430: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d440: 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
d450: 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ..  /* One of th
d460: 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
d470: 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c  f fields, but al
d480: 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
d490: 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20  to that point.  
d4a0: 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  ** were equal. I
d4b0: 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c  f the incrKey fl
d4c0: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
d4d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20   the second key 
d4e0: 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20  is.  ** treated 
d4f0: 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a  as larger..  */.
d500: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
d510: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
d520: 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20  >incrKey ){.    
d530: 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d    rc = -1;.    }
d540: 65 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79  else if( d1<nKey
d550: 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
d560: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
d570: 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20   d2<nKey2 ){.   
d580: 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
d590: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b  }.  }else if( pK
d5a0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
d5b0: 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f  er && i<pKeyInfo
d5c0: 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20  ->nField.       
d5d0: 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49          && pKeyI
d5e0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
d5f0: 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d  i] ){.    rc = -
d600: 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
d610: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d620: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
d630: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f  n index entry co
d640: 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65  mposed using the
d650: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
d660: 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61  pcode..** The la
d670: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  st entry in this
d680: 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
d690: 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70  e an integer (sp
d6a0: 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e  ecifically.** an
d6b0: 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e   integer rowid).
d6c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
d6d0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
d6e0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a  r of bytes in.**
d6f0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a   that integer..*
d700: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
d710: 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e  eIdxRowidLen(con
d720: 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
d730: 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
d740: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
d750: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
d760: 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
d770: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
d780: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20   the rowid */.. 
d790: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
d7a0: 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72  t32(aKey, &szHdr
d7b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
d7c0: 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a  arint32(&aKey[sz
d7d0: 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77  Hdr-1], &typeRow
d7e0: 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  id);.  return sq
d7f0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
d800: 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
d810: 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  );.}.  ../*.** p
d820: 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
d830: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
d840: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
d850: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
d860: 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
d870: 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
d880: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
d890: 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
d8a0: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
d8b0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d8c0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
d8d0: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
d8e0: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
d8f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d900: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
d910: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
d920: 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
d930: 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74   nCellKey;.  int
d940: 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
d950: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
d960: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
d970: 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
d980: 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
d990: 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
d9a0: 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
d9b0: 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
d9c0: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
d9d0: 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
d9e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
d9f0: 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
da00: 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c  Key);.  if( nCel
da10: 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72  lKey<=0 ){.    r
da20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
da30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
da40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
da50: 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
da60: 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
da70: 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
da80: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
da90: 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rc;.  }.  sqlite
daa0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  3GetVarint32((u8
dab0: 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a  *)m.z, &szHdr);.
dac0: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
dad0: 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
dae0: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
daf0: 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64  wid);.  lenRowid
db00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
db10: 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
db20: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
db30: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
db40: 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
db50: 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
db60: 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
db70: 20 3d 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74 65   = v.i;.  sqlite
db80: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
db90: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
dba0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
dbb0: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
dbc0: 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
dbd0: 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
dbe0: 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20   pC is point to 
dbf0: 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
dc00: 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65  ey string in pKe
dc10: 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65  y (of length nKe
dc20: 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  y).  Write into 
dc30: 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
dc40: 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
dc50: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
dc60: 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
dc70: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
dc80: 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
dc90: 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65  r than pKey.  Re
dca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
dcb0: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
dcc0: 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20   pKey is either 
dcd0: 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
dce0: 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
dcf0: 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
dd00: 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
dd10: 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
dd20: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
dd30: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
dd40: 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
dd50: 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
dd60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dd70: 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
dd80: 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c  e(.  Cursor *pC,
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
ddb0: 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
ddc0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
ddd0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c   const u8 *pKey,
dde0: 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f     /* The key to
ddf0: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e   compare */.  in
de00: 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
de10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
de20: 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
de30: 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
de40: 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
de50: 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ey;.  int rc;.  
de60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
de70: 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
de80: 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20  int lenRowid;.  
de90: 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  Mem m;..  sqlite
dea0: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
deb0: 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
dec0: 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
ded0: 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  0 ){.    *res = 
dee0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
def0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
df00: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
df10: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
df20: 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c  pCursor, 0, nCel
df30: 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
df40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
df50: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c  turn rc;.  }.  l
df60: 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
df70: 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
df80: 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72  ((u8*)m.z);.  *r
df90: 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
dfa0: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70 43  RecordCompare(pC
dfb0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d  ->pKeyInfo, m.n-
dfc0: 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e  lenRowid, m.z, n
dfd0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71  Key, pKey);.  sq
dfe0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
dff0: 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
e000: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e010: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e020: 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
e030: 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
e040: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
e050: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
e060: 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
e070: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
e080: 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
e090: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
e0a0: 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
e0b0: 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
e0c0: 65 29 7b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67  e){.  db->nChang
e0d0: 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
e0e0: 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
e0f0: 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
e100: 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
e110: 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
e120: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
e130: 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
e140: 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
e150: 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
e160: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
e170: 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
e180: 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
e190: 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
e1a0: 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
e1b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
e1c0: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
e1d0: 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
e1e0: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
e1f0: 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
e200: 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
e210: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
e220: 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
e230: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
e240: 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
e250: 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
e260: 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
e270: 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
e280: 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
e290: 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
e2a0: 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
e2b0: 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
e2c0: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
e2d0: 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
e2e0: 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
e2f0: 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
e300: 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
e310: 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
e320: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
e330: 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
e340: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e350: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
e360: 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
e370: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
e380: 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
e390: 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
e3a0: 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
e3b0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
e3c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e3d0: 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
e3e0: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
e3f0: 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
e400: 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
e410: 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
e420: 76 2d 3e 64 62 3b 0a 7d 0a                       v->db;.}.