/ Hex Artifact Content
Login

Artifact 666f0753f7d70b6a092c7f2074ae8cf1f9755cfc:


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 52  rn p;.}../*.** R
0540: 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20  emember the SQL 
0550: 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65  string for a pre
0560: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
0570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0580: 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 65 20  VdbeSetSql(Vdbe 
0590: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
05a0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28  z, int n){.  if(
05b0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
05c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
05d0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
05e0: 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 44  l = sqlite3StrND
05f0: 75 70 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  up(z, n);.}../*.
0600: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51  ** Return the SQ
0610: 4c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  L associated wit
0620: 68 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  h a prepared sta
0630: 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20  tement.*/.const 
0640: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 56 64 62  char *sqlite3Vdb
0650: 65 47 65 74 53 71 6c 28 56 64 62 65 20 2a 70 29  eGetSql(Vdbe *p)
0660: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 53  {.  return p->zS
0670: 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  ql;.}../*.** Swa
0680: 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65  p all content be
0690: 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73  tween two VDBE s
06a0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
06b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77  id sqlite3VdbeSw
06c0: 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62  ap(Vdbe *pA, Vdb
06d0: 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74  e *pB){.  Vdbe t
06e0: 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61  mp, *pTmp;.  cha
06f0: 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e 74 20 6e  r *zTmp;.  int n
0700: 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41  Tmp;.  tmp = *pA
0710: 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20  ;.  *pA = *pB;. 
0720: 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54   *pB = tmp;.  pT
0730: 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a  mp = pA->pNext;.
0740: 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42    pA->pNext = pB
0750: 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70  ->pNext;.  pB->p
0760: 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70  Next = pTmp;.  p
0770: 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b  Tmp = pA->pPrev;
0780: 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70  .  pA->pPrev = p
0790: 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e  B->pPrev;.  pB->
07a0: 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20  pPrev = pTmp;.  
07b0: 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b  zTmp = pA->zSql;
07c0: 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42  .  pA->zSql = pB
07d0: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53  ->zSql;.  pB->zS
07e0: 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 6e 54 6d  ql = zTmp;.  nTm
07f0: 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b 0a 20 20  p = pA->nSql;.  
0800: 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42 2d 3e 6e  pA->nSql = pB->n
0810: 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53 71 6c 20  Sql;.  pB->nSql 
0820: 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = nTmp;.}../*.**
0830: 20 54 75 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e   Turn tracing on
0840: 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20   or off.*/.void 
0850: 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63 65  sqlite3VdbeTrace
0860: 28 56 64 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a  (Vdbe *p, FILE *
0870: 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61  trace){.  p->tra
0880: 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 0a 2f  ce = trace;.}../
0890: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
08a0: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
08b0: 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  o that it contai
08c0: 6e 73 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a  ns at least N.**
08d0: 20 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68   elements. If th
08e0: 65 20 56 64 62 65 20 69 73 20 69 6e 20 56 44 42  e Vdbe is in VDB
08f0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74  E_MAGIC_RUN stat
0900: 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56  e, then.** the V
0910: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69  dbe.aOp array wi
0920: 6c 6c 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63  ll be sized to c
0930: 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e  ontain exactly N
0940: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 56 64  .** elements. Vd
0950: 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 69 73 20 73  be.nOpAlloc is s
0960: 65 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  et to reflect th
0970: 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 0a 2a 2a  e new size of.**
0980: 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a   the array..**.*
0990: 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  * If an out-of-m
09a0: 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75  emory error occu
09b0: 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e  rs while resizin
09c0: 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20  g the array,.** 
09d0: 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62  Vdbe.aOp and Vdb
09e0: 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69  e.nOpAlloc remai
09f0: 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  n unchanged (thi
0a00: 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20  s is so that.** 
0a10: 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65  any opcodes alre
0a20: 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  ady allocated ca
0a30: 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64  n be correctly d
0a40: 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c  eallocated.** al
0a50: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0a60: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
0a80: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62  esizeOpArray(Vdb
0a90: 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  e *p, int N){.  
0aa0: 69 6e 74 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d  int runMode = p-
0ab0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
0ac0: 49 43 5f 52 55 4e 3b 0a 20 20 69 66 28 20 72 75  IC_RUN;.  if( ru
0ad0: 6e 4d 6f 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41  nMode || p->nOpA
0ae0: 6c 6c 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64  lloc<N ){.    Vd
0af0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20  beOp *pNew;.    
0b00: 69 6e 74 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31  int nNew = N + 1
0b10: 30 30 2a 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20  00*(!runMode);. 
0b20: 20 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d     int oldSize =
0b30: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20   p->nOpAlloc;.  
0b40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
0b50: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e  ealloc(p->aOp, n
0b60: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0b70: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
0b80: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  .      p->nOpAll
0b90: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
0ba0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bb0: 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f        if( nNew>o
0bc0: 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ldSize ){.      
0bd0: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
0be0: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e  [oldSize], 0, (n
0bf0: 4e 65 77 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a  New-oldSize)*siz
0c00: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 20 20  eof(Op));.      
0c10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
0c20: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c30: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c40: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c50: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c60: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c70: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c80: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c90: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0ca0: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0cb0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0cc0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cd0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0ce0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0cf0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0d00: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0d10: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d20: 70 32 20 20 20 20 20 20 20 20 20 20 46 69 72 73  p2          Firs
0d30: 74 20 74 77 6f 20 6f 66 20 74 68 65 20 74 68 72  t two of the thr
0d40: 65 65 20 70 6f 73 73 69 62 6c 65 20 6f 70 65 72  ee possible oper
0d50: 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ands..**.** Use 
0d60: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
0d70: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
0d80: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
0d90: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
0da0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
0db0: 68 61 6e 67 65 50 33 28 29 20 66 75 6e 63 74 69  hangeP3() functi
0dc0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
0dd0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33   value of the P3
0de0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
0df0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0e00: 64 64 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  ddOp(Vdbe *p, in
0e10: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0e20: 74 20 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t p2){.  int i;.
0e30: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a    VdbeOp *pOp;..
0e40: 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20    i = p->nOp;.  
0e50: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65  p->nOp++;.  asse
0e60: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e70: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e80: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c  .  if( p->nOpAll
0e90: 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73  oc<=i ){.    res
0ea0: 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b  izeOpArray(p, i+
0eb0: 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  1);.    if( sqli
0ec0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
0ed0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0ee0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0ef0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
0f00: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ];.  pOp->opcode
0f10: 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31   = op;.  pOp->p1
0f20: 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32   = p1;.  pOp->p2
0f30: 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33   = p2;.  pOp->p3
0f40: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 33 74   = 0;.  pOp->p3t
0f50: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
0f60: 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
0f70: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
0f80: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 73 71  E_DEBUG.  if( sq
0f90: 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70  lite3_vdbe_addop
0fa0: 5f 74 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  _trace ) sqlite3
0fb0: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
0fc0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
0fd0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
0fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
0ff0: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1000: 63 6c 75 64 65 73 20 74 68 65 20 70 33 20 76 61  cludes the p3 va
1010: 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lue..*/.int sqli
1020: 74 65 33 56 64 62 65 4f 70 33 28 56 64 62 65 20  te3VdbeOp3(Vdbe 
1030: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1040: 70 31 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73  p1, int p2, cons
1050: 74 20 63 68 61 72 20 2a 7a 50 33 2c 69 6e 74 20  t char *zP3,int 
1060: 70 33 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61  p3type){.  int a
1070: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1080: 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31  eAddOp(p, op, p1
1090: 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p2);.  sqlite3
10a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20  VdbeChangeP3(p, 
10b0: 61 64 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70  addr, zP3, p3typ
10c0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
10d0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
10e0: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
10f0: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
1100: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1110: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
1120: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
1130: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
1140: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
1150: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
1160: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
1170: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
1180: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1190: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
11a0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
11b0: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
11c0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
11d0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
11e0: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
11f0: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
1200: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
1210: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
1220: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
1230: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
1240: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
1250: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
1260: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
1270: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
1280: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1290: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
12a0: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
12b0: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
12c0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
12d0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
12e0: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
12f0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1300: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
1310: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
1320: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
1330: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
1340: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1350: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
1360: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
1370: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  ){.  int i;.  i 
1380: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
1390: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
13a0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
13b0: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
13c0: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b  ->nLabelAlloc ){
13d0: 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c  .    p->nLabelAl
13e0: 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41  loc = p->nLabelA
13f0: 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20  lloc*2 + 10;.   
1400: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72   sqliteReallocOr
1410: 46 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 2d  Free((void**)&p-
1420: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
1450: 63 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  c*sizeof(p->aLab
1460: 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  el[0]));.  }.  i
1470: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1480: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
1490: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
14a0: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
14b0: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
14c0: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
14d0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
14e0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
14f0: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
1500: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
1510: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
1520: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1530: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
1540: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
1550: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
1560: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1570: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
1580: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
1590: 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20  int j = -1-x;.  
15a0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
15b0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
15c0: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
15d0: 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62  >=0 && j<p->nLab
15e0: 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  el );.  if( p->a
15f0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
1600: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e  aLabel[j] = p->n
1610: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
1620: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
1630: 20 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20   if opcode 'op' 
1640: 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f  is guarenteed no
1650: 74 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76  t to push more v
1660: 61 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68  alues.** onto th
1670: 65 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61  e VDBE stack tha
1680: 6e 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a  n it pops off..*
1690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63  /.static int opc
16a0: 6f 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29  odeNoPush(u8 op)
16b0: 7b 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f  {.  /* The 10 NO
16c0: 50 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73  PUSH_MASK_n cons
16d0: 74 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65  tants are define
16e0: 64 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74  d in the automat
16f0: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65  ically.  ** gene
1700: 72 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c  rated header fil
1710: 65 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63  e opcodes.h. Eac
1720: 68 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69  h is a 16-bit bi
1730: 74 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20  tmask, one.  ** 
1740: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
1750: 67 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65  g to each opcode
1760: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
1770: 74 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  the virtual.  **
1780: 20 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65   machine in vdbe
1790: 2e 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74  .c. The bit is t
17a0: 72 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20  rue if the word 
17b0: 22 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72  "no-push" appear
17c0: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d  s.  ** in a comm
17d0: 65 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ent on the same 
17e0: 6c 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73  line as the "cas
17f0: 65 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20  e OP_XXX:" in . 
1800: 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45   ** sqlite3VdbeE
1810: 78 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e  xec() in vdbe.c.
1820: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
1830: 65 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74  e bit is true, t
1840: 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
1850: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20  nding opcode is 
1860: 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20  guarenteed not. 
1870: 20 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20   ** to grow the 
1880: 73 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73  stack when it is
1890: 20 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72   executed. Other
18a0: 77 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f  wise, it may gro
18b0: 77 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b  w the.  ** stack
18c0: 20 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20   by at most one 
18d0: 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
18e0: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63   NOPUSH_MASK_0 c
18f0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70  orresponds to op
1900: 63 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e  codes 0 to 15. N
1910: 4f 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e  OPUSH_MASK_1 con
1920: 74 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62  tains.  ** one b
1930: 69 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31  it for opcodes 1
1940: 36 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20  6 to 31, and so 
1950: 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36  on..  **.  ** 16
1960: 2d 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72  -bit bitmasks (r
1970: 61 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69  ather than 32-bi
1980: 74 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64  t) are specified
1990: 20 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20   in opcodes.h . 
19a0: 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20   ** because the 
19b0: 66 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65  file is generate
19c0: 64 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67  d by an awk prog
19d0: 72 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c  ram. Awk manipul
19e0: 61 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75  ates.  ** all nu
19f0: 6d 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e  mbers as floatin
1a00: 67 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64  g-point and we d
1a10: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73  on't want to ris
1a20: 6b 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a  k a rounding.  *
1a30: 2a 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f  * error if someo
1a40: 6e 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61  ne builds with a
1a50: 6e 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20  n awk that uses 
1a60: 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32  (for example) 32
1a70: 2d 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20  -bit .  ** IEEE 
1a80: 66 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20  floats..  */ .  
1a90: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32  static const u32
1aa0: 20 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20   masks[5] = {.  
1ab0: 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20    NOPUSH_MASK_0 
1ac0: 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f  + (((unsigned)NO
1ad0: 50 55 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36  PUSH_MASK_1)<<16
1ae0: 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41  ),.    NOPUSH_MA
1af0: 53 4b 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e  SK_2 + (((unsign
1b00: 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33  ed)NOPUSH_MASK_3
1b10: 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55  )<<16),.    NOPU
1b20: 53 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75  SH_MASK_4 + (((u
1b30: 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d  nsigned)NOPUSH_M
1b40: 41 53 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20  ASK_5)<<16),.   
1b50: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b   NOPUSH_MASK_6 +
1b60: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1b70: 55 53 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29  USH_MASK_7)<<16)
1b80: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1b90: 4b 5f 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_8 + (((unsigne
1ba0: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29  d)NOPUSH_MASK_9)
1bb0: 3c 3c 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73  <<16).  };.  ass
1bc0: 65 72 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a  ert( op<32*5 );.
1bd0: 20 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b    return (masks[
1be0: 6f 70 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70  op>>5] & (1<<(op
1bf0: 26 30 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66  &0x1F)));.}..#if
1c00: 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
1c10: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64  sqlite3VdbeOpcod
1c20: 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a  eNoPush(u8 op){.
1c30: 20 20 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e    return opcodeN
1c40: 6f 50 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e  oPush(op);.}.#en
1c50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20  dif../*.** Loop 
1c60: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
1c70: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
1c80: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
1c90: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  re negative..** 
1ca0: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
1cb0: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
1cc0: 6f 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62  olve the label b
1cd0: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32  y setting the P2
1ce0: 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73  .** value to its
1cf0: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
1d00: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
1d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1d20: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
1d30: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
1d40: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
1d50: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
1d60: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
1d70: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
1d80: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
1d90: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
1da0: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
1db0: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
1dc0: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
1dd0: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
1de0: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
1df0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
1e00: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
1e10: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
1e20: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  **.** The intege
1e30: 72 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20  r *pMaxStack is 
1e40: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1e50: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  um number of vdb
1e60: 65 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69  e stack.** entri
1e70: 65 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61  es that static a
1e80: 6e 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20  nalysis reveals 
1e90: 74 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67  this program mig
1ea0: 68 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ht need..**.** T
1eb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
1ec0: 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   does the follow
1ed0: 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ing optimization
1ee0: 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a  :  It scans for.
1ef0: 2a 2a 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74  ** Halt instruct
1f00: 69 6f 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53  ions where P1==S
1f10: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1f20: 20 6f 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74   or P2==OE_Abort
1f30: 20 6f 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e   or for.** IdxIn
1f40: 73 65 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  sert instruction
1f50: 73 20 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20  s where P2!=0.  
1f60: 49 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72  If no such instr
1f70: 75 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75  uction is.** fou
1f80: 6e 64 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53  nd, then every S
1f90: 74 61 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63  tatement instruc
1fa0: 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20  tion is changed 
1fb0: 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a  to a Noop.  In.*
1fc0: 2a 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 61  * this way, we a
1fd0: 76 6f 69 64 20 63 72 65 61 74 69 6e 67 20 74 68  void creating th
1fe0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1ff0: 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73  nal file unneces
2000: 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sarily..*/.stati
2010: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
2020: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
2030: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
2040: 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63  s, int *pMaxStac
2050: 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  k){.  int i;.  i
2060: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b  nt nMaxArgs = 0;
2070: 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b  .  int nMaxStack
2080: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20   = p->nOp;.  Op 
2090: 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  *pOp;.  int *aLa
20a0: 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b  bel = p->aLabel;
20b0: 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65  .  int doesState
20c0: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  mentRollback = 0
20d0: 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65  ;.  int hasState
20e0: 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20  mentBegin = 0;. 
20f0: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
2100: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
2110: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
2120: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
2130: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
2140: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
2150: 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63  _Function || opc
2160: 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20  ode==OP_AggStep 
2170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2180: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2190: 45 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63  E.        || opc
21a0: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a  ode==OP_VUpdate.
21b0: 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
21c0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
21d0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
21e0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
21f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2200: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a  ode==OP_Halt ){.
2210: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2220: 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  1==SQLITE_CONSTR
2230: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
2240: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
2250: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
2260: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
2270: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2280: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2290: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
22a0: 20 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74      hasStatement
22b0: 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  Begin = 1;.    }
22c0: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
22d0: 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20  =OP_VFilter ){. 
22e0: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
22f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
2300: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
2310: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
2320: 32 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  2].opcode==OP_In
2330: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e  teger );.      n
2340: 20 3d 20 70 4f 70 5b 2d 32 5d 2e 70 31 3b 0a 20   = pOp[-2].p1;. 
2350: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
2360: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2370: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   n;.    }.    if
2380: 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f  ( opcodeNoPush(o
2390: 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20  pcode) ){.      
23a0: 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20  nMaxStack--;.   
23b0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   }..    if( pOp-
23c0: 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75  >p2>=0 ) continu
23d0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2d  e;.    assert( -
23e0: 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61  1-pOp->p2<p->nLa
23f0: 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  bel );.    pOp->
2400: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
2410: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73  Op->p2];.  }.  s
2420: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61  qliteFree(p->aLa
2430: 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65  bel);.  p->aLabe
2440: 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46  l = 0;..  *pMaxF
2450: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
2460: 67 73 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b  gs;.  *pMaxStack
2470: 20 3d 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20   = nMaxStack;.. 
2480: 20 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20   /* If we never 
2490: 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  rollback a state
24a0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
24b0: 2c 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  , then statement
24c0: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
24d0: 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  ns are not neede
24e0: 64 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76  d.  So change ev
24f0: 65 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ery OP_Statement
2500: 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74  .  ** opcode int
2510: 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54  o an OP_Noop.  T
2520: 68 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c  his avoid a call
2530: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
2540: 6e 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a  nExclusive().  *
2550: 2a 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 65  * which can be e
2560: 78 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65  xpensive on some
2570: 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f   platforms..  */
2580: 0a 20 20 69 66 28 20 68 61 73 53 74 61 74 65 6d  .  if( hasStatem
2590: 65 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65  entBegin && !doe
25a0: 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61  sStatementRollba
25b0: 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f  ck ){.    for(pO
25c0: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
25d0: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
25e0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pOp++){.      i
25f0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2600: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  OP_Statement ){.
2610: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
2620: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
2630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2650: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2660: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
2670: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
2680: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
2690: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
26a0: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
26b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
26c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
26d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
26e0: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  nOp;.}../*.** Ad
26f0: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
2700: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
2710: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
2720: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ack.  Return the
2730: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
2740: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
2750: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74  on added..*/.int
2760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2770: 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69  pList(Vdbe *p, i
2780: 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69  nt nOp, VdbeOpLi
2790: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a  st const *aOp){.
27a0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73    int addr;.  as
27b0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
27c0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
27d0: 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70 41 72 72  );.  resizeOpArr
27e0: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e  ay(p, p->nOp + n
27f0: 4f 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  Op);.  if( sqlit
2800: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
2810: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2820: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70  ;.  }.  addr = p
2830: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70  ->nOp;.  if( nOp
2840: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  >0 ){.    int i;
2850: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
2860: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
2870: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2880: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
2890: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
28a0: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
28b0: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
28c0: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
28d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
28e0: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
28f0: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
2900: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
2910: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
2920: 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52  <0 ? addr + ADDR
2930: 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20  (p2) : p2;.     
2940: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d   pOut->p3 = pIn-
2950: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  >p3;.      pOut-
2960: 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70  >p3type = pIn->p
2970: 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20  3 ? P3_STATIC : 
2980: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64  P3_NOTUSED;.#ifd
2990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29b0: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
29c0: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ce ){.        sq
29d0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
29e0: 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e  (0, i+addr, &p->
29f0: 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20  aOp[i+addr]);.  
2a00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a10: 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d   }.    p->nOp +=
2a20: 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75   nOp;.  }.  retu
2a30: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
2a40: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2a50: 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65  ue of the P1 ope
2a60: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2a70: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2a80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a90: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
2aa0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
2ab0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
2ac0: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
2ad0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
2ae0: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
2af0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
2b00: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
2b10: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
2b20: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
2b30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b40: 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P1(Vdbe *p, int 
2b50: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2b60: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
2b70: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
2b80: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2b90: 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d   if( p && addr>=
2ba0: 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72  0 && p->nOp>addr
2bb0: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
2bc0: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
2bd0: 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  1 = val;.  }.}..
2be0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2bf0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32   value of the P2
2c00: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
2c10: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
2c20: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
2c30: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66  tine is useful f
2c40: 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d  or setting a jum
2c50: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a  p destination..*
2c60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2c70: 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20  beChangeP2(Vdbe 
2c80: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
2c90: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
2ca0: 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20 61 73  ( val>=0 );.  as
2cb0: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
2cc0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2cd0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
2ce0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
2cf0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
2d00: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
2d10: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
2d20: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
2d30: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
2d40: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
2d50: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
2d60: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
2d70: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
2d80: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
2d90: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
2da0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
2db0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2dc0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2dd0: 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr){.  sqlite3Vd
2de0: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
2df0: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a  dr, p->nOp);.}..
2e00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
2e10: 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75  put FuncDef stru
2e20: 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72  cture is ephemer
2e30: 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74  al, then free it
2e40: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e  .  If.** the Fun
2e50: 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65  cDef is not ephe
2e60: 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rmal, then do no
2e70: 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  thing..*/.static
2e80: 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65   void freeEpheme
2e90: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75 6e 63  ralFunction(Func
2ea0: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
2eb0: 28 20 70 44 65 66 20 26 26 20 28 70 44 65 66 2d  ( pDef && (pDef-
2ec0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2ed0: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
2ee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
2ef0: 28 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDef);.  }.}../
2f00: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 33  *.** Delete a P3
2f10: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
2f20: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2f30: 6f 69 64 20 66 72 65 65 50 33 28 69 6e 74 20 70  oid freeP3(int p
2f40: 33 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29  3type, void *p3)
2f50: 7b 0a 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20  {.  if( p3 ){.  
2f60: 20 20 73 77 69 74 63 68 28 20 70 33 74 79 70 65    switch( p3type
2f70: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
2f80: 33 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  3_DYNAMIC:.     
2f90: 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f   case P3_KEYINFO
2fa0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  :.      case P3_
2fb0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
2fc0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2fd0: 65 46 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20  eFree(p3);.     
2fe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ff0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
3000: 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20  MPRINTF: {.     
3010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3020: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
3030: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3040: 20 20 63 61 73 65 20 50 33 5f 56 44 42 45 46 55    case P3_VDBEFU
3050: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
3060: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
3070: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
3080: 70 33 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p3;.        free
3090: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
30a0: 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  n(pVdbeFunc->pFu
30b0: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nc);.        sql
30c0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
30d0: 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c  xData(pVdbeFunc,
30e0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
30f0: 69 74 65 46 72 65 65 28 70 56 64 62 65 46 75 6e  iteFree(pVdbeFun
3100: 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  c);.        brea
3110: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3120: 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46   case P3_FUNCDEF
3130: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
3140: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3150: 6e 28 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b  n((FuncDef*)p3);
3160: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3180: 73 65 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P3_MEM: {.   
3190: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
31a0: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
31b0: 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20  alue*)p3);.     
31c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
31e0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f  /*.** Change N o
31f0: 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20  pcodes starting 
3200: 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70  at addr to No-op
3210: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3220: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
3230: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
3240: 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  addr, int N){.  
3250: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70  VdbeOp *pOp = &p
3260: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 77  ->aOp[addr];.  w
3270: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
3280: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3290: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
32a0: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
32b0: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
32c0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  );.    pOp->opco
32d0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
32e0: 20 20 70 4f 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a    pOp++;.  }.}..
32f0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3300: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33   value of the P3
3310: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
3320: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
3330: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
3340: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
3350: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
3360: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
3370: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
3380: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
3390: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
33a0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
33b0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
33c0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
33d0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
33e0: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
33f0: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20  e P3 operand is 
3400: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
3410: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
3420: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
3430: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
3440: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
3450: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a  sqliteMalloc()..
3460: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
3470: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
3480: 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f  tes of zP3 up to
3490: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
34a0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
34b0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
34c0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
34d0: 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a  es of zP3..**.**
34e0: 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46   If n==P3_KEYINF
34f0: 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  O it means that 
3500: 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72  zP3 is a pointer
3510: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
3520: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f  ructure..** A co
3530: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
3540: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
3550: 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ure into memory 
3560: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
3570: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2c 20 74   sqliteMalloc, t
3580: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
3590: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
35a0: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f  lized..** n==P3_
35b0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
35c0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
35d0: 50 33 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P3 points to a K
35e0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
35f0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
3600: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
3610: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
3620: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3630: 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c  loc. The .** cal
3640: 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66  ler should not f
3650: 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ree the allocati
3660: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66  on, it will be f
3670: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
3680: 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a  be is.** finaliz
3690: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  ed..** .** Other
36a0: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 33   values of n (P3
36b0: 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f 4c 4c  _STATIC, P3_COLL
36c0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
36d0: 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f 69 6e  te that zP3 poin
36e0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
36f0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
3700: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
3710: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
3720: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
3730: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
3740: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
3750: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
3760: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
3770: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
3780: 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20 6d  ange P3 on the m
3790: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
37a0: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
37b0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
37c0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
37d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
37e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
37f0: 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  3, int n){.  Op 
3800: 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  *pOp;.  assert( 
3810: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
3820: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3830: 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  T );.  if( p==0 
3840: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  || p->aOp==0 || 
3850: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
3860: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 69 66 20  led() ){.    if 
3870: 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f  (n != P3_KEYINFO
3880: 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 33  ) {.      freeP3
3890: 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61  (n, (void*)*(cha
38a0: 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d  r**)&zP3);.    }
38b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
38c0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c  .  if( addr<0 ||
38d0: 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b   addr>=p->nOp ){
38e0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
38f0: 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  Op - 1;.    if( 
3900: 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b  addr<0 ) return;
3910: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
3920: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
3930: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
3940: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 70 4f  , pOp->p3);.  pO
3950: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 69 66 28  p->p3 = 0;.  if(
3960: 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP3==0 ){.    p
3970: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
3980: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
3990: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73  _NOTUSED;.  }els
39a0: 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49  e if( n==P3_KEYI
39b0: 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  NFO ){.    KeyIn
39c0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
39d0: 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42    int nField, nB
39e0: 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64  yte;..    nField
39f0: 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50   = ((KeyInfo*)zP
3a00: 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20  3)->nField;.    
3a10: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
3a20: 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69  pKeyInfo) + (nFi
3a30: 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b  eld-1)*sizeof(pK
3a40: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
3a50: 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  ) + nField;.    
3a60: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
3a70: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74  eMallocRaw( nByt
3a80: 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  e );.    pOp->p3
3a90: 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e   = (char*)pKeyIn
3aa0: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
3ab0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 6e  Info ){.      un
3ac0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 53 6f  signed char *aSo
3ad0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d  rtOrder;.      m
3ae0: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20  emcpy(pKeyInfo, 
3af0: 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  zP3, nByte);.   
3b00: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
3b10: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3b20: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
3b30: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
3b40: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
3b50: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
3b60: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
3b70: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
3b80: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
3b90: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
3ba0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
3bb0: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
3bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3bd0: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
3be0: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
3bf0: 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70  se{.      pOp->p
3c00: 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53  3type = P3_NOTUS
3c10: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
3c20: 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49  e if( n==P3_KEYI
3c30: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20  NFO_HANDOFF ){. 
3c40: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68     pOp->p3 = (ch
3c50: 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70  ar*)zP3;.    pOp
3c60: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45  ->p3type = P3_KE
3c70: 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69  YINFO;.  }else i
3c80: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
3c90: 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a  p->p3 = (char*)z
3ca0: 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  P3;.    pOp->p3t
3cb0: 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65  ype = n;.  }else
3cc0: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
3cd0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29   n = strlen(zP3)
3ce0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  ;.    pOp->p3 = 
3cf0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 50  sqliteStrNDup(zP
3d00: 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  3, n);.    pOp->
3d10: 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59 4e 41  p3type = P3_DYNA
3d20: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  MIC;.  }.}..#ifn
3d30: 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
3d40: 20 52 65 70 6c 61 63 65 20 74 68 65 20 50 33 20   Replace the P3 
3d50: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
3d60: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
3d70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74   instruction wit
3d80: 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 65 78  h.** comment tex
3d90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
3da0: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
3db0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
3dc0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
3dd0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3de0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3df0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
3e00: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
3e10: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33  aOp[p->nOp-1].p3
3e20: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 7c  ==0 .          |
3e30: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
3e40: 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 76 61 5f  ailed() );.  va_
3e50: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
3e60: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
3e70: 65 43 68 61 6e 67 65 50 33 28 70 2c 20 2d 31 2c  eChangeP3(p, -1,
3e80: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
3e90: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50  (zFormat, ap), P
3ea0: 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61  3_DYNAMIC);.  va
3eb0: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64  _end(ap);.}.#end
3ec0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
3ed0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
3ee0: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
3ef0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
3f00: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
3f10: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
3f20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3f30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3f40: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
3f50: 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ( addr>=0 && add
3f60: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65  r<p->nOp );.  re
3f70: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
3f80: 72 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  r];.}..#if !defi
3f90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3fa0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
3fb0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
3fc0: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
3fd0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
3fe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
3ff0: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
4000: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
4010: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
4020: 50 33 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P3 parameter for
4030: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
4040: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
4050: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
4060: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
4070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
4080: 20 2a 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a   *displayP3(Op *
4090: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
40a0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
40b0: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73  char *zP3;.  ass
40c0: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
40d0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
40e0: 3e 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p3type ){.    c
40f0: 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20  ase P3_KEYINFO: 
4100: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
4110: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
4120: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79  *pKeyInfo = (Key
4130: 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20  Info*)pOp->p3;. 
4140: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65       sprintf(zTe
4150: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
4160: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
4170: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
4180: 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20  trlen(zTemp);.  
4190: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
41a0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
41b0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
41c0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
41d0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
41e0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
41f0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
4200: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
4210: 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  n(pColl->zName);
4220: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
4230: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
4240: 20 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79            strcpy
4250: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
4260: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
4270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
4280: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65   }.          zTe
4290: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
42a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65           if( pKe
42b0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
42c0: 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  r && pKeyInfo->a
42d0: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a  SortOrder[j] ){.
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
42f0: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
4300: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4310: 20 20 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d      strcpy(&zTem
4320: 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p[i], pColl->zNa
4330: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
4340: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
4350: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
4360: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4370: 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b    strcpy(&zTemp[
4380: 69 5d 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20  i],",nil");.    
4390: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
43a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
43b0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
43c0: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
43d0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
43e0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
43f0: 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d  p );.      zP3 =
4400: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72   zTemp;.      br
4410: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4420: 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20  ase P3_COLLSEQ: 
4430: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
4440: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
4450: 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20  q*)pOp->p3;.    
4460: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
4470: 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29   "collseq(%.20s)
4480: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
4490: 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  ;.      zP3 = zT
44a0: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
44b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
44c0: 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P3_FUNCDEF: {. 
44d0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
44e0: 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70  ef = (FuncDef*)p
44f0: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71  Op->p3;.      sq
4500: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4510: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
4520: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
4530: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
4540: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
4550: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
4560: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
4570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4580: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
4590: 20 50 33 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P3_VTAB: {.    
45a0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
45b0: 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
45c0: 5f 76 74 61 62 2a 29 70 4f 70 2d 3e 70 33 3b 0a  _vtab*)pOp->p3;.
45d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
45e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
45f0: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
4600: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
4610: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
4620: 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP3 = zTemp;.  
4630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4640: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
4650: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33  ult: {.      zP3
4660: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
4670: 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20    if( zP3==0 || 
4680: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4690: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
46a0: 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  zP3 = "";.      
46b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
46c0: 73 65 72 74 28 20 7a 50 33 21 3d 30 20 29 3b 0a  sert( zP3!=0 );.
46d0: 20 20 72 65 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a    return zP3;.}.
46e0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66  #endif...#if def
46f0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4700: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
4710: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
4720: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
4730: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
4740: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
4750: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
4760: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
4770: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
4780: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
4790: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
47a0: 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61 72 20  ar *zP3;.  char 
47b0: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74  zPtr[50];.  stat
47c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
47d0: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
47e0: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 73 5c  -13s %4d %4d %s\
47f0: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
4800: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
4810: 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73 70 6c  t;.  zP3 = displ
4820: 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP3(pOp, zPtr, 
4830: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20  sizeof(zPtr));. 
4840: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
4850: 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20 20 70  Format1,.      p
4860: 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  c, sqlite3Opcode
4870: 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64  Names[pOp->opcod
4880: 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e], pOp->p1, pOp
4890: 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20 66 66  ->p2, zP3);.  ff
48a0: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
48b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ndif../*.** Rele
48c0: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
48d0: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
48e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
48f0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
4900: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
4910: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68 69  if( p ){.    whi
4920: 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20  le( N-->0 ){.   
4930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
4940: 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20  mRelease(p++);. 
4950: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
4960: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4970: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
4980: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
4990: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
49a0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
49b0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
49c0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
49d0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
49e0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
49f0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
4a00: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
4a10: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
4a20: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
4a30: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
4a40: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
4a50: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
4a60: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
4a70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4a80: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
4a90: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4aa0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
4ab0: 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  E */.){.  sqlite
4ac0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
4ad0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
4ae0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
4af0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
4b00: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ain );.  if( p->
4b10: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
4b20: 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53  C_RUN ) return S
4b30: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
4b40: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69  assert( db->magi
4b50: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
4b60: 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74  BUSY );.  assert
4b70: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
4b80: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
4b90: 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f  ITE_BUSY );..  /
4ba0: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
4bb0: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
4bc0: 6f 74 20 70 75 74 20 64 79 6e 61 6d 69 63 20 73  ot put dynamic s
4bd0: 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a  trings onto the.
4be0: 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c 20    ** the stack, 
4bf0: 74 68 65 79 20 6d 61 79 20 62 65 63 6f 6d 65 20  they may become 
4c00: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
4c10: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
4c20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4c30: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
4c40: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
4c50: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
4c60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
4c70: 70 54 6f 73 3d 3d 26 70 2d 3e 61 53 74 61 63 6b  pTos==&p->aStack
4c80: 5b 34 5d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  [4] ){.    relea
4c90: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
4ca0: 74 61 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a 20 20  tack, 5);.  }.  
4cb0: 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20  p->resOnStack = 
4cc0: 30 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20  0;..  do{.    i 
4cd0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
4ce0: 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26  ile( i<p->nOp &&
4cf0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
4d00: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
4d10: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
4d20: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f  ;.  if( i>=p->nO
4d30: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  p ){.    p->rc =
4d40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4d50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
4d60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
4d70: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
4d80: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
4d90: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
4da0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
4db0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
4dc0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
4dd0: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
4de0: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
4df0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
4e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70  }else{.    Op *p
4e10: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
4e20: 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
4e30: 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20   p->aStack;.    
4e40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
4e50: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
4e60: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
4e70: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
4e80: 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  ->i = i;        
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
4eb0: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
4ec0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
4ed0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
4ee0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
4ef0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d  MEM_Term;.    pM
4f00: 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 4f  em->z = sqlite3O
4f10: 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e  pcodeNames[pOp->
4f20: 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f 70 63  opcode];  /* Opc
4f30: 6f 64 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ode */.    asser
4f40: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
4f50: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73  .    pMem->n = s
4f60: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
4f70: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
4f80: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
4f90: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
4fa0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70  LITE_UTF8;.    p
4fb0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
4fc0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
4fd0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  t;.    pMem->i =
4fe0: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
5010: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5020: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
5030: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
5040: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5050: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69  Int;.    pMem->i
5060: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
5090: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
50a0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
50b0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
50c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
50d0: 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c  M_Ephem|MEM_Str|
50e0: 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20 50  MEM_Term;   /* P
50f0: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  3 */.    pMem->z
5100: 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70   = displayP3(pOp
5110: 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20  , pMem->zShort, 
5120: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68  sizeof(pMem->zSh
5130: 6f 72 74 29 29 3b 0a 20 20 20 20 61 73 73 65 72  ort));.    asser
5140: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
5150: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73  .    pMem->n = s
5160: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5170: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
5180: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
5190: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
51a0: 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20  LITE_UTF8;..    
51b0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
51c0: 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61 69  5 - 2*(p->explai
51d0: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f  n-1);.    p->pTo
51e0: 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d  s = pMem;.    p-
51f0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
5200: 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61  .    p->resOnSta
5210: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  ck = 1;.    rc =
5220: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
5230: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5240: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5250: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
5260: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
5270: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
5280: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
5290: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
52a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
52b0: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
52c0: 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
52d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20  ITE_DEBUG.  int 
52e0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
52f0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
5300: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
5310: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
5320: 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28  Op[nOp-1];.  if(
5330: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
5340: 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33  _Noop && pOp->p3
5350: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=0 ){.    const
5360: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
5370: 70 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  p3;.    while( i
5380: 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20  sspace(*(u8*)z) 
5390: 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74  ) z++;.    print
53a0: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
53b0: 20 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   z);.  }.#endif.
53c0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
53d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
53e0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
53f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
5400: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
5410: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
5420: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
5430: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
5440: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
5450: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
5460: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
5470: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
5480: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
5490: 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29 20  3_io_trace==0 ) 
54a0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
54b0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
54c0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f  pOp = &p->aOp[nO
54d0: 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p-1];.  if( pOp-
54e0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70  >opcode==OP_Noop
54f0: 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29   && pOp->p3!=0 )
5500: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
5510: 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 70 4f  sqlite3StrDup(pO
5520: 70 2d 3e 70 33 29 3b 0a 20 20 20 20 69 6e 74 20  p->p3);.    int 
5530: 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d  i, j;.    for(i=
5540: 30 3b 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29  0; isspace(z[i])
5550: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
5560: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
5570: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 73 70  {.      if( issp
5580: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
5590: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
55a0: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
55b0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
55c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
55d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
55e0: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
55f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5600: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
5610: 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 28 22  lite3_io_trace("
5620: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
5630: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
5640: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
5650: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
5660: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
5670: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
5680: 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  .../*.** Prepare
5690: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
56a0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
56b0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
56c0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
56d0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
56e0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
56f0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
5700: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
5710: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
5720: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
5730: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
5740: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
5750: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
5760: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
5770: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
5780: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
5790: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
57a0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
57b0: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
57c0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69  AGIC_RUN..*/.voi
57d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
57e0: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
57f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5810: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  VDBE */.  int nV
5820: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
5830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5840: 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e  er of '?' see in
5850: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
5860: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  nt */.  int nMem
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5880: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5890: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
58a0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
58b0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20    int nCursor,  
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
58e0: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  rsors to allocat
58f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70  e */.  int isExp
5900: 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
5910: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5920: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
5930: 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74  words is present
5940: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
5950: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
5960: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5970: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5980: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
5990: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
59a0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
59b0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
59c0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
59d0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
59e0: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
59f0: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
5a00: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
5a10: 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63  This.   * is bec
5a20: 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
5a30: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29   resizeOpArray()
5a40: 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e   below may shrin
5a50: 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f  k the.   * p->aO
5a60: 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76  p[] array to sav
5a70: 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c  e memory if call
5a80: 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f  ed when in VDBE_
5a90: 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20  MAGIC_RUN .   * 
5aa0: 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70  state..   */.  p
5ab0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
5ac0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20  AGIC_RUN;..  /* 
5ad0: 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  No instruction e
5ae0: 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20  ver pushes more 
5af0: 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c  than a single el
5b00: 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20  ement onto the. 
5b10: 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20   ** stack.  And 
5b20: 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20  the stack never 
5b30: 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73  grows on success
5b40: 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f  ive executions o
5b50: 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  f the.  ** same 
5b60: 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f  loop.  So the to
5b70: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
5b80: 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e  structions is an
5b90: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a   upper bound.  *
5ba0: 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  * on the maximum
5bb0: 20 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71   stack depth req
5bc0: 75 69 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c  uired.  (Added l
5bd0: 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a  ater:)  The.  **
5be0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
5bf0: 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73  () call computes
5c00: 20 61 20 74 69 67 68 74 65 72 20 75 70 70 65 72   a tighter upper
5c10: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20   bound on the.  
5c20: 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20  ** stack size.. 
5c30: 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   **.  ** Allocat
5c40: 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63  ion all the stac
5c50: 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20  k space we will 
5c60: 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a  ever need..  */.
5c70: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d    if( p->aStack=
5c80: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  =0 ){.    int nA
5c90: 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  rg;       /* Max
5ca0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
5cb0: 72 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20  rgs passed to a 
5cc0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  user function. *
5cd0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b  /.    int nStack
5ce0: 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  ;     /* Maximum
5cf0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b   number of stack
5d00: 20 65 6e 74 72 69 65 73 20 72 65 71 75 69 72 65   entries require
5d10: 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65  d */.    resolve
5d20: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
5d30: 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20  g, &nStack);.   
5d40: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
5d50: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61  , p->nOp);.    a
5d60: 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29  ssert( nVar>=0 )
5d70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53  ;.    assert( nS
5d80: 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  tack<p->nOp );. 
5d90: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
5da0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 61 63 6b   ){.      nStack
5db0: 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20   = 10;.    }.   
5dc0: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
5dd0: 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  iteMalloc(.     
5de0: 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a 65 6f 66     nStack*sizeof
5df0: 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20 20  (p->aStack[0])  
5e00: 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20    /* aStack */. 
5e10: 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65       + nArg*size
5e20: 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20  of(Mem*)        
5e30: 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a        /* apArg *
5e40: 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73  /.      + nVar*s
5e50: 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20  izeof(Mem)      
5e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72           /* aVar
5e70: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72   */.      + nVar
5e80: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20  *sizeof(char*)  
5e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a             /* az
5ea0: 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Var */.      + n
5eb0: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Mem*sizeof(Mem) 
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ed0: 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b   aMem */.      +
5ee0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
5ef0: 43 75 72 73 6f 72 2a 29 20 20 20 20 20 20 20 20  Cursor*)        
5f00: 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20  /* apCsr */.    
5f10: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
5f20: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
5f30: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ) ){.      p->aM
5f40: 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  em = &p->aStack[
5f50: 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20 70  nStack];.      p
5f60: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ->nMem = nMem;. 
5f70: 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26       p->aVar = &
5f80: 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20  p->aMem[nMem];. 
5f90: 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e       p->nVar = n
5fa0: 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b  Var;.      p->ok
5fb0: 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Var = 0;.      p
5fc0: 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a  ->apArg = (Mem**
5fd0: 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b  )&p->aVar[nVar];
5fe0: 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  .      p->azVar 
5ff0: 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70  = (char**)&p->ap
6000: 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20  Arg[nArg];.     
6010: 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75 72   p->apCsr = (Cur
6020: 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b  sor**)&p->azVar[
6030: 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nVar];.      p->
6040: 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
6050: 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30  r;.      for(n=0
6060: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
6070: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
6080: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
6090: 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ull;.      }.   
60a0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30   }.  }.  for(n=0
60b0: 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b  ; n<p->nMem; n++
60c0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  ){.    p->aMem[n
60d0: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
60e0: 6c 6c 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 54  ll;.  }..  p->pT
60f0: 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  os = &p->aStack[
6100: 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  -1];.  p->pc = -
6110: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
6120: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69  ITE_OK;.  p->uni
6130: 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  queCnt = 0;.  p-
6140: 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30  >returnDepth = 0
6150: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
6160: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
6170: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20   p->popStack =  
6180: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
6190: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
61a0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
61b0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
61c0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
61d0: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
61e0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
61f0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 23  eFormat = 255;.#
6200: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
6210: 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  LE.  {.    int i
6220: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6230: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
6240: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
6250: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  nt = 0;.      p-
6260: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
6270: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
6280: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
6290: 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64  ose a cursor and
62a0: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
62b0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
62c0: 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a  cursor happens.*
62d0: 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  * to hold..*/.vo
62e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
62f0: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
6300: 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  , Cursor *pCx){.
6310: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
6320: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6330: 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73    if( pCx->pCurs
6340: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
6350: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
6360: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
6370: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
6380: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
6390: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
63a0: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e  ->pBt);.  }.#ifn
63b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
63c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
63d0: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
63e0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
63f0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
6400: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
6410: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
6420: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
6430: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
6440: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
6450: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
6460: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 73  ethod = 1;.    s
6470: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
6480: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64  p->db);.    pMod
6490: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
64a0: 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  bCursor);.    sq
64b0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
64c0: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
64d0: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
64e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
64f0: 74 65 46 72 65 65 28 70 43 78 2d 3e 70 44 61 74  teFree(pCx->pDat
6500: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
6510: 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20  (pCx->aType);.  
6520: 73 71 6c 69 74 65 46 72 65 65 28 70 43 78 29 3b  sqliteFree(pCx);
6530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6540: 61 6c 6c 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73  all cursors.*/.s
6550: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
6560: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
6570: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
6580: 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20  if( p->apCsr==0 
6590: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
65a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
65b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
65c0: 20 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f   !p->inVtabMetho
65d0: 64 20 7c 7c 20 28 70 2d 3e 61 70 43 73 72 5b 69  d || (p->apCsr[i
65e0: 5d 20 26 26 20 21 70 2d 3e 61 70 43 73 72 5b 69  ] && !p->apCsr[i
65f0: 5d 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20  ]->pVtabCursor) 
6600: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6610: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
6620: 2c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a  , p->apCsr[i]);.
6630: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
6640: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
6650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
6660: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
6670: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
6680: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
6690: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
66a0: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
66b0: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
66c0: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
66d0: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
66e0: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
66f0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
6700: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
6710: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
6720: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
6730: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
6740: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
6750: 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a  f( p->aStack ){.
6760: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
6770: 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 31  ray(p->aStack, 1
6780: 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70 2d   + (p->pTos - p-
6790: 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 70  >aStack));.    p
67a0: 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74  ->pTos = &p->aSt
67b0: 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20 63  ack[-1];.  }.  c
67c0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
67d0: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
67e0: 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
67f0: 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >nMem);.  sqlite
6800: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
6810: 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66 28  p->sFifo);.  if(
6820: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6830: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6840: 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61   i<p->contextSta
6850: 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ckTop; i++){.   
6860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69     sqlite3VdbeFi
6870: 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e 74  foClear(&p->cont
6880: 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69 66  extStack[i].sFif
6890: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  o);.    }.    sq
68a0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 63 6f 6e 74  liteFree(p->cont
68b0: 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20  extStack);.  }. 
68c0: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
68d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65   = 0;.  p->conte
68e0: 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30  xtStackDepth = 0
68f0: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
6900: 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71  ackTop = 0;.  sq
6910: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72  liteFree(p->zErr
6920: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
6930: 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sg = 0;.}../*.**
6940: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
6950: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
6960: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
6970: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6980: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
6990: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
69a0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
69b0: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
69c0: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
69d0: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
69e0: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
69f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
6a00: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
6a10: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
6a20: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
6a30: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
6a40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6a50: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
6a60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
6a70: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
6a80: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
6a90: 20 6e 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   n;.  releaseMem
6aa0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
6ab0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
6ac0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
6ad0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f  qliteFree(p->aCo
6ae0: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
6af0: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
6b00: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
6b10: 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e  umn = nResColumn
6b20: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
6b30: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
6b40: 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  m*)sqliteMalloc(
6b50: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
6b60: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
6b70: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6b80: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
6b90: 30 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61  0 ){.    (pColNa
6ba0: 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d  me++)->flags = M
6bb0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a  EM_Null;.  }.}..
6bc0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
6bd0: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
6be0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
6bf0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
6c00: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
6c10: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
6c20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
6c30: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
6c40: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
6c50: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
6c60: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
6c70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
6c80: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
6c90: 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20  If N==P3_STATIC 
6ca0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a   it means that z
6cb0: 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Name is a pointe
6cc0: 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20  r to a constant 
6cd0: 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67  static.** string
6ce0: 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74   and we can just
6cf0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
6d00: 72 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44  r. If it is P3_D
6d10: 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a  YNAMIC, then .**
6d20: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66   the string is f
6d30: 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
6d40: 65 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  eFree() when the
6d50: 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65   vdbe is finishe
6d60: 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74  d with.** it. Ot
6d70: 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73  herwise, N bytes
6d80: 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f   of zName are co
6d90: 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pied..*/.int sql
6da0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6db0: 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  me(Vdbe *p, int 
6dc0: 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f  idx, int var, co
6dd0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6de0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72   int N){.  int r
6df0: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
6e00: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
6e10: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
6e20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
6e30: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
6e40: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
6e50: 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
6e60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6e70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
6e80: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
6e90: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
6ea0: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
6eb0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
6ec0: 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e  .  if( N==P3_DYN
6ed0: 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54  AMIC || N==P3_ST
6ee0: 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  ATIC ){.    rc =
6ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
6f00: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
6f10: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
6f20: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
6f30: 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
6f40: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6f50: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
6f60: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
6f70: 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53  N, SQLITE_UTF8,S
6f80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
6f90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
6fa0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d  SQLITE_OK && N==
6fb0: 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P3_DYNAMIC ){.  
6fc0: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
6fd0: 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66  s = (pColName->f
6fe0: 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69  lags&(~MEM_Stati
6ff0: 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  c))|MEM_Dyn;.   
7000: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20   pColName->xDel 
7010: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
7020: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7030: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
7040: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
7050: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
7060: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
7070: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
7080: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7090: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
70a0: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
70b0: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
70c0: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
70d0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
70e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
70f0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
7100: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
7110: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
7120: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
7130: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
7140: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
7150: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
7160: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
7170: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
7180: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
7190: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
71a0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
71b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
71c0: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
71d0: 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65   0;..  /* Before
71e0: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
71f0: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
7200: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
7210: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
7220: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
7230: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
7240: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
7250: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
7260: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
7270: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
7280: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
7290: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
72a0: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
72b0: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
72c0: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
72d0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
72e0: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
72f0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
7300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
7310: 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20  bSync(db, rc);. 
7320: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7330: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
7340: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
7350: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
7360: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
7370: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
7380: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
7390: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
73a0: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
73b0: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
73c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
73d0: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
73e0: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
73f0: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
7400: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
7410: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
7420: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
7430: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
7440: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
7450: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
7460: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
7470: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7480: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
7490: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
74a0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
74b0: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
74c0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
74d0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
74e0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
74f0: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
7500: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
7510: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
7520: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
7530: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
7540: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
7550: 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
7560: 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
7570: 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
7580: 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
7590: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
75a0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
75b0: 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
75c0: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
75d0: 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
75e0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
75f0: 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
7600: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
7610: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
7620: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
7630: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
7640: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
7650: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
7660: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
7670: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
7680: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
7690: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
76a0: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
76b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
76c0: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
76d0: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
76e0: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
76f0: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
7700: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
7710: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
7720: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
7730: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
7740: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
7750: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
7760: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
7770: 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20  mory:.  In that 
7780: 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20  case we do.  ** 
7790: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
77a0: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
77b0: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
77c0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  e simple case th
77d0: 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a  en.  ** too..  *
77e0: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65  /.  if( 0==strle
77f0: 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n(sqlite3BtreeGe
7800: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
7810: 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54  b[0].pBt)) || nT
7820: 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66  rans<=1 ){.    f
7830: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
7840: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
7850: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
7860: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
7870: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7880: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
7890: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
78a0: 74 65 33 42 74 72 65 65 53 79 6e 63 28 70 42 74  te3BtreeSync(pBt
78b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
78c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
78d0: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
78e0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
78f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
7900: 63 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ced */.    if( r
7910: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7920: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7930: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
7940: 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
7950: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7960: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pBt;.        if(
7970: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
7980: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
7990: 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
79a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
79b0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
79c0: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
79d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
79e0: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
79f0: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
7a00: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
7a10: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
7a20: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
7a30: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
7a40: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
7a50: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7a60: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
7a70: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
7a80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7a90: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
7aa0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  se{.    int need
7ab0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
7ac0: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
7ad0: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
7ae0: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
7af0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
7b00: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
7b10: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
7b20: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
7b30: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
7b40: 20 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65     OsFile *maste
7b50: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  r = 0;..    /* S
7b60: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
7b70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
7b80: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
7b90: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20     u32 random;. 
7ba0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7bb0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
7bc0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
7bd0: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
7be0: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
7bf0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
7c00: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2d 6d  te3MPrintf("%s-m
7c10: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
7c20: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
7c30: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
7c40: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
7c50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7c60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7c70: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
7c80: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
7c90: 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a 0a 20  s(zMaster) );.. 
7ca0: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
7cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
7cc0: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
7cd0: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
7ce0: 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  e(zMaster, &mast
7cf0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
7d00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7d20: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7d30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7d40: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
7d50: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
7d60: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
7d70: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
7d80: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
7d90: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
7da0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
7db0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7dc0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
7dd0: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
7de0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
7df0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
7e00: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
7e10: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
7e20: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
7e30: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
7e40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
7e50: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
7e60: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
7e70: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
7e80: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
7e90: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
7ea0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
7eb0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
7ec0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
7ed0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7ee0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
7ef0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f   ) continue;   /
7f00: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d  * Ignore the TEM
7f10: 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
7f20: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
7f30: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
7f40: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
7f50: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
7f60: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
7f70: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
7f80: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
7f90: 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
7fa0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
7fb0: 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79  * Ignore :memory
7fc0: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
7fd0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
7fe0: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
7ff0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
8000: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
8010: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
8020: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8030: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8040: 4f 73 57 72 69 74 65 28 6d 61 73 74 65 72 2c 20  OsWrite(master, 
8050: 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46  zFile, strlen(zF
8060: 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 20  ile)+1);.       
8070: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8080: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
8090: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
80a0: 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  master);.       
80b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
80c0: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  te(zMaster);.   
80d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
80e0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
80f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8100: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8110: 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f   }.    }...    /
8120: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
8130: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
8140: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
8150: 73 2c 20 6f 70 65 6e 20 74 68 65 20 64 69 72 65  s, open the dire
8160: 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74 68 65  ctory.    ** the
8170: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8180: 66 69 6c 65 20 69 73 20 73 74 6f 72 65 20 69 6e  file is store in
8190: 20 73 6f 20 74 68 61 74 20 69 74 20 67 65 74 73   so that it gets
81a0: 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20 20 20   synced too..   
81b0: 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c   */.    zMainFil
81c0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
81d0: 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61  GetDirname(db->a
81e0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
81f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
8200: 65 6e 44 69 72 65 63 74 6f 72 79 28 6d 61 73 74  enDirectory(mast
8210: 65 72 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  er, zMainFile);.
8220: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8230: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
8240: 20 20 20 28 6e 65 65 64 53 79 6e 63 20 26 26 20     (needSync && 
8250: 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e  (rc=sqlite3OsSyn
8260: 63 28 6d 61 73 74 65 72 2c 30 29 29 21 3d 53 51  c(master,0))!=SQ
8270: 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
8280: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8290: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
82a0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
82b0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
82c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
82d0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
82e0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
82f0: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
8300: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
8310: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
8320: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
8330: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
8340: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
8350: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
8360: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
8370: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
8380: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
8390: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
83a0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
83b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
83c0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
83d0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
83e0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
83f0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
8400: 65 33 42 74 72 65 65 53 79 6e 63 28 29 2c 0a 20  e3BtreeSync(),. 
8410: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
8420: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
8430: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
8440: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
8450: 65 0a 20 20 20 20 2a 2a 20 6f 72 70 68 61 6e 65  e.    ** orphane
8460: 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
8470: 20 64 65 6c 65 74 65 20 69 74 2c 20 69 6e 20 63   delete it, in c
8480: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
8490: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
84a0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
84b0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
84c0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
84d0: 20 74 68 65 20 66 61 69 6c 75 72 65 0a 20 20 20   the failure.   
84e0: 20 2a 2a 20 6f 63 63 75 72 65 64 2e 0a 20 20 20   ** occured..   
84f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
8500: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8510: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
8520: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
8530: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
8540: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
8550: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
8560: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
8570: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
8580: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
8590: 79 6e 63 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  ync(pBt, zMaster
85a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
85b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
85c0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
85d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
85e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
85f0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
8600: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8610: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
8620: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
8630: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8640: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
8650: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
8660: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
8670: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
8680: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
8690: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
86a0: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
86b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
86c0: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
86d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
86e0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
86f0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (zMaster);.    i
8700: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
8710: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8720: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8730: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
8740: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  ster = 0;.    rc
8750: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
8760: 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46  Directory(zMainF
8770: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ile);.    if( rc
8780: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8790: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
87a0: 6e 6f 74 20 67 6f 6f 64 2e 20 54 68 65 20 6d 61  not good. The ma
87b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
87c0: 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  e has been delet
87d0: 65 64 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  ed, but.      **
87e0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
87f0: 79 6e 63 20 66 61 69 6c 65 64 2e 20 54 68 65 72  ync failed. Ther
8800: 65 20 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 74 65  e is no complete
8810: 6c 79 20 73 61 66 65 20 63 6f 75 72 73 65 20 6f  ly safe course o
8820: 66 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 6f  f.      ** actio
8830: 6e 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 65  n from here. The
8840: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
8850: 6e 61 6c 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  nals contain the
8860: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   name of the.   
8870: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
8880: 72 6e 61 6c 20 66 69 6c 65 2c 20 62 75 74 20 74  rnal file, but t
8890: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 6f  here is no way o
88a0: 66 20 6b 6e 6f 77 69 6e 67 20 69 66 20 74 68 61  f knowing if tha
88b0: 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65  t.      ** maste
88c0: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
88d0: 20 6e 6f 77 20 6f 72 20 69 66 20 69 74 20 77 69   now or if it wi
88e0: 6c 6c 20 65 78 69 73 74 20 61 66 74 65 72 20 74  ll exist after t
88f0: 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 20  he operating.   
8900: 20 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61     ** system cra
8910: 73 68 20 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c  sh that may foll
8920: 6f 77 20 74 68 65 20 66 73 79 6e 63 28 29 20 66  ow the fsync() f
8930: 61 69 6c 75 72 65 2e 0a 20 20 20 20 20 20 2a 2f  ailure..      */
8940: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8950: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8960: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
8970: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
8980: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
8990: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
89a0: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
89b0: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
89c0: 65 43 6f 6d 6d 69 74 28 29 20 61 72 65 20 6f 6e  eCommit() are on
89d0: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
89e0: 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 0a 20 20   and deleting.  
89f0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20 49    ** journals. I
8a00: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
8a10: 20 77 72 6f 6e 67 20 77 68 69 6c 65 20 74 68 69   wrong while thi
8a20: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
8a30: 65 20 64 6f 6e 27 74 0a 20 20 20 20 2a 2a 20 72  e don't.    ** r
8a40: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
8a50: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
8a60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8a70: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
8a80: 65 64 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 73  ed,.    ** but s
8a90: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
8aa0: 20 6a 6f 75 72 6e 61 6c 73 20 6d 61 79 20 62 65   journals may be
8ab0: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
8ac0: 65 74 75 72 6e 69 6e 67 20 61 6e 0a 20 20 20 20  eturning an.    
8ad0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  ** error code wo
8ae0: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
8af0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8b00: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
8b10: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
8b20: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8b30: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
8b40: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
8b50: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8b60: 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
8b70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8b80: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
8b90: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
8ba0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
8bb0: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
8bc0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
8bd0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
8be0: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
8bf0: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
8c00: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
8c10: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
8c20: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
8c30: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
8c40: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
8c50: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
8c60: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
8c70: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
8c80: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
8c90: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
8ca0: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
8cb0: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
8cc0: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
8cd0: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
8ce0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
8cf0: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
8d00: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
8d10: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
8d20: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
8d30: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
8d40: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
8d50: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
8d60: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
8d70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
8d80: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
8d90: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
8da0: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
8db0: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
8dc0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
8dd0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8de0: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
8df0: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
8e00: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
8e10: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
8e20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
8e30: 69 6e 64 20 65 76 65 72 79 20 61 63 74 69 76 65  ind every active
8e40: 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e 20 70   VM other than p
8e50: 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67 65 20  Vdbe and change 
8e60: 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a 2a 2a  its status to.**
8e70: 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69 73 20   aborted.  This 
8e80: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f 6e 65  happens when one
8e90: 20 56 4d 20 63 61 75 73 65 73 20 61 20 72 6f 6c   VM causes a rol
8ea0: 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61 6e 0a  lback due to an.
8eb0: 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  ** ON CONFLICT R
8ec0: 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65 20 28  OLLBACK clause (
8ed0: 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20 20 54  for example).  T
8ee0: 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73  he other VMs mus
8ef0: 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65 64 20  t be.** aborted 
8f00: 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20  so that they do 
8f10: 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20 72 6f  not have data ro
8f20: 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  lled out from un
8f30: 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68 65 6d  derneath.** them
8f40: 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20 73 65   leading to a se
8f50: 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gfault..*/.void 
8f60: 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65  sqlite3AbortOthe
8f70: 72 41 63 74 69 76 65 56 64 62 65 73 28 73 71 6c  rActiveVdbes(sql
8f80: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
8f90: 70 45 78 63 65 70 74 29 7b 0a 20 20 56 64 62 65  pExcept){.  Vdbe
8fa0: 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f 72 28   *pOther;.  for(
8fb0: 70 4f 74 68 65 72 3d 64 62 2d 3e 70 56 64 62 65  pOther=db->pVdbe
8fc0: 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74 68 65 72  ; pOther; pOther
8fd0: 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b  =pOther->pNext){
8fe0: 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 3d  .    if( pOther=
8ff0: 3d 70 45 78 63 65 70 74 20 29 20 63 6f 6e 74 69  =pExcept ) conti
9000: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 74  nue;.    if( pOt
9010: 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  her->magic!=VDBE
9020: 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 4f  _MAGIC_RUN || pO
9030: 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f 6e  ther->pc<0 ) con
9040: 74 69 6e 75 65 3b 0a 20 20 20 20 63 68 65 63 6b  tinue;.    check
9050: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
9060: 29 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43  );.    closeAllC
9070: 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29 3b 0a  ursors(pOther);.
9080: 20 20 20 20 63 68 65 63 6b 41 63 74 69 76 65 56      checkActiveV
9090: 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20 20  dbeCnt(db);.    
90a0: 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64 20  pOther->aborted 
90b0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
90c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
90d0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
90e0: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
90f0: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
9100: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
9110: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
9120: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
9130: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
9140: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
9150: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
9160: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
9170: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
9180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9190: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
91a0: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
91b0: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
91c0: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
91d0: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
91e0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a  E_MAGIC_HALT..**
91f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
9200: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
9210: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
9220: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
9230: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
9240: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
9250: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
9260: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
9270: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
9280: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
9290: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
92a0: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
92b0: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
92c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
92d0: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
92e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
92f0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
9300: 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65  t (*xFunc)(Btree
9310: 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20   *pBt) = 0;  /* 
9320: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
9330: 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20 62   on each btree b
9340: 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ackend */.  int 
9350: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
9360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
9370: 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c  t to true if SQL
9380: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45  ITE_NOMEM or IOE
9390: 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  RR */..  /* This
93a0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
93b0: 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
93c0: 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
93d0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
93e0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
93f0: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
9400: 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
9410: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
9420: 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
9430: 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
9440: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
9450: 2a 0a 20 20 2a 2a 20 53 70 65 63 69 61 6c 20 65  *.  ** Special e
9460: 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors:.  **.  **
9470: 20 20 20 20 20 49 66 20 61 6e 20 53 51 4c 49 54       If an SQLIT
9480: 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f 72 20 68 61  E_NOMEM error ha
9490: 73 20 6f 63 63 75 72 65 64 20 69 6e 20 61 20 73  s occured in a s
94a0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 72  tatement that wr
94b0: 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20 20 20 20  ites to.  **    
94c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
94d0: 68 65 6e 20 65 69 74 68 65 72 20 61 20 73 74 61  hen either a sta
94e0: 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
94f0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
9500: 6c 6c 65 64 0a 20 20 2a 2a 20 20 20 20 20 62 61  lled.  **     ba
9510: 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ck to ensure the
9520: 20 74 72 65 65 2d 73 74 72 75 63 74 75 72 65 73   tree-structures
9530: 20 61 72 65 20 69 6e 20 61 20 63 6f 6e 73 69 73   are in a consis
9540: 74 65 6e 74 20 73 74 61 74 65 2e 20 41 0a 20 20  tent state. A.  
9550: 2a 2a 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74  **     statement
9560: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9570: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 6f  rolled back if o
9580: 6e 65 20 69 73 20 6f 70 65 6e 2c 20 6f 74 68 65  ne is open, othe
9590: 72 77 69 73 65 20 74 68 65 0a 20 20 2a 2a 20 20  rwise the.  **  
95a0: 20 20 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61     entire transa
95b0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
95c0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  lled back..  **.
95d0: 20 20 2a 2a 20 20 20 20 20 49 66 20 61 6e 20 53    **     If an S
95e0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 65 72 72 6f  QLITE_IOERR erro
95f0: 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 69 6e  r has occured in
9600: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61   a statement tha
9610: 74 20 77 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a  t writes to.  **
9620: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
9630: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
9640: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  re transaction m
9650: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
9660: 63 6b 2e 20 54 68 65 0a 20 20 2a 2a 20 20 20 20  ck. The.  **    
9670: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 61 79 20 68   I/O error may h
9680: 61 76 65 20 63 61 75 73 65 64 20 67 61 72 62 61  ave caused garba
9690: 67 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ge to be written
96a0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
96b0: 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  .  **     file. 
96c0: 57 65 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  Were the transac
96d0: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
96e0: 20 61 6e 64 20 65 76 65 6e 74 75 61 6c 6c 79 20   and eventually 
96f0: 62 65 20 72 6f 6c 6c 65 64 20 0a 20 20 2a 2a 20  be rolled .  ** 
9700: 20 20 20 20 62 61 63 6b 20 74 68 61 74 20 67 61      back that ga
9710: 72 62 61 67 65 20 6d 69 67 68 74 20 65 6e 64 20  rbage might end 
9720: 75 70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  up in the databa
9730: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 20 20  se file..  **   
9740: 20 20 0a 20 20 2a 2a 20 20 20 20 20 49 6e 20 62    .  **     In b
9750: 6f 74 68 20 6f 66 20 74 68 65 20 61 62 6f 76 65  oth of the above
9760: 20 63 61 73 65 73 2c 20 74 68 65 20 56 64 62 65   cases, the Vdbe
9770: 2e 65 72 72 6f 72 41 63 74 69 6f 6e 20 76 61 72  .errorAction var
9780: 69 61 62 6c 65 20 69 73 20 0a 20 20 2a 2a 20 20  iable is .  **  
9790: 20 20 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 74     ignored. If t
97a0: 68 65 20 73 71 6c 69 74 65 33 2e 61 75 74 6f 43  he sqlite3.autoC
97b0: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 66 61  ommit flag is fa
97c0: 6c 73 65 20 61 6e 64 20 61 20 74 72 61 6e 73 61  lse and a transa
97d0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69  ction.  **     i
97e0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 69  s rolled back, i
97f0: 74 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  t will be set to
9800: 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   true..  **.  **
9810: 20 4f 74 68 65 72 20 65 72 72 6f 72 73 3a 0a 20   Other errors:. 
9820: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20 65 72 72 6f   **.  ** No erro
9830: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 0a 20 20  r:.  **.  */..  
9840: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
9850: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
9860: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9870: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
9880: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
9890: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
98a0: 20 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 6c 74   /* Already halt
98b0: 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20  ed.  Nothing to 
98c0: 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  do. */.    asser
98d0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
98e0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a  E_MAGIC_HALT );.
98f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9900: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9910: 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  .    closeAllCur
9920: 73 6f 72 73 28 70 29 3b 0a 23 65 6e 64 69 66 0a  sors(p);.#endif.
9930: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9940: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  E_OK;.  }.  clos
9950: 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
9960: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
9970: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
9980: 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
9990: 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
99a0: 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
99b0: 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  r started */.  i
99c0: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
99d0: 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
99e0: 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
99f0: 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
9a00: 2f 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  /.    /* Check f
9a10: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
9a20: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2d 20 53  ecial errors - S
9a30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 53  QLITE_NOMEM or S
9a40: 51 4c 49 54 45 5f 49 4f 45 52 52 20 2a 2f 0a 20  QLITE_IOERR */. 
9a50: 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
9a60: 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
9a70: 63 69 61 6c 45 72 72 6f 72 20 3d 20 28 28 6d 72  cialError = ((mr
9a80: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9a90: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
9aa0: 4f 45 52 52 29 3f 31 3a 30 29 3b 0a 20 20 20 20  OERR)?1:0);.    
9ab0: 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
9ac0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  or ){.      /* T
9ad0: 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74  his loop does st
9ae0: 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f 66  atic analysis of
9af0: 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 73 65   the query to se
9b00: 65 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a 20  e which of the. 
9b10: 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
9b20: 67 20 74 68 72 65 65 20 63 61 74 65 67 6f 72 69  g three categori
9b30: 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f  es it falls into
9b40: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
9b50: 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c   **     Read-onl
9b60: 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  y.      **     Q
9b70: 75 65 72 79 20 77 69 74 68 20 73 74 61 74 65 6d  uery with statem
9b80: 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent journal.    
9b90: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
9ba0: 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e 74  ithout statement
9bb0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
9bc0: 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 63 6f  *.      ** We co
9bd0: 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67  uld do something
9be0: 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20 74 68   more elegant th
9bf0: 61 6e 20 74 68 69 73 20 73 74 61 74 69 63 20 61  an this static a
9c00: 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20 20  nalysis (i.e..  
9c10: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
9c20: 20 74 79 70 65 20 6f 66 20 71 75 65 72 79 20 61   type of query a
9c30: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
9c40: 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61 73 65 29  mpliation phase)
9c50: 2c 20 62 75 74 20 0a 20 20 20 20 20 20 2a 2a 20  , but .      ** 
9c60: 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28  handling malloc(
9c70: 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 20  ) or IO failure 
9c80: 69 73 20 61 20 66 61 69 72 6c 79 20 6f 62 73 63  is a fairly obsc
9c90: 75 72 65 20 65 64 67 65 20 63 61 73 65 20 73 6f  ure edge case so
9ca0: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
9cb0: 69 73 20 70 72 6f 62 61 62 6c 79 20 65 61 73 69  is probably easi
9cc0: 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20  er. Todo: Might 
9cd0: 62 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  be an opportunit
9ce0: 79 20 74 6f 20 72 65 64 75 63 65 20 0a 20 20 20  y to reduce .   
9cf0: 20 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20     ** code size 
9d00: 61 20 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f  a very small amo
9d10: 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20  unt though....  
9d20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
9d30: 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 31 3b   isReadOnly = 1;
9d40: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53 74 61  .      int isSta
9d50: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
9d60: 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70 20    assert(p->aOp 
9d70: 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20  || p->nOp==0);. 
9d80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9d90: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20  p->nOp; i++){ . 
9da0: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
9db0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20  ->aOp[i].opcode 
9dc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
9dd0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
9de0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  :.            is
9df0: 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  ReadOnly = 0;.  
9e00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9e10: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
9e20: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20  OP_Statement:.  
9e30: 20 20 20 20 20 20 20 20 20 20 69 73 53 74 61 74            isStat
9e40: 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  ement = 1;.     
9e50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9e60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9e70: 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
9e80: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
9e90: 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20  d-only, we need 
9ea0: 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  do no rollback a
9eb0: 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65  t all. Otherwise
9ec0: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  ,.      ** proce
9ed0: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
9ee0: 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
9ef0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9f00: 20 21 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a   !isReadOnly ){.
9f10: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
9f20: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9f30: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
9f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
9f50: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9f60: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
9f70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9f80: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
9f90: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
9fa0: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
9fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
9fc0: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
9fd0: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
9fe0: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
9ff0: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
a000: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
a010: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
a020: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
a030: 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72  qlite3AbortOther
a040: 41 63 74 69 76 65 56 64 62 65 73 28 64 62 2c 20  ActiveVdbes(db, 
a050: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  p);.          sq
a060: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
a070: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
a080: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
a090: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
a0a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
a0b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
a0c0: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
a0d0: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
a0e0: 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
a0f0: 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20   vdbe, then.    
a100: 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  ** we do either 
a110: 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
a120: 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
a130: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
a140: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
a150: 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
a160: 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
a170: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
a180: 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
a190: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
a1a0: 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20  s occured. .    
a1b0: 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  */.    if( db->a
a1c0: 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
a1d0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d  >activeVdbeCnt==
a1e0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
a1f0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a200: 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
a210: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
a220: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
a230: 29 7b 0a 09 2f 2a 20 54 68 65 20 61 75 74 6f 2d  ){../* The auto-
a240: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
a250: 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62  rue, and the vdb
a260: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20  e program was . 
a270: 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73         ** succes
a280: 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27  sful or hit an '
a290: 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
a2a0: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
a2b0: 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
a2c0: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
a2d0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a2e0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64       int rc = vd
a2f0: 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  beCommit(db);.  
a300: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a310: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
a320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
a330: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
a340: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
a350: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a360: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
a370: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
a380: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
a390: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
a3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
a3b0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
a3c0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
a3d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a3f0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a400: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ll(db);.      }.
a410: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78      }else if( !x
a420: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66  Func ){.      if
a430: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a440: 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
a450: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
a460: 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d  .        xFunc =
a470: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
a480: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d  mitStmt;.      }
a490: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
a4a0: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
a4b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75  t ){.        xFu
a4c0: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
a4d0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
a4e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a4f0: 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74      sqlite3Abort
a500: 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73  OtherActiveVdbes
a510: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
a520: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
a530: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
a540: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
a550: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
a560: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
a570: 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  xFunc is not NUL
a580: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e  L, then it is on
a590: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
a5a0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72  eRollbackStmt or
a5b0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
a5c0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20  treeCommitStmt. 
a5d0: 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20  Call it once on 
a5e0: 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66  each backend. If
a5f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a600: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
a610: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
a620: 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  till SQLITE_OK, 
a630: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
a640: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ode to the new. 
a650: 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75     ** error valu
a660: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
a670: 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20  sert(!xFunc ||. 
a680: 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69       xFunc==sqli
a690: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
a6a0: 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e  mt ||.      xFun
a6b0: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52  c==sqlite3BtreeR
a6c0: 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20  ollbackStmt.    
a6d0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
a6e0: 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e  xFunc && i<db->n
a6f0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
a700: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42   int rc;.      B
a710: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
a720: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
a730: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
a740: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28       rc = xFunc(
a750: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
a760: 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d  ( rc && (p->rc==
a770: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
a780: 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
a790: 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20  RAINT) ){.      
a7a0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
a7b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a7c0: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
a7d0: 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
a7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a7f0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
a800: 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
a810: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
a820: 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 73 74  ELETE and the st
a830: 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d  atement was comm
a840: 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  itted, .    ** s
a850: 65 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  et the change co
a860: 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
a870: 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
a880: 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d  CntOn && p->pc>=
a890: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
a8a0: 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d  xFunc || xFunc==
a8b0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
a8c0: 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  itStmt ){.      
a8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
a8e0: 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
a8f0: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
a900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a910: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
a920: 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
a930: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
a940: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
a950: 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61    .    /* Rollba
a960: 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79  ck or commit any
a970: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
a980: 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a  that occurred. *
a990: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21  /.    if( p->rc!
a9a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62  =SQLITE_OK && db
a9b0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
a9c0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
a9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
a9e0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
a9f0: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  (db, 0);.      d
aa00: 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e  b->flags = (db->
aa10: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49  flags | SQLITE_I
aa20: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20  nternChanges);. 
aa30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
aa40: 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
aa50: 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
aa60: 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
aa70: 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
aa80: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
aa90: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63  =0 ){.    db->ac
aaa0: 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  tiveVdbeCnt--;. 
aab0: 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
aac0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
aad0: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
aae0: 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65  beCnt(db);..  re
aaf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ab00: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  }../*.** Each VD
ab10: 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
ab20: 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
ab30: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
ab40: 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
ab50: 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
ab60: 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
ab70: 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
ab80: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
ab90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
aba0: 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
abb0: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
abc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
abd0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
abe0: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
abf0: 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
ac00: 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
ac10: 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
ac20: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
ac30: 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
ac40: 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
ac50: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
ac60: 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
ac70: 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
ac80: 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
ac90: 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
aca0: 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
acb0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
acc0: 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
acd0: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
ace0: 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
acf0: 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
ad00: 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
ad10: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
ad20: 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
ad30: 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
ad40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
ad50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
ad60: 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
ad70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
ad80: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
ad90: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
ada0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
adb0: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
adc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70    sqlite3Error(p
add0: 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49 53  ->db, SQLITE_MIS
ade0: 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  USE, 0);.    ret
adf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ae00: 45 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 2d  E;.  }.  db = p-
ae10: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
ae20: 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
ae30: 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
ae40: 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
ae50: 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
ae60: 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
ae70: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
ae80: 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
ae90: 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
aea0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
aeb0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
aec0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  ;.  sqlite3VdbeH
aed0: 61 6c 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  alt(p);.  sqlite
aee0: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
aef0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
af00: 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
af10: 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
af20: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
af30: 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
af40: 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
af50: 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
af60: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
af70: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
af80: 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
af90: 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
afa0: 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
afb0: 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
afc0: 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
afd0: 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
afe0: 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
aff0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
b000: 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
b010: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
b020: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
b030: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
b040: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
b050: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
b060: 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
b070: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
b080: 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
b090: 65 33 46 72 65 65 58 29 3b 0a 20 20 20 20 20 20  e3FreeX);.      
b0a0: 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d  db->errCode = p-
b0b0: 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  >rc;.      p->zE
b0c0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
b0d0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
b0e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
b0f0: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
b100: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
b110: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b120: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
b130: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
b140: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
b150: 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
b160: 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
b170: 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
b180: 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
b190: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
b1a0: 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
b1b0: 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
b1c0: 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
b1d0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
b1e0: 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
b1f0: 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
b200: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
b210: 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
b220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
b230: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
b240: 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rc, 0);.  }..  /
b250: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
b260: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
b270: 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
b280: 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
b290: 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
b2a0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
b2b0: 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
b2c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
b2d0: 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b  pTos<&p->aStack[
b2e0: 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d  p->pc<0?0:p->pc]
b2f0: 20 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29   || !p->aStack )
b300: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
b310: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
b320: 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
b330: 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
b340: 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
b350: 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
b360: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
b370: 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
b380: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
b390: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
b3a0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
b3b0: 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
b3c0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
b3d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b3e0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
b3f0: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
b400: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
b410: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
b420: 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
b430: 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
b440: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
b450: 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
b460: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
b470: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
b480: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
b490: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
b4a0: 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
b4b0: 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
b4c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b4d0: 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
b4e0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
b4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
b500: 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
b510: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
b520: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
b530: 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62  IC_INIT;.  p->ab
b540: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  orted = 0;.  if(
b550: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 53   p->rc==SQLITE_S
b560: 43 48 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c  CHEMA ){.    sql
b570: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
b580: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
b590: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
b5a0: 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
b5b0: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
b5c0: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
b5d0: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
b5e0: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
b5f0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
b600: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
b610: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
b620: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
b630: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
b640: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
b650: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
b660: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
b670: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b680: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
b690: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
b6a0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
b6b0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
b6c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b6d0: 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
b6e0: 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
b6f0: 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
b700: 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  =rc );.  }else i
b710: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
b720: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
b730: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b740: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
b750: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
b760: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
b770: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
b780: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
b790: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
b7a0: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
b7b0: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
b7c0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
b7d0: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
b7e0: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
b7f0: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
b800: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
b810: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
b820: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
b830: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
b840: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
b850: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
b860: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b870: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
b880: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
b890: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
b8a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
b8b0: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
b8c0: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
b8d0: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
b8e0: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
b8f0: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
b900: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
b910: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
b920: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
b930: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
b940: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
b950: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
b960: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
b970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
b980: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
b990: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b9a0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
b9b0: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
b9c0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
b9d0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
b9e0: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
b9f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61  ) return;.  Clea
ba00: 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  nup(p);.  if( p-
ba10: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
ba20: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
ba30: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
ba40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
ba50: 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ->db->pVdbe==p )
ba60: 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64  ;.    p->db->pVd
ba70: 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
ba80: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
ba90: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
baa0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
bab0: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
bac0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72  ->aOp ){.    for
bad0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
bae0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a  i++){.      Op *
baf0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
bb00: 3b 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 70  ;.      freeP3(p
bb10: 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d  Op->p3type, pOp-
bb20: 3e 70 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p3);.    }.    
bb30: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4f  sqliteFree(p->aO
bb40: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  p);.  }.  releas
bb50: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
bb60: 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73  r, p->nVar);.  s
bb70: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61  qliteFree(p->aLa
bb80: 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  bel);.  sqliteFr
bb90: 65 65 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20  ee(p->aStack);. 
bba0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
bbb0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
bbc0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
bbd0: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
bbe0: 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  Free(p->aColName
bbf0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
bc00: 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d  p->zSql);.  p->m
bc10: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
bc20: 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65  C_DEAD;.  sqlite
bc30: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
bc40: 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
bc50: 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
bc60: 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
bc70: 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
bc80: 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
bc90: 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ow.  Return an e
bca0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e  rror code.  If n
bcb0: 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64  o MoveTo is pend
bcc0: 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  ing, this.** rou
bcd0: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e  tine does nothin
bce0: 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  g and returns SQ
bcf0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
bd00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
bd10: 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a  rMoveto(Cursor *
bd20: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
bd30: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
bd40: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
bd50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
bd60: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
bd70: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
bd80: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
bd90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
bda0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  Table );.    if(
bdb0: 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20   p->isTable ){. 
bdc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bdd0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e  3BtreeMoveto(p->
bde0: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
bdf0: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 26 72 65  ovetoTarget, &re
be00: 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
be10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
be20: 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e  3BtreeMoveto(p->
be30: 70 43 75 72 73 6f 72 2c 28 63 68 61 72 2a 29 26  pCursor,(char*)&
be40: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
be50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
be70: 69 7a 65 6f 66 28 69 36 34 29 2c 26 72 65 73 29  izeof(i64),&res)
be80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
be90: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
bea0: 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79      *p->pIncrKey
beb0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73   = 0;.    p->las
bec0: 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e  tRowid = keyToIn
bed0: 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  t(p->movetoTarge
bee0: 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  t);.    p->rowid
bef0: 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30  IsValid = res==0
bf00: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
bf10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
bf20: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
bf30: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
bf40: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
bf50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
bf60: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
bf70: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
bf80: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
bf90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
bfa0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
bfb0: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
bfc0: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
bfd0: 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ALE;.  }.  retur
bfe0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bff0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
c000: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
c010: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
c020: 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
c030: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c040: 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
c050: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52  lite3VdbeSerialR
c060: 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ead().** sqlite3
c070: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
c080: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
c090: 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a  rialWrite().**.*
c0a0: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
c0b0: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
c0c0: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
c0d0: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
c0e0: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
c0f0: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
c100: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
c110: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
c120: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
c130: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
c140: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
c150: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
c160: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
c170: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
c180: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
c190: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
c1a0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
c1b0: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
c1c0: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
c1d0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
c1e0: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
c1f0: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
c200: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
c210: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
c220: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
c230: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
c240: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
c250: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
c260: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
c270: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
c280: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
c290: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
c2a0: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
c2b0: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
c2c0: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
c2d0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
c2e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
c2f0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
c300: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
c310: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
c320: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
c330: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
c340: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
c350: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
c360: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
c370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
c380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
c390: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
c3b0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
c3c0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
c3e0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
c3f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
c400: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
c410: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
c420: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
c430: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
c460: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
c470: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
c480: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
c490: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
c4a0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
c4d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
c4e0: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
c500: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
c510: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
c520: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
c530: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
c540: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
c550: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
c570: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
c580: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
c590: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
c5b0: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
c5c0: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
c5d0: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
c600: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
c610: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
c620: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
c630: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
c640: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
c650: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
c660: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
c670: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
c680: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
c690: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
c6a0: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
c6b0: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
c6c0: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
c6d0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
c6e0: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
c6f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
c700: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
c710: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
c720: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
c730: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
c740: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
c750: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
c760: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
c770: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
c780: 73 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  s;..  if( flags&
c790: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
c7a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c7b0: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
c7c0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
c7d0: 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
c7e0: 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
c7f0: 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
c800: 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
c810: 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
c820: 30 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31 29  0001000)<<32)-1)
c830: 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
c840: 6d 2d 3e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  m->i;.    u64 u;
c850: 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
c860: 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
c870: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
c880: 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20  urn 8+i;.    }. 
c890: 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20     u = i<0 ? -i 
c8a0: 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  : i;.    if( u<=
c8b0: 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
c8c0: 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
c8d0: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
c8e0: 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
c8f0: 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
c900: 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
c910: 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
c920: 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
c930: 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
c940: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
c950: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
c960: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
c970: 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 7;.  }.  if(
c980: 20 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29   flags&MEM_Str )
c990: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4d  {.    int n = pM
c9a0: 65 6d 2d 3e 6e 3b 0a 20 20 20 20 61 73 73 65 72  em->n;.    asser
c9b0: 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 72  t( n>=0 );.    r
c9c0: 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
c9d0: 33 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  3);.  }.  if( fl
c9e0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
c9f0: 20 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d      return (pMem
ca00: 2d 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d  ->n*2 + 12);.  }
ca10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ca20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ca30: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
ca40: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
ca50: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
ca60: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
ca70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
ca80: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
ca90: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
caa0: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
cab0: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
cac0: 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
cad0: 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
cae0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
caf0: 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
cb00: 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
cb10: 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
cb20: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
cb30: 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
cb40: 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
cb50: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
cb60: 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
cb70: 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
cb80: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
cb90: 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
cba0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
cbb0: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
cbc0: 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
cbd0: 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
cbe0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
cbf0: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
cc00: 6e 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  n..*/ .int sqlit
cc10: 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
cc20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
cc30: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
cc40: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
cc50: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
cc60: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
cc70: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
cc80: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
cc90: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
cca0: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
ccb0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
ccc0: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
ccd0: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
cce0: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
ccf0: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
cd00: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
cd10: 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70     v = *(u64*)&p
cd20: 4d 65 6d 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73  Mem->r;.    }els
cd30: 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75  e{.      v = *(u
cd40: 36 34 2a 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20  64*)&pMem->i;.  
cd50: 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
cd60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
cd70: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
cd80: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69  l_type);.    whi
cd90: 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
cda0: 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46   buf[i] = (v&0xF
cdb0: 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
cdc0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
cdd0: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
cde0: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
cdf0: 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
ce00: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
ce10: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56    len = sqlite3V
ce20: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
ce30: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
ce40: 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
ce50: 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
ce60: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
ce70: 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
ce80: 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
ce90: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
cea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
ceb0: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
cec0: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
ced0: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
cee0: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
cef0: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
cf00: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
cf10: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
cf20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
cf30: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
cf40: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
cf50: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
cf60: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
cf70: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
cf80: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
cf90: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
cfa0: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
cfb0: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
cfc0: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
cfd0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
d000: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
d010: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
d020: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
d030: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
d040: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
d050: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
d060: 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
d070: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
d080: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
d090: 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
d0a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
d0b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
d0c0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
d0d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d0e0: 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
d0f0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
d100: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
d110: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
d120: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
d130: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
d140: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
d150: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
d160: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
d170: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
d180: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
d190: 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  ->i = (((signed 
d1a0: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
d1b0: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
d1c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
d1d0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
d1e0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
d1f0: 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
d200: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
d210: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
d220: 65 6d 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e 65  em->i = (((signe
d230: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
d240: 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
d250: 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
d260: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
d270: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
d280: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
d290: 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
d2a0: 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
d2b0: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
d2c0: 4d 65 6d 2d 3e 69 20 3d 20 28 62 75 66 5b 30 5d  Mem->i = (buf[0]
d2d0: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
d2e0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
d2f0: 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
d300: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
d310: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
d320: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
d330: 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
d340: 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
d350: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
d360: 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
d370: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
d380: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
d390: 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
d3a0: 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
d3b0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
d3c0: 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
d3d0: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
d3e0: 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
d3f0: 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  ->i = *(i64*)&x;
d400: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
d410: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
d420: 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
d430: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
d440: 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
d450: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
d460: 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
d470: 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
d480: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  nt */.      u64 
d490: 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a  x;.      u32 y;.
d4a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
d4b0: 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
d4c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
d4d0: 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
d4e0: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
d4f0: 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
d500: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
d510: 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
d520: 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
d530: 6f 72 64 65 72 2e 20 20 54 68 65 20 62 79 74 65  order.  The byte
d540: 20 6f 72 64 65 72 20 64 69 66 66 65 72 73 20 6f   order differs o
d550: 6e 20 73 6f 6d 65 20 28 62 72 6f 6b 65 6e 29 20  n some (broken) 
d560: 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 0a 20  architectures.. 
d570: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
d580: 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
d590: 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
d5a0: 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
d5b0: 20 61 73 73 65 72 74 28 20 31 2e 30 3d 3d 2a 28   assert( 1.0==*(
d5c0: 64 6f 75 62 6c 65 2a 29 26 74 31 20 29 3b 0a 23  double*)&t1 );.#
d5d0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
d5e0: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
d5f0: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
d600: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
d610: 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
d620: 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
d630: 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
d640: 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
d650: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
d660: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
d670: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
d680: 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
d690: 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26  em->i = *(i64*)&
d6a0: 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
d6b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
d6c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d6d0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d         pMem->r =
d6e0: 20 2a 28 64 6f 75 62 6c 65 2a 29 26 78 3b 0a 20   *(double*)&x;. 
d6f0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
d700: 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  gs = MEM_Real;. 
d710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
d720: 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
d730: 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
d740: 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
d750: 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
d760: 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
d770: 20 70 4d 65 6d 2d 3e 69 20 3d 20 73 65 72 69 61   pMem->i = seria
d780: 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
d790: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
d7a0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
d7b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
d7c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
d7d0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72    int len = (ser
d7e0: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
d7f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
d800: 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
d810: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
d820: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
d830: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
d840: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
d850: 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
d860: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
d870: 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
d880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d890: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
d8a0: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
d8b0: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
d8c0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
d8d0: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
d8e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d8f0: 2a 2a 20 54 68 65 20 68 65 61 64 65 72 20 6f 66  ** The header of
d900: 20 61 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73   a record consis
d910: 74 73 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65  ts of a sequence
d920: 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68   variable-length
d930: 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68   integers..** Th
d940: 65 73 65 20 69 6e 74 65 67 65 72 73 20 61 72 65  ese integers are
d950: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73   almost always s
d960: 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63  mall and are enc
d970: 6f 64 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  oded as a single
d980: 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f   byte..** The fo
d990: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61  llowing macro ta
d9a0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 74 68  kes advantage th
d9b0: 69 73 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69  is fact to provi
d9c0: 64 65 20 61 20 66 61 73 74 20 64 65 63 6f 64 65  de a fast decode
d9d0: 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67  .** of the integ
d9e0: 65 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20  ers in a record 
d9f0: 68 65 61 64 65 72 2e 20 20 49 74 20 69 73 20 66  header.  It is f
da00: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
da10: 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65  mmon case.** whe
da20: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  re the integer i
da30: 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  s a single byte.
da40: 20 20 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65    It is a little
da50: 20 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65   slower when the
da60: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74  .** integer is t
da70: 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73  wo or more bytes
da80: 2e 20 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69  .  But overall i
da90: 74 20 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  t is faster..**.
daa0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
dab0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
dac0: 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a   equivalent:.**.
dad0: 2a 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  **     x = sqlit
dae0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 20 41  e3GetVarint32( A
daf0: 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  , &B );.**.**   
db00: 20 20 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28    x = GetVarint(
db10: 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23   A, B );.**.*/.#
db20: 64 65 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74  define GetVarint
db30: 28 41 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41  (A,B)  ((B = *(A
db40: 29 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73  ))<=0x7f ? 1 : s
db50: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
db60: 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a  2(A, &B))../*.**
db70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
db80: 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
db90: 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
dba0: 64 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63  dex records spec
dbb0: 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b  ified by .** {nK
dbc0: 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
dbd0: 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20  {nKey2, pKey2}, 
dbe0: 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61  returning a nega
dbf0: 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
dc00: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
dc10: 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  r if {nKey1, pKe
dc20: 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e  y1} is less than
dc30: 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
dc40: 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b  * greater than {
dc50: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20  nKey2, pKey2}.  
dc60: 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65  Both Key1 and Ke
dc70: 79 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20  y2 must be byte 
dc80: 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f  strings.** compo
dc90: 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  sed by the OP_Ma
dca0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
dcb0: 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a  of the VDBE..*/.
dcc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
dcd0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
dce0: 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a  void *userData,.
dcf0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
dd00: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
dd10: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
dd20: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
dd30: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ){.  KeyInfo *pK
dd40: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66  eyInfo = (KeyInf
dd50: 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75  o*)userData;.  u
dd60: 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20  32 d1, d2;      
dd70: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
dd80: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
dd90: 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
dda0: 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64  /.  u32 idx1, id
ddb0: 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  x2;      /* Offs
ddc0: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
ddd0: 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
dde0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
ddf0: 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20  zHdr1, szHdr2;  
de00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
de10: 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
de20: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
de30: 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
de40: 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
de50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
de60: 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
de70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
de80: 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Key1;.  const un
de90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
dea0: 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y2 = (const unsi
deb0: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
dec0: 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  2;..  Mem mem1;.
ded0: 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65    Mem mem2;.  me
dee0: 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
def0: 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65  o->enc;.  mem2.e
df00: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
df10: 6e 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20  nc;.  .  idx1 = 
df20: 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c  GetVarint(aKey1,
df30: 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
df40: 20 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20   szHdr1;.  idx2 
df50: 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79  = GetVarint(aKey
df60: 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32  2, szHdr2);.  d2
df70: 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69   = szHdr2;.  nFi
df80: 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
df90: 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
dfa0: 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
dfb0: 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20  idx2<szHdr2 ){. 
dfc0: 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
dfd0: 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72  pe1;.    u32 ser
dfe0: 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20  ial_type2;..    
dff0: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
e000: 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
e010: 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
e020: 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
e030: 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72    idx1 += GetVar
e040: 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  int( aKey1+idx1,
e050: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
e060: 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
e070: 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
e080: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
e090: 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
e0a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32   break;.    idx2
e0b0: 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61   += GetVarint( a
e0c0: 4b 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61  Key2+idx2, seria
e0d0: 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69  l_type2 );.    i
e0e0: 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20  f( d2>=nKey2 && 
e0f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e100: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
e110: 74 79 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b  type2)>0 ) break
e120: 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
e130: 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
e140: 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
e150: 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
e160: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
e170: 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
e180: 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
e190: 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73  m1);.    d2 += s
e1a0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e1b0: 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20  Get(&aKey2[d2], 
e1c0: 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d  serial_type2, &m
e1d0: 65 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em2);..    /* Do
e1e0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
e1f0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
e200: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
e210: 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20  e(&mem1, &mem2, 
e220: 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
e230: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
e240: 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31  0);.    if( mem1
e250: 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  .flags & MEM_Dyn
e260: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
e270: 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b  mRelease(&mem1);
e280: 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c  .    if( mem2.fl
e290: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20  ags & MEM_Dyn ) 
e2a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
e2b0: 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20  lease(&mem2);.  
e2c0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
e2d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e2e0: 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  }.    i++;.  }..
e2f0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
e300: 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
e310: 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20  fields, but all 
e320: 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
e330: 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a   that point.  **
e340: 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20   were equal. If 
e350: 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67  the incrKey flag
e360: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
e370: 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73  he second key is
e380: 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73  .  ** treated as
e390: 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20   larger..  */.  
e3a0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
e3b0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69   if( pKeyInfo->i
e3c0: 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ncrKey ){.      
e3d0: 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  rc = -1;.    }el
e3e0: 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20  se if( d1<nKey1 
e3f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
e400: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
e410: 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20  2<nKey2 ){.     
e420: 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a   rc = -1;.    }.
e430: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
e440: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
e450: 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e   && i<pKeyInfo->
e460: 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20  nField.         
e470: 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66        && pKeyInf
e480: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
e490: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63   ){.    rc = -rc
e4a0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
e4b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
e4c0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
e4d0: 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70  index entry comp
e4e0: 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  osed using the O
e4f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
e500: 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  ode..** The last
e510: 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72   entry in this r
e520: 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
e530: 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63  an integer (spec
e540: 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69  ifically.** an i
e550: 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20  nteger rowid).  
e560: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
e570: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
e580: 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74  of bytes in.** t
e590: 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  hat integer..*/.
e5a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
e5b0: 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74  dxRowidLen(const
e5c0: 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
e5d0: 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
e5e0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
e5f0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
e600: 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
e610: 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
e620: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73  he rowid */..  s
e630: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
e640: 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b  2(aKey, &szHdr);
e650: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
e660: 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64  int32(&aKey[szHd
e670: 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
e680: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
e690: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e6a0: 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
e6b0: 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  .}.  ../*.** pCu
e6c0: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
e6d0: 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
e6e0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
e6f0: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
e700: 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
e710: 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
e720: 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
e730: 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
e740: 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
e750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
e760: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
e770: 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
e780: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
e790: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
e7a0: 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75  dbeIdxRowid(BtCu
e7b0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
e7c0: 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
e7d0: 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72  CellKey;.  int r
e7e0: 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
e7f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e800: 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
e810: 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
e820: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
e830: 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
e840: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
e850: 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
e860: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
e870: 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71   Mem m, v;..  sq
e880: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
e890: 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
e8a0: 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
e8b0: 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey<=0 ){.    ret
e8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e8d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
e8e0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
e8f0: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
e900: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
e910: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
e920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
e930: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47  ;.  }.  sqlite3G
e940: 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
e950: 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  m.z, &szHdr);.  
e960: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
e970: 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
e980: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69  dr-1], &typeRowi
e990: 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d  d);.  lenRowid =
e9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e9b0: 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
e9c0: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
e9d0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
e9e0: 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
e9f0: 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
ea00: 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
ea10: 20 76 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56   v.i;.  sqlite3V
ea20: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
ea30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ea40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ea50: 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
ea60: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
ea70: 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
ea80: 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
ea90: 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
eaa0: 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
eab0: 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
eac0: 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
ead0: 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
eae0: 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
eaf0: 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
eb00: 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
eb10: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
eb20: 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
eb30: 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
eb40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
eb50: 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
eb60: 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72  Key is either cr
eb70: 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
eb80: 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
eb90: 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
eba0: 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
ebb0: 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
ebc0: 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
ebd0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
ebe0: 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
ebf0: 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a  gnored as well..
ec00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ec10: 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
ec20: 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  .  Cursor *pC,  
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec40: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
ec50: 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
ec60: 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  */.  int nKey, c
ec70: 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20  onst u8 *pKey,  
ec80: 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63   /* The key to c
ec90: 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
eca0: 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
ecb0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
ecc0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
ecd0: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
ece0: 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
ecf0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
ed00: 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
ed10: 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e  C->pCursor;.  in
ed20: 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65  t lenRowid;.  Me
ed30: 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  m m;..  sqlite3B
ed40: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
ed50: 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
ed60: 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
ed70: 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
ed80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ed90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
eda0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
edb0: 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
edc0: 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  ursor, 0, nCellK
edd0: 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
ede0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
edf0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e  rn rc;.  }.  len
ee00: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
ee10: 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 28  dbeIdxRowidLen((
ee20: 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73  u8*)m.z);.  *res
ee30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
ee40: 63 6f 72 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e  cordCompare(pC->
ee50: 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65  pKeyInfo, m.n-le
ee60: 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65  nRowid, m.z, nKe
ee70: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69  y, pKey);.  sqli
ee80: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
ee90: 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
eea0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
eeb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eec0: 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
eed0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
eee0: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
eef0: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
ef00: 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
ef10: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
ef20: 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
ef30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ef40: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
ef50: 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
ef60: 7b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  {.  db->nChange 
ef70: 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
ef80: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
ef90: 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
efa0: 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
efb0: 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
efc0: 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
efd0: 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
efe0: 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
eff0: 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
f000: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
f010: 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
f020: 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
f030: 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
f040: 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
f050: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
f060: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f070: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
f080: 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
f090: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
f0a0: 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
f0b0: 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
f0c0: 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
f0d0: 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
f0e0: 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
f0f0: 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
f100: 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
f110: 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
f120: 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
f130: 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
f140: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
f150: 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
f160: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
f170: 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
f180: 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
f190: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
f1a0: 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
f1b0: 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
f1c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
f1d0: 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
f1e0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
f1f0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
f200: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
f210: 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
f220: 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
f230: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
f240: 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
f250: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
f260: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
f270: 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
f280: 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
f290: 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
f2a0: 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
f2b0: 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
f2c0: 3e 64 62 3b 0a 7d 0a                             >db;.}.