/ Hex Artifact Content
Login

Artifact a77bf70260ac1802dccf1076088700cc51d81fa3:


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 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
1410: 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  iteReallocOrFree
1420: 28 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20  (p->aLabel,.    
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
1460: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1470: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1480: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1490: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
14a0: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
14b0: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
14c0: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
14d0: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
14e0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
14f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
1500: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
1510: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
1520: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
1530: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1540: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
1550: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
1560: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
1570: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1580: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1590: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
15a0: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
15b0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
15c0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
15d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30  ;.  assert( j>=0
15e0: 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20   && j<p->nLabel 
15f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
1600: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1610: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
1620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1630: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
1640: 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69 73 20   opcode 'op' is 
1650: 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 20 74  guarenteed not t
1660: 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61 6c 75  o push more valu
1670: 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56  es.** onto the V
1680: 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e 20 69  DBE stack than i
1690: 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73  t pops off..*/.s
16a0: 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f 64 65  tatic int opcode
16b0: 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20  NoPush(u8 op){. 
16c0: 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50 55 53   /* The 10 NOPUS
16d0: 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e  H_MASK_n constan
16e0: 74 73 20 61 72 65 20 64 65 66 69 6e 65 64 20 69  ts are defined i
16f0: 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 61  n the automatica
1700: 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74  lly.  ** generat
1710: 65 64 20 68 65 61 64 65 72 20 66 69 6c 65 20 6f  ed header file o
1720: 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68 20 69  pcodes.h. Each i
1730: 73 20 61 20 31 36 2d 62 69 74 20 62 69 74 6d 61  s a 16-bit bitma
1740: 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74  sk, one.  ** bit
1750: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1760: 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 6d  o each opcode im
1770: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  plemented by the
1780: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61   virtual.  ** ma
1790: 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e  chine in vdbe.c.
17a0: 20 54 68 65 20 62 69 74 20 69 73 20 74 72 75 65   The bit is true
17b0: 20 69 66 20 74 68 65 20 77 6f 72 64 20 22 6e 6f   if the word "no
17c0: 2d 70 75 73 68 22 20 61 70 70 65 61 72 73 0a 20  -push" appears. 
17d0: 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74   ** in a comment
17e0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c 69 6e   on the same lin
17f0: 65 20 61 73 20 74 68 65 20 22 63 61 73 65 20 4f  e as the "case O
1800: 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a  P_XXX:" in .  **
1810: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
1820: 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20  () in vdbe.c..  
1830: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 62  **.  ** If the b
1840: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  it is true, then
1850: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1860: 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67 75 61  ng opcode is gua
1870: 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a  renteed not.  **
1880: 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73 74 61   to grow the sta
1890: 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20 65 78  ck when it is ex
18a0: 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77 69 73  ecuted. Otherwis
18b0: 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77 20 74  e, it may grow t
18c0: 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 62 79  he.  ** stack by
18d0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74   at most one ent
18e0: 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f  ry..  **.  ** NO
18f0: 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72  PUSH_MASK_0 corr
1900: 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64  esponds to opcod
1910: 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55  es 0 to 15. NOPU
1920: 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69  SH_MASK_1 contai
1930: 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20  ns.  ** one bit 
1940: 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36 20 74  for opcodes 16 t
1950: 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e  o 31, and so on.
1960: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69  .  **.  ** 16-bi
1970: 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61 74 68  t bitmasks (rath
1980: 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74 29 20  er than 32-bit) 
1990: 61 72 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  are specified in
19a0: 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a   opcodes.h .  **
19b0: 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c   because the fil
19c0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  e is generated b
19d0: 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d  y an awk program
19e0: 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65  . Awk manipulate
19f0: 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65  s.  ** all numbe
1a00: 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70  rs as floating-p
1a10: 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f 6e 27  oint and we don'
1a20: 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b 20 61  t want to risk a
1a30: 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65   rounding.  ** e
1a40: 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20  rror if someone 
1a50: 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e 20 61  builds with an a
1a60: 77 6b 20 74 68 61 74 20 75 73 65 73 20 28 66 6f  wk that uses (fo
1a70: 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d 62 69  r example) 32-bi
1a80: 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f  t .  ** IEEE flo
1a90: 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61  ats..  */ .  sta
1aa0: 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20 6d 61  tic const u32 ma
1ab0: 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e  sks[5] = {.    N
1ac0: 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28  OPUSH_MASK_0 + (
1ad0: 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53  ((unsigned)NOPUS
1ae0: 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29 2c 0a  H_MASK_1)<<16),.
1af0: 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f      NOPUSH_MASK_
1b00: 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29  2 + (((unsigned)
1b10: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29 3c 3c  NOPUSH_MASK_3)<<
1b20: 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f  16),.    NOPUSH_
1b30: 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e 73 69  MASK_4 + (((unsi
1b40: 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b  gned)NOPUSH_MASK
1b50: 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f  _5)<<16),.    NO
1b60: 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 28  PUSH_MASK_6 + ((
1b70: 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48  (unsigned)NOPUSH
1b80: 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a 20  _MASK_7)<<16),. 
1b90: 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38     NOPUSH_MASK_8
1ba0: 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e   + (((unsigned)N
1bb0: 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c 31  OPUSH_MASK_9)<<1
1bc0: 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74  6).  };.  assert
1bd0: 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20 20 72  ( op<32*5 );.  r
1be0: 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e  eturn (masks[op>
1bf0: 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26 30 78  >5] & (1<<(op&0x
1c00: 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  1F)));.}..#ifnde
1c10: 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1c20: 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 4e 6f  ite3VdbeOpcodeNo
1c30: 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 72  Push(u8 op){.  r
1c40: 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f 50 75  eturn opcodeNoPu
1c50: 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  sh(op);.}.#endif
1c60: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72  ../*.** Loop thr
1c70: 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d  ough the program
1c80: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20   looking for P2 
1c90: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
1ca0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45 61 63  negative..** Eac
1cb0: 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20  h such value is 
1cc0: 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76  a label.  Resolv
1cd0: 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79 20 73  e the label by s
1ce0: 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a 2a 2a  etting the P2.**
1cf0: 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f   value to its co
1d00: 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76  rrect non-zero v
1d10: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
1d20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d30: 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c  ed once after al
1d40: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
1d50: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a  een inserted..**
1d60: 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d  .** Variable *pM
1d70: 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65  axFuncArgs is se
1d80: 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  t to the maximum
1d90: 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32   value of any P2
1da0: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
1db0: 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c   an OP_Function,
1dc0: 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f   OP_AggStep or O
1dd0: 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65  P_VFilter opcode
1de0: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
1df0: 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  y .** sqlite3Vdb
1e00: 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20  eMakeReady() to 
1e10: 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70  size the Vdbe.ap
1e20: 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a  Arg[] array..**.
1e30: 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 2a  ** The integer *
1e40: 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73 65 74  pMaxStack is set
1e50: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1e60: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 20 73  number of vdbe s
1e70: 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20  tack.** entries 
1e80: 74 68 61 74 20 73 74 61 74 69 63 20 61 6e 61 6c  that static anal
1e90: 79 73 69 73 20 72 65 76 65 61 6c 73 20 74 68 69  ysis reveals thi
1ea0: 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68 74 20  s program might 
1eb0: 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  need..**.** This
1ec0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
1ed0: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
1ee0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20   optimization:  
1ef0: 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20  It scans for.** 
1f00: 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Halt instruction
1f10: 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51 4c 49  s where P1==SQLI
1f20: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6f 72  TE_CONSTRAINT or
1f30: 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f 72   P2==OE_Abort or
1f40: 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73 65 72   for.** IdxInser
1f50: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77  t instructions w
1f60: 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49 66 20  here P2!=0.  If 
1f70: 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74  no such instruct
1f80: 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ion is.** found,
1f90: 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74   then every Stat
1fa0: 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  ement instructio
1fb0: 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  n is changed to 
1fc0: 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20 74  a Noop.  In.** t
1fd0: 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
1fe0: 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73  d creating the s
1ff0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
2000: 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61 72   file unnecessar
2010: 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ily..*/.static v
2020: 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  oid resolveP2Val
2030: 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ues(Vdbe *p, int
2040: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2c 20   *pMaxFuncArgs, 
2050: 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b  int *pMaxStack){
2060: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2070: 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20 20  nMaxArgs = 0;.  
2080: 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20  int nMaxStack = 
2090: 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f  p->nOp;.  Op *pO
20a0: 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c  p;.  int *aLabel
20b0: 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20   = p->aLabel;.  
20c0: 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d 65 6e  int doesStatemen
20d0: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tRollback = 0;. 
20e0: 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d 65 6e   int hasStatemen
20f0: 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f  tBegin = 0;.  fo
2100: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2110: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2120: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2130: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2140: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69  ->opcode;..    i
2150: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75  f( opcode==OP_Fu
2160: 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65  nction || opcode
2170: 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a 23 69  ==OP_AggStep .#i
2180: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2190: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
21a0: 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65         || opcode
21b0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23 65 6e  ==OP_VUpdate.#en
21c0: 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
21d0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
21e0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
21f0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2200: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2210: 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20  ==OP_Halt ){.   
2220: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d     if( pOp->p1==
2230: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2240: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
2250: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
2260: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
2270: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
2280: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2290: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  f( opcode==OP_St
22a0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
22b0: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
22c0: 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  in = 1;.    }els
22d0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
22e0: 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  _VFilter ){.    
22f0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61    int n;.      a
2300: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
2310: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
2320: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e  assert( pOp[-2].
2330: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
2340: 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  er );.      n = 
2350: 70 4f 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-2].p1;.    
2360: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
2370: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
2380: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
2390: 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f  pcodeNoPush(opco
23a0: 64 65 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61  de) ){.      nMa
23b0: 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a  xStack--;.    }.
23c0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
23d0: 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
23e0: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
23f0: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
2400: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20   );.    pOp->p2 
2410: 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d  = aLabel[-1-pOp-
2420: 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  >p2];.  }.  sqli
2430: 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c  teFree(p->aLabel
2440: 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  );.  p->aLabel =
2450: 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63   0;..  *pMaxFunc
2460: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
2470: 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20  .  *pMaxStack = 
2480: 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a  nMaxStack;..  /*
2490: 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c   If we never rol
24a0: 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
24b0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
24c0: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  hen statement.  
24d0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
24e0: 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20  are not needed. 
24f0: 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79   So change every
2500: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20   OP_Statement.  
2510: 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61  ** opcode into a
2520: 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73  n OP_Noop.  This
2530: 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f   avoid a call to
2540: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
2550: 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77  clusive().  ** w
2560: 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65  hich can be expe
2570: 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c  nsive on some pl
2580: 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20  atforms..  */.  
2590: 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74  if( hasStatement
25a0: 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74  Begin && !doesSt
25b0: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
25c0: 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70  ){.    for(pOp=p
25d0: 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d  ->aOp, i=p->nOp-
25e0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
25f0: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
2600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2610: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
2620: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
2630: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
2640: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2650: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2660: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2670: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2680: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
2690: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
26b0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
26c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
26d0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
26e0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
26f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2700: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
2710: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
2720: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
2730: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
2740: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2750: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
2760: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
2770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2780: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
2790: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
27a0: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
27b0: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
27c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
27d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
27e0: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
27f0: 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29  p, p->nOp + nOp)
2800: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ;.  if( sqlite3M
2810: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
2820: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2830: 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e   }.  addr = p->n
2840: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20  Op;.  if( nOp>0 
2850: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2860: 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e    VdbeOpList con
2870: 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20  st *pIn = aOp;. 
2880: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2890: 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a  p; i++, pIn++){.
28a0: 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70        int p2 = p
28b0: 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64  In->p2;.      Vd
28c0: 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d  beOp *pOut = &p-
28d0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20  >aOp[i+addr];.  
28e0: 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65      pOut->opcode
28f0: 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a   = pIn->opcode;.
2900: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d        pOut->p1 =
2910: 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20   pIn->p1;.      
2920: 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c 30 20  pOut->p2 = p2<0 
2930: 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  ? addr + ADDR(p2
2940: 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20 70 4f  ) : p2;.      pO
2950: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
2960: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  ;.      pOut->p3
2970: 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70 33 20 3f  type = pIn->p3 ?
2980: 20 50 33 5f 53 54 41 54 49 43 20 3a 20 50 33 5f   P3_STATIC : P3_
2990: 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20  NOTUSED;.#ifdef 
29a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
29b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
29c0: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
29d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29e0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
29f0: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
2a00: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
2a10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2a20: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
2a30: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
2a40: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
2a50: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2a60: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
2a70: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2a80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2a90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2aa0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
2ab0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
2ac0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
2ad0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
2ae0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
2af0: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
2b00: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
2b10: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
2b20: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
2b30: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
2b40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
2b50: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2b60: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2b70: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2b80: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2b90: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2ba0: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2bb0: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
2bc0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
2bd0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d  ->aOp[addr].p1 =
2be0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2bf0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2c00: 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70  lue of the P2 op
2c10: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2c20: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2c30: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2c40: 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20  e is useful for 
2c50: 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64  setting a jump d
2c60: 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  estination..*/.v
2c70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2c80: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
2c90: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2ca0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 76  al){.  assert( v
2cb0: 61 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  al>=0 );.  asser
2cc0: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
2cd0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2ce0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
2cf0: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2d00: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
2d10: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2d20: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
2d30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2d40: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
2d50: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
2d60: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
2d70: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
2d80: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2d90: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
2da0: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
2db0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2dc0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
2dd0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
2de0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
2df0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
2e00: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
2e10: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
2e20: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
2e30: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
2e40: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
2e50: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
2e60: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
2e70: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
2e80: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
2e90: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
2ea0: 46 75 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65 66  Function(FuncDef
2eb0: 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 70   *pDef){.  if( p
2ec0: 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e 66 6c  Def && (pDef->fl
2ed0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
2ee0: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
2ef0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44     sqliteFree(pD
2f00: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ef);.  }.}../*.*
2f10: 2a 20 44 65 6c 65 74 65 20 61 20 50 33 20 76 61  * Delete a P3 va
2f20: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
2f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f40: 20 66 72 65 65 50 33 28 69 6e 74 20 70 33 74 79   freeP3(int p3ty
2f50: 70 65 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20  pe, void *p3){. 
2f60: 20 69 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73   if( p3 ){.    s
2f70: 77 69 74 63 68 28 20 70 33 74 79 70 65 20 29 7b  witch( p3type ){
2f80: 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 44  .      case P3_D
2f90: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
2fa0: 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 0a 20  se P3_KEYINFO:. 
2fb0: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59       case P3_KEY
2fc0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a  INFO_HANDOFF: {.
2fd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
2fe0: 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20  ee(p3);.        
2ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3000: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 50 52       case P3_MPR
3010: 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  INTF: {.        
3020: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29  sqlite3_free(p3)
3030: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3050: 61 73 65 20 50 33 5f 56 44 42 45 46 55 4e 43 3a  ase P3_VDBEFUNC:
3060: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46   {.        VdbeF
3070: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d  unc *pVdbeFunc =
3080: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b   (VdbeFunc *)p3;
3090: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
30a0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70  emeralFunction(p
30b0: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
30c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30d0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
30e0: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
30f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3100: 46 72 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b  Free(pVdbeFunc);
3110: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3130: 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b  se P3_FUNCDEF: {
3140: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3150: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 28  emeralFunction((
3160: 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a 20 20  FuncDef*)p3);.  
3170: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3180: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3190: 50 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P3_MEM: {.      
31a0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
31b0: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
31c0: 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20  e*)p3);.        
31d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
31e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
31f0: 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f  ** Change N opco
3200: 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  des starting at 
3210: 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a  addr to No-ops..
3220: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3230: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
3240: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3250: 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56 64 62  r, int N){.  Vdb
3260: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
3270: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 77 68 69 6c  Op[addr];.  whil
3280: 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 66 72  e( N-- ){.    fr
3290: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
32a0: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  , pOp->p3);.    
32b0: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
32c0: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
32d0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
32e0: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 70  = OP_Noop;.    p
32f0: 4f 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Op++;.  }.}../*.
3300: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3310: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
3320: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
3330: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
3340: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
3350: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
3360: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
3370: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
3380: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
3390: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
33a0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
33b0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
33c0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
33d0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
33e0: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
33f0: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
3400: 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  3 operand is dyn
3410: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
3420: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
3430: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
3440: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
3450: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3460: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  iteMalloc()..** 
3470: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
3480: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
3490: 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e   of zP3 up to an
34a0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
34b0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
34c0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
34d0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
34e0: 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP3..**.** If
34f0: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69   n==P3_KEYINFO i
3500: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33  t means that zP3
3510: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3520: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
3530: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
3540: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
3550: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3560: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
3570: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
3580: 6c 69 74 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20 62  liteMalloc, to b
3590: 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65  e freed when the
35a0: 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a   Vdbe is finaliz
35b0: 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59  ed..** n==P3_KEY
35c0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64  INFO_HANDOFF ind
35d0: 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 33 20  icates that zP3 
35e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49  points to a KeyI
35f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  nfo structure.**
3600: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
3610: 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  y that the calle
3620: 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66  r has obtained f
3630: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3640: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
3650: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
3660: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
3670: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
3680: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
3690: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
36a0: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
36b0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 33 5f 53 54  lues of n (P3_ST
36c0: 41 54 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  ATIC, P3_COLLSEQ
36d0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
36e0: 74 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a  that zP3 points.
36f0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
3700: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
3710: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3720: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
3730: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
3740: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
3750: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
3760: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
3770: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
3780: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
3790: 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P3 on the most
37a0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
37b0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
37c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
37d0: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
37e0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
37f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20  onst char *zP3, 
3800: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
3810: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  p;.  assert( p==
3820: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
3830: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3840: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
3850: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 73 71 6c  p->aOp==0 || sql
3860: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
3870: 28 29 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20  () ){.    if (n 
3880: 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 29 20 7b  != P3_KEYINFO) {
3890: 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 6e 2c  .      freeP3(n,
38a0: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
38b0: 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP3);.    }.  
38c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
38d0: 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64  if( addr<0 || ad
38e0: 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  dr>=p->nOp ){.  
38f0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
3900: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
3910: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
3920: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
3930: 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50  p[addr];.  freeP
3940: 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70  3(pOp->p3type, p
3950: 4f 70 2d 3e 70 33 29 3b 0a 20 20 70 4f 70 2d 3e  Op->p3);.  pOp->
3960: 70 33 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50  p3 = 0;.  if( zP
3970: 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  3==0 ){.    pOp-
3980: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  >p3 = 0;.    pOp
3990: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f  ->p3type = P3_NO
39a0: 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TUSED;.  }else i
39b0: 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f  f( n==P3_KEYINFO
39c0: 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
39d0: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  *pKeyInfo;.    i
39e0: 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65  nt nField, nByte
39f0: 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20  ;..    nField = 
3a00: 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 33 29 2d  ((KeyInfo*)zP3)-
3a10: 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79  >nField;.    nBy
3a20: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65  te = sizeof(*pKe
3a30: 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64  yInfo) + (nField
3a40: 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49  -1)*sizeof(pKeyI
3a50: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b  nfo->aColl[0]) +
3a60: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65   nField;.    pKe
3a70: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
3a80: 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29  llocRaw( nByte )
3a90: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  ;.    pOp->p3 = 
3aa0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 3b  (char*)pKeyInfo;
3ab0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66  .    if( pKeyInf
3ac0: 6f 20 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67  o ){.      unsig
3ad0: 6e 65 64 20 63 68 61 72 20 2a 61 53 6f 72 74 4f  ned char *aSortO
3ae0: 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rder;.      memc
3af0: 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 33  py(pKeyInfo, zP3
3b00: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
3b10: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  aSortOrder = pKe
3b20: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3b30: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f  r;.      if( aSo
3b40: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
3b50: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
3b60: 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67  rtOrder = (unsig
3b70: 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49  ned char*)&pKeyI
3b80: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c  nfo->aColl[nFiel
3b90: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  d];.        memc
3ba0: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
3bb0: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
3bc0: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
3bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d      }.      pOp-
3be0: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59  >p3type = P3_KEY
3bf0: 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  INFO;.    }else{
3c00: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74 79  .      pOp->p3ty
3c10: 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b  pe = P3_NOTUSED;
3c20: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
3c30: 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f  f( n==P3_KEYINFO
3c40: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
3c50: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
3c60: 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP3;.    pOp->p
3c70: 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e  3type = P3_KEYIN
3c80: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FO;.  }else if( 
3c90: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
3ca0: 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b  p3 = (char*)zP3;
3cb0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
3cc0: 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = n;.  }else{. 
3cd0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
3ce0: 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 3b 0a 20  = strlen(zP3);. 
3cf0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71 6c     pOp->p3 = sql
3d00: 69 74 65 53 74 72 4e 44 75 70 28 7a 50 33 2c 20  iteStrNDup(zP3, 
3d10: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  n);.    pOp->p3t
3d20: 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43  ype = P3_DYNAMIC
3d30: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3d40: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
3d50: 70 6c 61 63 65 20 74 68 65 20 50 33 20 66 69 65  place the P3 fie
3d60: 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
3d70: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
3d80: 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 0a 2a  struction with.*
3d90: 2a 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e 0a  * comment text..
3da0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3db0: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
3dc0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
3dd0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
3de0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61   va_list ap;.  a
3df0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
3e00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
3e10: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
3e20: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d 3d 30  [p->nOp-1].p3==0
3e30: 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73   .          || s
3e40: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
3e50: 65 64 28 29 20 29 3b 0a 20 20 76 61 5f 73 74 61  ed() );.  va_sta
3e60: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
3e70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
3e80: 61 6e 67 65 50 33 28 70 2c 20 2d 31 2c 20 73 71  angeP3(p, -1, sq
3e90: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46  lite3VMPrintf(zF
3ea0: 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33 5f 44  ormat, ap), P3_D
3eb0: 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f 65 6e  YNAMIC);.  va_en
3ec0: 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  d(ap);.}.#endif.
3ed0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3ee0: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
3ef0: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f  iven address..*/
3f00: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3f10: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
3f20: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3f30: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3f40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3f50: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  T );.  assert( a
3f60: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
3f70: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75 72  ->nOp );.  retur
3f80: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
3f90: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
3fa0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
3fb0: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
3fc0: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
3fd0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
3fe0: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
3ff0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4000: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
4010: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
4020: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 33 20  escribes the P3 
4030: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
4040: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
4050: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
4060: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
4070: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
4080: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
4090: 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70  isplayP3(Op *pOp
40a0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
40b0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
40c0: 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65 72 74  r *zP3;.  assert
40d0: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
40e0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 33   switch( pOp->p3
40f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
4100: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P3_KEYINFO: {. 
4110: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
4120: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
4130: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66  eyInfo = (KeyInf
4140: 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20  o*)pOp->p3;.    
4150: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
4160: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
4170: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
4180: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c  ;.      i = strl
4190: 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  en(zTemp);.     
41a0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
41b0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
41c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
41d0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
41e0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
41f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
4200: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
4210: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
4220: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
4230: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
4240: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
4250: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
4260: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 29 3b  Temp[i],",...");
4270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
4280: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
4290: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
42a0: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
42b0: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
42c0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
42d0: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
42e0: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
42f0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4300: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
4310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4320: 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69   strcpy(&zTemp[i
4330: 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ], pColl->zName)
4340: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
4350: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
4360: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
4370: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  6 ){.          s
4380: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  trcpy(&zTemp[i],
4390: 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20 20  ",nil");.       
43a0: 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
43b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
43c0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
43d0: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
43e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
43f0: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
4400: 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  ;.      zP3 = zT
4410: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
4420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4430: 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P3_COLLSEQ: {. 
4440: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
4450: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 2a 29  oll = (CollSeq*)
4460: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
4470: 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 63  printf(zTemp, "c
4480: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
4490: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
44a0: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
44b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33     }.    case P3
44d0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
44e0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
44f0: 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70 2d  = (FuncDef*)pOp-
4500: 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >p3;.      sqlit
4510: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4520: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
4530: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
4540: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
4550: 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b      zP3 = zTemp;
4560: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4570: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
4580: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4590: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 33  ABLE.    case P3
45a0: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
45b0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
45c0: 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  ab = (sqlite3_vt
45d0: 61 62 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  ab*)pOp->p3;.   
45e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
45f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4600: 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20  , "vtab:%p:%p", 
4610: 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d  pVtab, pVtab->pM
4620: 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 7a 50  odule);.      zP
4630: 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  3 = zTemp;.     
4640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4650: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
4660: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  : {.      zP3 = 
4670: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 69  pOp->p3;.      i
4680: 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70  f( zP3==0 || pOp
4690: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
46a0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 33  p ){.        zP3
46b0: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20   = "";.      }. 
46c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
46d0: 74 28 20 7a 50 33 21 3d 30 20 29 3b 0a 20 20 72  t( zP3!=0 );.  r
46e0: 65 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65 6e  eturn zP3;.}.#en
46f0: 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  dif...#if define
4700: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
4710: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4720: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
4730: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
4740: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
4750: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4760: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
4770: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4780: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
4790: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
47a0: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
47b0: 2a 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP3;.  char zPt
47c0: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
47d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
47e0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
47f0: 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22 3b  s %4d %4d %s\n";
4800: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
4810: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
4820: 20 20 7a 50 33 20 3d 20 64 69 73 70 6c 61 79 50    zP3 = displayP
4830: 33 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  3(pOp, zPtr, siz
4840: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70  eof(zPtr));.  fp
4850: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
4860: 6d 61 74 31 2c 0a 20 20 20 20 20 20 70 63 2c 20  mat1,.      pc, 
4870: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
4880: 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c  es[pOp->opcode],
4890: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
48a0: 32 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c 75 73  2, zP3);.  fflus
48b0: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
48c0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  f../*.** Release
48d0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d   an array of N M
48e0: 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73  em elements.*/.s
48f0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
4900: 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  seMemArray(Mem *
4910: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  p, int N){.  if(
4920: 20 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28   p ){.    while(
4930: 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20   N-->0 ){.      
4940: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
4950: 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20  lease(p++);.    
4960: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
4970: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
4980: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
4990: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
49a0: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
49b0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
49c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
49d0: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
49e0: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
49f0: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
4a00: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
4a10: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
4a20: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
4a30: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
4a40: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
4a50: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
4a60: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
4a70: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
4a80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4a90: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
4ac0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
4ad0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
4ae0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
4af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
4b00: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
4b10: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67   );.  if( p->mag
4b20: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
4b30: 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  UN ) return SQLI
4b40: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73  TE_MISUSE;.  ass
4b50: 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d  ert( db->magic==
4b60: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
4b70: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
4b80: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
4b90: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
4ba0: 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45  _BUSY );..  /* E
4bb0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
4bc0: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
4bd0: 70 75 74 20 64 79 6e 61 6d 69 63 20 73 74 72 69  put dynamic stri
4be0: 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a  ngs onto the.  *
4bf0: 2a 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65  * the stack, the
4c00: 79 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  y may become dyn
4c10: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
4c20: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
4c30: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
4c40: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
4c50: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
4c60: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
4c70: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f   */.  if( p->pTo
4c80: 73 3d 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d  s==&p->aStack[4]
4c90: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
4ca0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63  emArray(p->aStac
4cb0: 6b 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  k, 5);.  }.  p->
4cc0: 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a  resOnStack = 0;.
4cd0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
4ce0: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
4cf0: 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d  ( i<p->nOp && p-
4d00: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
4d10: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
4d20: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
4d30: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29   if( i>=p->nOp )
4d40: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
4d50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
4d60: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
4d70: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
4d80: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
4d90: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
4da0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
4db0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4dc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
4dd0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
4de0: 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  >zErrMsg, sqlite
4df0: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20  3ErrStr(p->rc), 
4e00: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c  (char*)0);.  }el
4e10: 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20  se{.    Op *pOp 
4e20: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
4e30: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
4e40: 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65  >aStack;.    pMe
4e50: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
4e60: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  nt;.    pMem->ty
4e70: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
4e80: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  GER;.    pMem->u
4e90: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
4ec0: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
4ed0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
4ee0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
4ef0: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
4f00: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65  EM_Term;.    pMe
4f10: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
4f20: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73  lite3OpcodeNames
4f30: 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20  [pOp->opcode];  
4f40: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
4f50: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
4f60: 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  !=0 );.    pMem-
4f70: 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d  >n = strlen(pMem
4f80: 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ->z);.    pMem->
4f90: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
4fa0: 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  XT;.    pMem->en
4fb0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
4fc0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
4fd0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
4fe0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
4ff0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
5000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
5020: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
5030: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5040: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
5050: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
5060: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
5070: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
5080: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50a0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
50b0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
50c0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
50d0: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
50e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68 65  flags = MEM_Ephe
50f0: 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  m|MEM_Str|MEM_Te
5100: 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20  rm;   /* P3 */. 
5110: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73     pMem->z = dis
5120: 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d  playP3(pOp, pMem
5130: 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66  ->zShort, sizeof
5140: 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b  (pMem->zShort));
5150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
5160: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70  m->z!=0 );.    p
5170: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5180: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d  pMem->z);.    pM
5190: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
51a0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
51b0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
51c0: 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65  TF8;..    p->nRe
51d0: 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32 2a  sColumn = 5 - 2*
51e0: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
51f0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d      p->pTos = pM
5200: 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  em;.    p->rc = 
5210: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
5220: 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 31  ->resOnStack = 1
5230: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
5240: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
5250: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
5260: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5270: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  EXPLAIN */../*.*
5280: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
5290: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
52a0: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
52b0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
52c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
52d0: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
52e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
52f0: 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  BUG.  int nOp = 
5300: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
5310: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
5320: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
5330: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70  Op = &p->aOp[nOp
5340: 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  -1];.  if( pOp->
5350: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20  opcode==OP_Noop 
5360: 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b  && pOp->p3!=0 ){
5370: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5380: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  *z = pOp->p3;.  
5390: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
53a0: 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b  (*(u8*)z) ) z++;
53b0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
53c0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
53d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66   }.#endif.}..#if
53e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
53f0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
5400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
5410: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
5420: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
5430: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
5440: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
5450: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
5460: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
5470: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5480: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
5490: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
54a0: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74  if( sqlite3_io_t
54b0: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
54c0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
54d0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
54e0: 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a  &p->aOp[nOp-1];.
54f0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
5500: 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f  e==OP_Noop && pO
5510: 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20  p->p3!=0 ){.    
5520: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
5530: 33 53 74 72 44 75 70 28 70 4f 70 2d 3e 70 33 29  3StrDup(pOp->p3)
5540: 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
5550: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73      for(i=0; iss
5560: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
5570: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
5580: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
5590: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 7a 5b    if( isspace(z[
55a0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
55b0: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
55c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
55d0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
55e0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
55f0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
5600: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
5610: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
5620: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
5630: 69 6f 5f 74 72 61 63 65 28 22 53 51 4c 20 25 73  io_trace("SQL %s
5640: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  \n", z);.    sql
5650: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  iteFree(z);.  }.
5660: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
5670: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
5680: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
5690: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a  IOTRACE */.../*.
56a0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
56b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
56c0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69   execution.  Thi
56d0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
56e0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
56f0: 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70  ocating stack sp
5700: 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ace and initiali
5710: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
5720: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
5730: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
5740: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
5750: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
5760: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
5770: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
5780: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
5790: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
57a0: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
57b0: 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44  e a VDBE from VD
57c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f  BE_MAGIC_INIT to
57d0: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  .** VDBE_MAGIC_R
57e0: 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  UN..*/.void sqli
57f0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
5800: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
5830: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20  /.  int nVar,   
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5860: 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53  '?' see in the S
5870: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
5880: 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20    int nMem,     
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65   /* Number of me
58b0: 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c  mory cells to al
58c0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
58d0: 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  nCursor,        
58e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
58f0: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
5900: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
5910: 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20   int isExplain  
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45  /* True if the E
5940: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20  XPLAIN keywords 
5950: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b  is present */.){
5960: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73  .  int n;..  ass
5970: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
5980: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
5990: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
59a0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
59b0: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
59c0: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
59d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
59e0: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
59f0: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
5a00: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
5a10: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
5a20: 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20  an later. This. 
5a30: 20 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74    * is because t
5a40: 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a  he call to resiz
5a50: 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77  eOpArray() below
5a60: 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a   may shrink the.
5a70: 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72     * p->aOp[] ar
5a80: 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f  ray to save memo
5a90: 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65  ry if called whe
5aa0: 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f  n in VDBE_MAGIC_
5ab0: 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e  RUN .   * state.
5ac0: 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  .   */.  p->magi
5ad0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
5ae0: 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73  UN;..  /* No ins
5af0: 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75  truction ever pu
5b00: 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  shes more than a
5b10: 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20   single element 
5b20: 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74  onto the.  ** st
5b30: 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74  ack.  And the st
5b40: 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20  ack never grows 
5b50: 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78  on successive ex
5b60: 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ecutions of the.
5b70: 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20    ** same loop. 
5b80: 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   So the total nu
5b90: 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74  mber of instruct
5ba0: 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72  ions is an upper
5bb0: 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74   bound.  ** on t
5bc0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b  he maximum stack
5bd0: 20 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e   depth required.
5be0: 20 20 28 41 64 64 65 64 20 6c 61 74 65 72 3a 29    (Added later:)
5bf0: 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73 6f 6c    The.  ** resol
5c00: 76 65 50 32 56 61 6c 75 65 73 28 29 20 63 61 6c  veP2Values() cal
5c10: 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74 69 67  l computes a tig
5c20: 68 74 65 72 20 75 70 70 65 72 20 62 6f 75 6e 64  hter upper bound
5c30: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73 74 61   on the.  ** sta
5c40: 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20 20  ck size..  **.  
5c50: 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c  ** Allocation al
5c60: 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61 63  l the stack spac
5c70: 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20 6e  e we will ever n
5c80: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
5c90: 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a  p->aStack==0 ){.
5ca0: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20      int nArg;   
5cb0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
5cc0: 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61  umber of args pa
5cd0: 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66  ssed to a user f
5ce0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
5cf0: 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20  int nStack;     
5d00: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
5d10: 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72 69  r of stack entri
5d20: 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  es required */. 
5d30: 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75     resolveP2Valu
5d40: 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26 6e 53  es(p, &nArg, &nS
5d50: 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73 69 7a  tack);.    resiz
5d60: 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e  eOpArray(p, p->n
5d70: 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Op);.    assert(
5d80: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20   nVar>=0 );.    
5d90: 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b 3c 70  assert( nStack<p
5da0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28  ->nOp );.    if(
5db0: 20 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20   isExplain ){.  
5dc0: 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 31 30 3b      nStack = 10;
5dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 53  .    }.    p->aS
5de0: 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c  tack = sqliteMal
5df0: 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 6e 53 74  loc(.        nSt
5e00: 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53  ack*sizeof(p->aS
5e10: 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61  tack[0])    /* a
5e20: 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b  Stack */.      +
5e30: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
5e40: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
5e50: 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20  /* apArg */.    
5e60: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
5e70: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
5e80: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
5e90: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
5ea0: 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20  f(char*)        
5eb0: 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f       /* azVar */
5ec0: 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69  .      + nMem*si
5ed0: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
5ee0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20          /* aMem 
5ef0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73  */.      + nCurs
5f00: 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72  or*sizeof(Cursor
5f10: 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43  *)        /* apC
5f20: 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20  sr */.    );.   
5f30: 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c   if( !sqlite3Mal
5f40: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
5f50: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26       p->aMem = &
5f60: 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b  p->aStack[nStack
5f70: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  ];.      p->nMem
5f80: 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70   = nMem;.      p
5f90: 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65  ->aVar = &p->aMe
5fa0: 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70  m[nMem];.      p
5fb0: 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20  ->nVar = nVar;. 
5fc0: 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20       p->okVar = 
5fd0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  0;.      p->apAr
5fe0: 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61  g = (Mem**)&p->a
5ff0: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
6000: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61   p->azVar = (cha
6010: 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41  r**)&p->apArg[nA
6020: 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  rg];.      p->ap
6030: 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29  Csr = (Cursor**)
6040: 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b  &p->azVar[nVar];
6050: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  .      p->nCurso
6060: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20  r = nCursor;.   
6070: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
6080: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
6090: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
60a0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
60b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
60c0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d  .  for(n=0; n<p-
60d0: 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  >nMem; n++){.   
60e0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
60f0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
6100: 7d 0a 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26  }..  p->pTos = &
6110: 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20  p->aStack[-1];. 
6120: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
6130: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
6140: 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74  ;.  p->uniqueCnt
6150: 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72   = 0;.  p->retur
6160: 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  nDepth = 0;.  p-
6170: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
6180: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f  E_Abort;.  p->po
6190: 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70  pStack =  0;.  p
61a0: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
61b0: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
61c0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
61d0: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
61e0: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
61f0: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
6200: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
6210: 74 20 3d 20 32 35 35 3b 0a 23 69 66 64 65 66 20  t = 255;.#ifdef 
6220: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
6230: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6240: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
6250: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
6260: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
6270: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
6280: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
6290: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
62a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
62b0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
62c0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
62d0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
62e0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68   happens.** to h
62f0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
6300: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
6310: 6f 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73  or(Vdbe *p, Curs
6320: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
6330: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
6340: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6350: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
6360: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6370: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
6380: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >pCursor);.  }. 
6390: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
63a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
63b0: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
63c0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
63d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
63e0: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
63f0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
6400: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
6410: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
6420: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
6430: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
6440: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
6450: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
6460: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
6470: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
6480: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
6490: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
64a0: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
64b0: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
64c0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  r);.    sqlite3S
64d0: 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a  afetyOn(p->db);.
64e0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
64f0: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
6500: 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65  dif.  sqliteFree
6510: 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pCx->pData);.  
6520: 73 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e  sqliteFree(pCx->
6530: 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  aType);.  sqlite
6540: 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a  Free(pCx);.}../*
6550: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
6560: 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20  rsors.*/.static 
6570: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
6580: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
6590: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
65a0: 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75  >apCsr==0 ) retu
65b0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
65c0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
65d0: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69  ){.    if( !p->i
65e0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 28  nVtabMethod || (
65f0: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 26 26 20 21  p->apCsr[i] && !
6600: 70 2d 3e 61 70 43 73 72 5b 69 5d 2d 3e 70 56 74  p->apCsr[i]->pVt
6610: 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  abCursor) ){.   
6620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
6630: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61  eeCursor(p, p->a
6640: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pCsr[i]);.      
6650: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
6660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
6670: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
6680: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
6690: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
66a0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
66b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
66c0: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
66d0: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
66e0: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
66f0: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
6700: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
6710: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
6720: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
6730: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
6740: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
6750: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
6760: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
6770: 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65  aStack ){.    re
6780: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
6790: 3e 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d  >aStack, 1 + (p-
67a0: 3e 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63  >pTos - p->aStac
67b0: 6b 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  k));.    p->pTos
67c0: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31   = &p->aStack[-1
67d0: 5d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  ];.  }.  closeAl
67e0: 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 72  lCursors(p);.  r
67f0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
6800: 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
6810: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46  ;.  sqlite3VdbeF
6820: 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69  ifoClear(&p->sFi
6830: 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f  fo);.  if( p->co
6840: 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20  ntextStack ){.  
6850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6860: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b  contextStackTop;
6870: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6880: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
6890: 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  r(&p->contextSta
68a0: 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20  ck[i].sFifo);.  
68b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
68c0: 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  ee(p->contextSta
68d0: 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ck);.  }.  p->co
68e0: 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ntextStack = 0;.
68f0: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
6900: 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  kDepth = 0;.  p-
6910: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
6920: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72   = 0;.  sqliteFr
6930: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  ee(p->zErrMsg);.
6940: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
6950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
6960: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
6970: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
6980: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
6990: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
69a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
69b0: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
69c0: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
69d0: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
69e0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
69f0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
6a00: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
6a10: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
6a20: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
6a30: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
6a40: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
6a50: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
6a60: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
6a70: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
6a80: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
6a90: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
6aa0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
6ab0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6ac0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
6ad0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
6ae0: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 46  ME_N);.  sqliteF
6af0: 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  ree(p->aColName)
6b00: 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  ;.  n = nResColu
6b10: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
6b20: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
6b30: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
6b40: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
6b50: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
6b60: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
6b70: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
6b80: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
6b90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
6ba0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
6bb0: 20 20 20 28 70 43 6f 6c 4e 61 6d 65 2b 2b 29 2d     (pColName++)-
6bc0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
6bd0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
6be0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
6bf0: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
6c00: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
6c10: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
6c20: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
6c30: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
6c40: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
6c50: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
6c60: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
6c70: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
6c80: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
6c90: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
6ca0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d  ()..**.** If N==
6cb0: 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65  P3_STATIC  it me
6cc0: 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69  ans that zName i
6cd0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
6ce0: 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63   constant static
6cf0: 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77  .** string and w
6d00: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
6d10: 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20  the pointer. If 
6d20: 69 74 20 69 73 20 50 33 5f 44 59 4e 41 4d 49 43  it is P3_DYNAMIC
6d30: 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73  , then .** the s
6d40: 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20 75  tring is freed u
6d50: 73 69 6e 67 20 73 71 6c 69 74 65 46 72 65 65 28  sing sqliteFree(
6d60: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
6d70: 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  is finished with
6d80: 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73  .** it. Otherwis
6d90: 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e  e, N bytes of zN
6da0: 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a  ame are copied..
6db0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
6dc0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62  beSetColName(Vdb
6dd0: 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69  e *p, int idx, i
6de0: 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68  nt var, const ch
6df0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
6e00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
6e10: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
6e20: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
6e30: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
6e40: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
6e50: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 73 71  ME_N );.  if( sq
6e60: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
6e70: 64 28 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  d() ) return SQL
6e80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73  ITE_NOMEM;.  ass
6e90: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
6ea0: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
6eb0: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
6ec0: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
6ed0: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28  sColumn]);.  if(
6ee0: 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c   N==P3_DYNAMIC |
6ef0: 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29  | N==P3_STATIC )
6f00: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6f10: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
6f20: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
6f30: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
6f40: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6f50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6f60: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
6f70: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
6f80: 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c  e, zName, N, SQL
6f90: 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f  ITE_UTF8,SQLITE_
6fa0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
6fb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6fc0: 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e  _OK && N==P3_DYN
6fd0: 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c  AMIC ){.    pCol
6fe0: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70  Name->flags = (p
6ff0: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28  ColName->flags&(
7000: 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45  ~MEM_Static))|ME
7010: 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e  M_Dyn;.    pColN
7020: 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  ame->xDel = 0;. 
7030: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7040: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
7050: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
7060: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
7070: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
7080: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7090: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
70a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
70b0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
70c0: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
70d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
70e0: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
70f0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
7100: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
7110: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
7120: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
7130: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
7140: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
7150: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
7160: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
7170: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
7180: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
7190: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
71a0: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
71b0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
71c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
71d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
71e0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20  dXcommit = 0;.. 
71f0: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
7200: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
7210: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
7220: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
7230: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
7240: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
7250: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
7260: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
7270: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
7280: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
7290: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
72a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
72b0: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
72c0: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
72d0: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
72e0: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
72f0: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
7300: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
7310: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
7320: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
7330: 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20 72  db, rc);.  if( r
7340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7350: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7360: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f   }..  /* This lo
7370: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
7380: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
7390: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
73a0: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
73b0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
73c0: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
73d0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
73e0: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
73f0: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
7400: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
7410: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
7420: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
7430: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
7440: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
7450: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
7460: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
7470: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
7480: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
7490: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
74a0: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
74b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
74c0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
74d0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
74e0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
74f0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
7500: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
7510: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
7520: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
7530: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
7540: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
7550: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
7560: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
7570: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
7580: 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
7590: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
75a0: 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
75b0: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
75c0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
75d0: 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74      sqlite3Safet
75e0: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
75f0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
7600: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
7610: 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  itArg);.    sqli
7620: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
7630: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
7640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7650: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
7660: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
7670: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
7680: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
7690: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
76a0: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
76b0: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
76c0: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
76d0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
76e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
76f0: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
7700: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
7710: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
7720: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
7730: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7740: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
7750: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
7760: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
7770: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
7780: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e  ase is :memory:.
7790: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77    In that case w
77a0: 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75  e do.  ** not su
77b0: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
77c0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
77d0: 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70   so use the simp
77e0: 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a  le case then.  *
77f0: 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  * too..  */.  if
7800: 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69  ( 0==strlen(sqli
7810: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
7820: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
7830: 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  Bt)) || nTrans<=
7840: 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  1 ){.    for(i=0
7850: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
7860: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
7870: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
7880: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
7890: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
78a0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
78b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
78c0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
78d0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
78e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
78f0: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
7900: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
7910: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
7920: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
7930: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
7940: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
7950: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
7960: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
7970: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
7980: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
7990: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
79a0: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
79b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
79c0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
79d0: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
79e0: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
79f0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
7a00: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
7a10: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
7a20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
7a30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
7a40: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
7a50: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
7a60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7a70: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
7a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
7a90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
7aa0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
7ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7ac0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7ad0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
7ae0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
7af0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
7b00: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
7b10: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
7b20: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
7b30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
7b40: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
7b50: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
7b60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
7b70: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
7b80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
7b90: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
7ba0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
7bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7bc0: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
7bd0: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
7be0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
7bf0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
7c00: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
7c10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7c20: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
7c30: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
7c40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
7c50: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
7c60: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 4f  b[0].pBt);.    O
7c70: 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20  sFile *master = 
7c80: 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  0;..    /* Selec
7c90: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
7ca0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
7cb0: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
7cc0: 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  32 random;.     
7cd0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
7ce0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
7cf0: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
7d00: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
7d10: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
7d20: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
7d30: 50 72 69 6e 74 66 28 22 25 73 2d 6d 6a 25 30 38  Printf("%s-mj%08
7d40: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72  X", zMainFile, r
7d50: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
7d60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
7d70: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
7d80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7d90: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
7da0: 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65    }while( sqlite
7db0: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d  3OsFileExists(zM
7dc0: 61 73 74 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f  aster) );..    /
7dd0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
7de0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
7df0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7e00: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d  OpenExclusive(zM
7e10: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20  aster, &master, 
7e20: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
7e30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7e40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
7e50: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
7e60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
7e70: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
7e80: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
7e90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
7ea0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7eb0: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
7ec0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
7ed0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
7ee0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
7ef0: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
7f00: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
7f10: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
7f20: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
7f30: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
7f40: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
7f50: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
7f60: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
7f70: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
7f80: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
7f90: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
7fa0: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
7fb0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
7fc0: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
7fd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
7fe0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
7ff0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8000: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8010: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
8020: 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67  ontinue;   /* Ig
8030: 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  nore the TEMP da
8040: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
8050: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
8060: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
8070: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
8080: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
8090: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
80a0: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
80b0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
80c0: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
80d0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
80e0: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
80f0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
8100: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
8110: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
8120: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
8130: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
8140: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
8150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8160: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
8170: 69 74 65 28 6d 61 73 74 65 72 2c 20 7a 46 69 6c  ite(master, zFil
8180: 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  e, strlen(zFile)
8190: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
81a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
81b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
81c0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
81d0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
81e0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
81f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
8200: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
8210: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
8220: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8240: 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79     }...    /* Sy
8250: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
8260: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f  urnal file. Befo
8270: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f  re doing this, o
8280: 70 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  pen the director
8290: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73  y.    ** the mas
82a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
82b0: 20 69 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20   is store in so 
82c0: 74 68 61 74 20 69 74 20 67 65 74 73 20 73 79 6e  that it gets syn
82d0: 63 65 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ced too..    */.
82e0: 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20      zMainFile = 
82f0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
8300: 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  irname(db->aDb[0
8310: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  ].pBt);.    rc =
8320: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
8330: 72 65 63 74 6f 72 79 28 6d 61 73 74 65 72 2c 20  rectory(master, 
8340: 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
8350: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8360: 4b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  K ||.          (
8370: 6e 65 65 64 53 79 6e 63 20 26 26 20 28 72 63 3d  needSync && (rc=
8380: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 6d 61  sqlite3OsSync(ma
8390: 73 74 65 72 2c 30 29 29 21 3d 53 51 4c 49 54 45  ster,0))!=SQLITE
83a0: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71  _OK) ){.      sq
83b0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
83c0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
83d0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
83e0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
83f0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
8400: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8410: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
8420: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
8430: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
8440: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
8450: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
8460: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
8470: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8480: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
8490: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
84a0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
84b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
84c0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
84d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
84e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
84f0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
8500: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
8510: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
8520: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
8530: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
8540: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
8550: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
8560: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
8570: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
8580: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
8590: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
85a0: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
85b0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
85c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
85d0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
85e0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
85f0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
8600: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
8610: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  e failure occure
8620: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8630: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
8640: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
8650: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
8660: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8670: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8680: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
8690: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
86a0: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
86b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
86c0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
86d0: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
86e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
86f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
8700: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
8710: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8720: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
8730: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
8740: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8750: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
8760: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
8770: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8780: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
8790: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
87a0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
87b0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
87c0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
87d0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
87e0: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
87f0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
8800: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
8810: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
8820: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
8830: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 73  (zMaster);.    s
8840: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
8850: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
8860: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
8870: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8880: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
8890: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
88a0: 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46  Directory(zMainF
88b0: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ile);.    if( rc
88c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
88d0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
88e0: 6e 6f 74 20 67 6f 6f 64 2e 20 54 68 65 20 6d 61  not good. The ma
88f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8900: 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  e has been delet
8910: 65 64 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  ed, but.      **
8920: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
8930: 79 6e 63 20 66 61 69 6c 65 64 2e 20 54 68 65 72  ync failed. Ther
8940: 65 20 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 74 65  e is no complete
8950: 6c 79 20 73 61 66 65 20 63 6f 75 72 73 65 20 6f  ly safe course o
8960: 66 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 6f  f.      ** actio
8970: 6e 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 65  n from here. The
8980: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
8990: 6e 61 6c 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  nals contain the
89a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   name of the.   
89b0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
89c0: 72 6e 61 6c 20 66 69 6c 65 2c 20 62 75 74 20 74  rnal file, but t
89d0: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 6f  here is no way o
89e0: 66 20 6b 6e 6f 77 69 6e 67 20 69 66 20 74 68 61  f knowing if tha
89f0: 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65  t.      ** maste
8a00: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
8a10: 20 6e 6f 77 20 6f 72 20 69 66 20 69 74 20 77 69   now or if it wi
8a20: 6c 6c 20 65 78 69 73 74 20 61 66 74 65 72 20 74  ll exist after t
8a30: 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 20  he operating.   
8a40: 20 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61     ** system cra
8a50: 73 68 20 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c  sh that may foll
8a60: 6f 77 20 74 68 65 20 66 73 79 6e 63 28 29 20 66  ow the fsync() f
8a70: 61 69 6c 75 72 65 2e 0a 20 20 20 20 20 20 2a 2f  ailure..      */
8a80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8a90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8aa0: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
8ab0: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
8ac0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
8ad0: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
8ae0: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
8af0: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
8b00: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
8b10: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
8b20: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
8b30: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
8b40: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
8b50: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
8b60: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
8b70: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
8b80: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
8b90: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
8ba0: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
8bb0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
8bc0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
8bd0: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
8be0: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
8bf0: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
8c00: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
8c10: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
8c20: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
8c30: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
8c40: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
8c50: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
8c60: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
8c70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8c80: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
8c90: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
8ca0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
8cb0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
8cc0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8cd0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
8ce0: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
8cf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8d00: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
8d10: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
8d20: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
8d30: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
8d40: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
8d50: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
8d60: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
8d70: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
8d80: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
8d90: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
8da0: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
8db0: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
8dc0: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
8dd0: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
8de0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
8df0: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
8e00: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
8e10: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
8e20: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
8e30: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
8e40: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
8e50: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
8e60: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
8e70: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
8e80: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
8e90: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
8ea0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
8eb0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
8ec0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
8ed0: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
8ee0: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
8ef0: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
8f00: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
8f10: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
8f20: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
8f30: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
8f40: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
8f50: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
8f60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
8f70: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
8f80: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
8f90: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  tiveVdbeCnt );.}
8fa0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
8fb0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
8fc0: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
8fd0: 2a 2a 20 46 69 6e 64 20 65 76 65 72 79 20 61 63  ** Find every ac
8fe0: 74 69 76 65 20 56 4d 20 6f 74 68 65 72 20 74 68  tive VM other th
8ff0: 61 6e 20 70 56 64 62 65 20 61 6e 64 20 63 68 61  an pVdbe and cha
9000: 6e 67 65 20 69 74 73 20 73 74 61 74 75 73 20 74  nge its status t
9010: 6f 0a 2a 2a 20 61 62 6f 72 74 65 64 2e 20 20 54  o.** aborted.  T
9020: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
9030: 20 6f 6e 65 20 56 4d 20 63 61 75 73 65 73 20 61   one VM causes a
9040: 20 72 6f 6c 6c 62 61 63 6b 20 64 75 65 20 74 6f   rollback due to
9050: 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49   an.** ON CONFLI
9060: 43 54 20 52 4f 4c 4c 42 41 43 4b 20 63 6c 61 75  CT ROLLBACK clau
9070: 73 65 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  se (for example)
9080: 2e 20 20 54 68 65 20 6f 74 68 65 72 20 56 4d 73  .  The other VMs
9090: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61 62 6f 72   must be.** abor
90a0: 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 79  ted so that they
90b0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 64 61 74   do not have dat
90c0: 61 20 72 6f 6c 6c 65 64 20 6f 75 74 20 66 72 6f  a rolled out fro
90d0: 6d 20 75 6e 64 65 72 6e 65 61 74 68 0a 2a 2a 20  m underneath.** 
90e0: 74 68 65 6d 20 6c 65 61 64 69 6e 67 20 74 6f 20  them leading to 
90f0: 61 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76  a segfault..*/.v
9100: 6f 69 64 20 73 71 6c 69 74 65 33 41 62 6f 72 74  oid sqlite3Abort
9110: 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73  OtherActiveVdbes
9120: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
9130: 62 65 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  be *pExcept){.  
9140: 56 64 62 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20  Vdbe *pOther;.  
9150: 66 6f 72 28 70 4f 74 68 65 72 3d 64 62 2d 3e 70  for(pOther=db->p
9160: 56 64 62 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f  Vdbe; pOther; pO
9170: 74 68 65 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65  ther=pOther->pNe
9180: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 74  xt){.    if( pOt
9190: 68 65 72 3d 3d 70 45 78 63 65 70 74 20 29 20 63  her==pExcept ) c
91a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
91b0: 20 70 4f 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d   pOther->magic!=
91c0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
91d0: 7c 20 70 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29  | pOther->pc<0 )
91e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63   continue;.    c
91f0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
9200: 74 28 64 62 29 3b 0a 20 20 20 20 63 6c 6f 73 65  t(db);.    close
9210: 41 6c 6c 43 75 72 73 6f 72 73 28 70 4f 74 68 65  AllCursors(pOthe
9220: 72 29 3b 0a 20 20 20 20 63 68 65 63 6b 41 63 74  r);.    checkAct
9230: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
9240: 20 20 20 20 70 4f 74 68 65 72 2d 3e 61 62 6f 72      pOther->abor
9250: 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ted = 1;.  }.}..
9260: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9270: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
9280: 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
9290: 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
92a0: 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
92b0: 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
92c0: 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
92d0: 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
92e0: 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
92f0: 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
9300: 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
9310: 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
9320: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
9330: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
9340: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
9350: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
9360: 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
9370: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
9380: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
9390: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
93a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
93b0: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
93c0: 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
93d0: 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
93e0: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
93f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
9400: 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
9410: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
9420: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
9430: 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
9440: 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
9450: 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
9460: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
9470: 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
9480: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9490: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
94a0: 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42    int (*xFunc)(B
94b0: 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20  tree *pBt) = 0; 
94c0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
94d0: 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72  call on each btr
94e0: 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  ee backend */.  
94f0: 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
9500: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
9510: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
9520: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
9530: 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20   IOERR */..  /* 
9540: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
9550: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
9560: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
9570: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
9580: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
9590: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
95a0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
95b0: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
95c0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
95d0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
95e0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
95f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 65 63 69  .  **.  ** Speci
9600: 61 6c 20 65 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a  al errors:.  **.
9610: 20 20 2a 2a 20 20 20 20 20 49 66 20 61 6e 20 53    **     If an S
9620: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f  QLITE_NOMEM erro
9630: 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 69 6e  r has occured in
9640: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61   a statement tha
9650: 74 20 77 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a  t writes to.  **
9660: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
9670: 65 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 61  e, then either a
9680: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
9690: 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
96a0: 65 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 20 20  e rolled.  **   
96b0: 20 20 62 61 63 6b 20 74 6f 20 65 6e 73 75 72 65    back to ensure
96c0: 20 74 68 65 20 74 72 65 65 2d 73 74 72 75 63 74   the tree-struct
96d0: 75 72 65 73 20 61 72 65 20 69 6e 20 61 20 63 6f  ures are in a co
96e0: 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 20  nsistent state. 
96f0: 41 0a 20 20 2a 2a 20 20 20 20 20 73 74 61 74 65  A.  **     state
9700: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
9710: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   is rolled back 
9720: 69 66 20 6f 6e 65 20 69 73 20 6f 70 65 6e 2c 20  if one is open, 
9730: 6f 74 68 65 72 77 69 73 65 20 74 68 65 0a 20 20  otherwise the.  
9740: 2a 2a 20 20 20 20 20 65 6e 74 69 72 65 20 74 72  **     entire tr
9750: 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
9760: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
9770: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20   **.  **     If 
9780: 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  an SQLITE_IOERR 
9790: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
97a0: 64 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  d in a statement
97b0: 20 74 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a   that writes to.
97c0: 20 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74    **     the dat
97d0: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
97e0: 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
97f0: 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
9800: 64 20 62 61 63 6b 2e 20 54 68 65 0a 20 20 2a 2a  d back. The.  **
9810: 20 20 20 20 20 49 2f 4f 20 65 72 72 6f 72 20 6d       I/O error m
9820: 61 79 20 68 61 76 65 20 63 61 75 73 65 64 20 67  ay have caused g
9830: 61 72 62 61 67 65 20 74 6f 20 62 65 20 77 72 69  arbage to be wri
9840: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
9850: 6e 61 6c 20 0a 20 20 2a 2a 20 20 20 20 20 66 69  nal .  **     fi
9860: 6c 65 2e 20 57 65 72 65 20 74 68 65 20 74 72 61  le. Were the tra
9870: 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  nsaction to cont
9880: 69 6e 75 65 20 61 6e 64 20 65 76 65 6e 74 75 61  inue and eventua
9890: 6c 6c 79 20 62 65 20 72 6f 6c 6c 65 64 20 0a 20  lly be rolled . 
98a0: 20 2a 2a 20 20 20 20 20 62 61 63 6b 20 74 68 61   **     back tha
98b0: 74 20 67 61 72 62 61 67 65 20 6d 69 67 68 74 20  t garbage might 
98c0: 65 6e 64 20 75 70 20 69 6e 20 74 68 65 20 64 61  end up in the da
98d0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
98e0: 2a 20 20 20 20 20 0a 20 20 2a 2a 20 20 20 20 20  *     .  **     
98f0: 49 6e 20 62 6f 74 68 20 6f 66 20 74 68 65 20 61  In both of the a
9900: 62 6f 76 65 20 63 61 73 65 73 2c 20 74 68 65 20  bove cases, the 
9910: 56 64 62 65 2e 65 72 72 6f 72 41 63 74 69 6f 6e  Vdbe.errorAction
9920: 20 76 61 72 69 61 62 6c 65 20 69 73 20 0a 20 20   variable is .  
9930: 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 20  **     ignored. 
9940: 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  If the sqlite3.a
9950: 75 74 6f 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69  utoCommit flag i
9960: 73 20 66 61 6c 73 65 20 61 6e 64 20 61 20 74 72  s false and a tr
9970: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 20  ansaction.  **  
9980: 20 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63     is rolled bac
9990: 6b 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 73 65  k, it will be se
99a0: 74 20 74 6f 20 74 72 75 65 2e 0a 20 20 2a 2a 0a  t to true..  **.
99b0: 20 20 2a 2a 20 4f 74 68 65 72 20 65 72 72 6f 72    ** Other error
99c0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20  s:.  **.  ** No 
99d0: 65 72 72 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f  error:.  **.  */
99e0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ..  if( sqlite3M
99f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
9a00: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
9a10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9a20: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
9a30: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
9a40: 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  .    /* Already 
9a50: 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67  halted.  Nothing
9a60: 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61   to do. */.    a
9a70: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9a80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
9a90: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
9aa0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9ab0: 41 42 4c 45 0a 20 20 20 20 63 6c 6f 73 65 41 6c  ABLE.    closeAl
9ac0: 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 23 65 6e  lCursors(p);.#en
9ad0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
9ae0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
9af0: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
9b00: 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  p);.  checkActiv
9b10: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
9b20: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
9b30: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
9b40: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
9b50: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
9b60: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
9b70: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
9b80: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
9b90: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
9ba0: 72 63 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 68 65  rc */.    /* Che
9bb0: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
9bc0: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
9bd0: 20 2d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20   - SQLITE_NOMEM 
9be0: 6f 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  or SQLITE_IOERR 
9bf0: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
9c00: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
9c10: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
9c20: 28 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  ((mrc==SQLITE_NO
9c30: 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
9c40: 54 45 5f 49 4f 45 52 52 29 3f 31 3a 30 29 3b 0a  TE_IOERR)?1:0);.
9c50: 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
9c60: 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
9c70: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65  /* This loop doe
9c80: 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  s static analysi
9c90: 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 74  s of the query t
9ca0: 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66 20 74  o see which of t
9cb0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  he.      ** foll
9cc0: 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61 74 65  owing three cate
9cd0: 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73 20  gories it falls 
9ce0: 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  into:.      **. 
9cf0: 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61 64       **     Read
9d00: 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20  -only.      **  
9d10: 20 20 20 51 75 65 72 79 20 77 69 74 68 20 73 74     Query with st
9d20: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
9d30: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65        **     Que
9d40: 72 79 20 77 69 74 68 6f 75 74 20 73 74 61 74 65  ry without state
9d50: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ment journal.   
9d60: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
9d70: 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74  e could do somet
9d80: 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e  hing more elegan
9d90: 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61 74  t than this stat
9da0: 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65  ic analysis (i.e
9db0: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65  ..      ** store
9dc0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75 65   the type of que
9dd0: 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ry as part of th
9de0: 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68  e compliation ph
9df0: 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20  ase), but .     
9e00: 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c   ** handling mal
9e10: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c  loc() or IO fail
9e20: 75 72 65 20 69 73 20 61 20 66 61 69 72 6c 79 20  ure is a fairly 
9e30: 6f 62 73 63 75 72 65 20 65 64 67 65 20 63 61 73  obscure edge cas
9e40: 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  e so .      ** t
9e50: 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20  his is probably 
9e60: 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69  easier. Todo: Mi
9e70: 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72 74  ght be an opport
9e80: 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65 20  unity to reduce 
9e90: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 73  .      ** code s
9ea0: 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c 6c  ize a very small
9eb0: 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e   amount though..
9ec0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9ed0: 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20   int isReadOnly 
9ee0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
9ef0: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  sStatement = 0;.
9f00: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e        assert(p->
9f10: 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30  aOp || p->nOp==0
9f20: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
9f30: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
9f40: 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  { .        switc
9f50: 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  h( p->aOp[i].opc
9f60: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
9f70: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
9f80: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  tion:.          
9f90: 20 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30    isReadOnly = 0
9fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
9fb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
9fc0: 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ase OP_Statement
9fd0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  :.            is
9fe0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20  Statement = 1;. 
9ff0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a000: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a010: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
a020: 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
a030: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e   read-only, we n
a040: 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61  eed do no rollba
a050: 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72  ck at all. Other
a060: 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70  wise,.      ** p
a070: 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65 20  roceed with the 
a080: 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
a090: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a0a0: 20 69 66 28 20 21 69 73 52 65 61 64 4f 6e 6c 79   if( !isReadOnly
a0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a0c0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
a0d0: 4d 45 4d 20 26 26 20 69 73 53 74 61 74 65 6d 65  MEM && isStateme
a0e0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
a0f0: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
a100: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
a110: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a120: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
a130: 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
a140: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
a150: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
a160: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
a170: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
a180: 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
a190: 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
a1a0: 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
a1b0: 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
a1c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a1d0: 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f     sqlite3AbortO
a1e0: 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28  therActiveVdbes(
a1f0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
a200: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
a210: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
a220: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
a230: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
a240: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
a250: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
a260: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
a270: 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
a280: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
a290: 74 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a  tive vdbe, then.
a2a0: 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74      ** we do eit
a2b0: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
a2c0: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
a2d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
a2e0: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
a2f0: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
a300: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
a310: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
a320: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
a330: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
a340: 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a  e has occured. .
a350: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
a360: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26  b->autoCommit &&
a370: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
a380: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  nt==1 ){.      i
a390: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
a3a0: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
a3b0: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
a3c0: 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
a3d0: 6f 72 29 20 29 7b 0a 09 2f 2a 20 54 68 65 20 61  or) ){../* The a
a3e0: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
a3f0: 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  is true, and the
a400: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
a410: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  s .        ** su
a420: 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20  ccessful or hit 
a430: 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
a440: 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65  straint. This me
a450: 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
a460: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
a470: 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ired..        */
a480: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
a490: 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29  = vdbeCommit(db)
a4a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
a4b0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
a4c0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a4d0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
a4e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a4f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a500: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
a510: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
a520: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
a530: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
a540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a550: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
a560: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
a570: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
a580: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a590: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
a5a0: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
a5b0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
a5c0: 28 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20  ( !xFunc ){.    
a5d0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a5e0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
a5f0: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
a600: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75  l ){.        xFu
a610: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
a620: 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20  eCommitStmt;.   
a630: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
a640: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
a650: 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
a660: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a670: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a680: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
a690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
a6a0: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
a6b0: 64 62 65 73 28 64 62 2c 20 70 29 3b 0a 20 20 20  dbes(db, p);.   
a6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
a6d0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
a6e0: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
a6f0: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
a700: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
a710: 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74   If xFunc is not
a720: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
a730: 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33  s one of sqlite3
a740: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a750: 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  t or.    ** sqli
a760: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
a770: 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65  mt. Call it once
a780: 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64   on each backend
a790: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
a7a0: 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20  curs.    ** and 
a7b0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
a7c0: 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f  is still SQLITE_
a7d0: 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75  OK, set the retu
a7e0: 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  rn code to the n
a7f0: 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  ew.    ** error 
a800: 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  value..    */.  
a810: 20 20 61 73 73 65 72 74 28 21 78 46 75 6e 63 20    assert(!xFunc 
a820: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
a830: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
a840: 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20  itStmt ||.      
a850: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
a860: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a  reeRollbackStmt.
a870: 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69      );.    for(i
a880: 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64  =0; xFunc && i<d
a890: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
a8a0: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
a8b0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
a8c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
a8d0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
a8e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 78 46  .        rc = xF
a8f0: 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20  unc(pBt);.      
a900: 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e    if( rc && (p->
a910: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
a920: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
a930: 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20  ONSTRAINT) ){.  
a940: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
a950: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
a960: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
a970: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a  p->zErrMsg, 0);.
a980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a990: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
a9a0: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
a9b0: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
a9c0: 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68  or DELETE and th
a9d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
a9e0: 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20  committed, .    
a9f0: 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e 67  ** set the chang
aa00: 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e counter. .    
aa10: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
aa20: 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e  angeCntOn && p->
aa30: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  pc>=0 ){.      i
aa40: 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75  f( !xFunc || xFu
aa50: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
aa60: 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20  CommitStmt ){.  
aa70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aa80: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
aa90: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
aaa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
aac0: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
aad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
aae0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
aaf0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
ab00: 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
ab10: 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
ab20: 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
ab30: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
ab40: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
ab50: 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
ab60: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
ab70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ab80: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
ab90: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
aba0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
abb0: 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
abc0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
abd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
abe0: 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
abf0: 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
ac00: 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
ac10: 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
ac20: 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
ac30: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
ac40: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d  ->activeVdbeCnt-
ac50: 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  -;.  }.  p->magi
ac60: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
ac70: 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
ac80: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
ac90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
aca0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  OK;.}../*.** Eac
acb0: 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
acc0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
acd0: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
ace0: 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
acf0: 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
ad00: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
ad10: 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
ad20: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
ad30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
ad40: 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
ad50: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
ad60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ad70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
ad80: 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
ad90: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
ada0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
adb0: 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
adc0: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
add0: 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
ade0: 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
adf0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
ae00: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
ae10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
ae20: 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
ae30: 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
ae40: 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
ae50: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
ae60: 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
ae70: 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
ae80: 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
ae90: 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
aea0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
aeb0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
aec0: 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
aed0: 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
aee0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
aef0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
af00: 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
af10: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
af20: 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  b;.  if( p->magi
af30: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
af40: 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56  N && p->magic!=V
af50: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
af60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
af70: 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  or(p->db, SQLITE
af80: 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20  _MISUSE, 0);.   
af90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
afa0: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 64 62 20  ISUSE;.  }.  db 
afb0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
afc0: 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
afd0: 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
afe0: 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
aff0: 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
b000: 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
b010: 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
b020: 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
b030: 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
b040: 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
b050: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
b060: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (db);.  sqlite3V
b070: 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73 71  dbeHalt(p);.  sq
b080: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
b090: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  b);..  /* If the
b0a0: 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
b0b0: 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
b0c0: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
b0d0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
b0e0: 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
b0f0: 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
b100: 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
b110: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
b120: 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
b130: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
b140: 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
b150: 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
b160: 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
b170: 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
b180: 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
b190: 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
b1a0: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
b1b0: 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
b1c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
b1d0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
b1e0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
b1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
b200: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
b210: 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
b220: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73  , SQLITE_UTF8, s
b230: 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a 20 20  qlite3FreeX);.  
b240: 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
b250: 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70  = p->rc;.      p
b260: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
b270: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
b280: 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
b290: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
b2a0: 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
b2b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
b2c0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
b2d0: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
b2e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
b2f0: 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
b300: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
b310: 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
b320: 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
b330: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
b340: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
b350: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
b360: 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
b370: 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
b380: 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
b390: 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
b3a0: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
b3b0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
b3c0: 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
b3d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
b3e0: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 7d 0a   p->rc, 0);.  }.
b3f0: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
b400: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
b410: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
b420: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
b430: 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
b440: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
b450: 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
b460: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b470: 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74   p->pTos<&p->aSt
b480: 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d  ack[p->pc<0?0:p-
b490: 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61 53 74 61  >pc] || !p->aSta
b4a0: 63 6b 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42  ck );.#ifdef VDB
b4b0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
b4c0: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
b4d0: 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
b4e0: 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
b4f0: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
b500: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
b510: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
b520: 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
b530: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
b540: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
b550: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
b560: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
b570: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
b580: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
b590: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
b5a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
b5b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
b5c0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
b5d0: 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
b5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
b5f0: 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
b600: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
b610: 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
b620: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
b630: 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
b640: 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
b650: 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
b660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b670: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
b680: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
b690: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b6a0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
b6b0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
b6c0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b6d0: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70  _MAGIC_INIT;.  p
b6e0: 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20  ->aborted = 0;. 
b6f0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
b700: 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20  TE_SCHEMA ){.   
b710: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
b720: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
b730: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
b740: 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
b750: 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
b760: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
b770: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
b780: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
b790: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
b7a0: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
b7b0: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
b7c0: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
b7d0: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
b7e0: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
b7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
b800: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
b810: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b820: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
b830: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
b840: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
b850: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
b860: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b870: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
b880: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
b890: 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
b8a0: 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c  sk)==rc );.  }el
b8b0: 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  se if( p->magic!
b8c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
b8d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b8e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
b8f0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
b900: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
b910: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b920: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
b930: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
b940: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
b950: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
b960: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
b970: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
b980: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
b990: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
b9a0: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
b9b0: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
b9c0: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
b9d0: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
b9e0: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
b9f0: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
ba00: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
ba10: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
ba20: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
ba30: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
ba40: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
ba50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
ba60: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
ba70: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
ba80: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
ba90: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
baa0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
bab0: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c  1 || !(mask&(1<<
bac0: 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
bad0: 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
bae0: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
baf0: 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
bb00: 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
bb10: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
bb20: 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
bb30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
bb40: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
bb50: 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
bb60: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
bb70: 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
bb80: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
bb90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
bba0: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66  Cleanup(p);.  if
bbb0: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
bbc0: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
bbd0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
bbe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
bbf0: 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d  t( p->db->pVdbe=
bc00: 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d  =p );.    p->db-
bc10: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
bc20: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
bc30: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
bc40: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
bc50: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
bc60: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
bc70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
bc80: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
bc90: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
bca0: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72 65 65  p[i];.      free
bcb0: 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20  P3(pOp->p3type, 
bcc0: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7d 0a  pOp->p3);.    }.
bcd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
bce0: 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ->aOp);.  }.  re
bcf0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
bd00: 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
bd10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
bd20: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  >aLabel);.  sqli
bd30: 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61 63 6b  teFree(p->aStack
bd40: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
bd50: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
bd60: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
bd70: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
bd80: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c  liteFree(p->aCol
bd90: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
bda0: 72 65 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  ree(p->zSql);.  
bdb0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
bdc0: 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71  MAGIC_DEAD;.  sq
bdd0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
bde0: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
bdf0: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
be00: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
be10: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
be20: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
be30: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
be40: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
be50: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
be60: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
be70: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
be80: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
be90: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
bea0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
beb0: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
bec0: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
bed0: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
bee0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
bef0: 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
bf00: 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
bf10: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
bf20: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
bf30: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
bf40: 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
bf50: 20 69 66 28 20 70 2d 3e 69 73 54 61 62 6c 65 20   if( p->isTable 
bf60: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
bf70: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
bf80: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
bf90: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
bfa0: 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d   0, &res);.    }
bfb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
bfc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
bfd0: 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28  eto(p->pCursor,(
bfe0: 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f  char*)&p->moveto
bff0: 54 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  Target,.        
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 36 34        sizeof(i64
c020: 29 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  ), 0, &res);.   
c030: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
c040: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a  return rc;.    *
c050: 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b  p->pIncrKey = 0;
c060: 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
c070: 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e  d = keyToInt(p->
c080: 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20  movetoTarget);. 
c090: 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
c0a0: 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20  id = res==0;.   
c0b0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
c0c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c0d0: 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75  BtreeNext(p->pCu
c0e0: 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
c0f0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
c100: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66  rn rc;.    }.#if
c110: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
c120: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
c130: 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
c140: 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
c150: 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
c160: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
c170: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
c180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c190: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c1a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
c1b0: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
c1c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c1d0: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
c1e0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
c1f0: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
c200: 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29  VdbeSerialRead()
c210: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c220: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
c230: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57  lite3VdbeSerialW
c240: 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  rite().**.** enc
c250: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
c260: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
c270: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
c280: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
c290: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
c2a0: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
c2b0: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
c2c0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
c2d0: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
c2e0: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
c2f0: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
c300: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
c310: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
c320: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
c330: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
c340: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
c350: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
c360: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
c370: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
c380: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
c390: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
c3a0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
c3b0: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
c3c0: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
c3d0: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
c3e0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
c3f0: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
c400: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
c410: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
c420: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
c430: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
c440: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
c450: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
c460: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
c470: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
c480: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
c490: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
c4a0: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
c4b0: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
c4c0: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
c4d0: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
c4e0: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
c4f0: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
c500: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
c510: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
c520: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
c530: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
c540: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
c550: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
c560: 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
c570: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
c580: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
c590: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c5a0: 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
c5d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
c5e0: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
c5f0: 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
c600: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
c610: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
c640: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
c650: 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
c670: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
c680: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
c690: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
c6a0: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
c6b0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
c6c0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
c6f0: 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
c700: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
c710: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
c720: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
c730: 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
c740: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
c750: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
c760: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
c770: 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
c780: 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
c7b0: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
c7c0: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
c7d0: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
c7e0: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
c7f0: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
c800: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
c810: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
c820: 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
c830: 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
c840: 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
c850: 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
c860: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
c870: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
c880: 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
c890: 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
c8a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
c8b0: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
c8c0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
c8d0: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
c8e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c8f0: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
c900: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
c910: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
c920: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
c930: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
c940: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
c950: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
c960: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
c970: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
c980: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
c990: 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
c9a0: 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
c9b0: 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
c9c0: 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30  ((((i64)0x000010
c9d0: 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
c9e0: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
c9f0: 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
ca00: 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
ca10: 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
ca20: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ca30: 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   8+i;.    }.    
ca40: 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69  u = i<0 ? -i : i
ca50: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  ;.    if( u<=127
ca60: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
ca70: 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
ca80: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
ca90: 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
caa0: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
cab0: 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
cac0: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
cad0: 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
cae0: 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
caf0: 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
cb00: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
cb10: 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
cb20: 20 37 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   7;.  }.  if( fl
cb30: 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
cb40: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d     int n = pMem-
cb50: 3e 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  >n;.    assert( 
cb60: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n>=0 );.    retu
cb70: 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 33 29 3b  rn ((n*2) + 13);
cb80: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
cb90: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
cba0: 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e   return (pMem->n
cbb0: 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20  *2 + 12);.  }.  
cbc0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
cbd0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
cbe0: 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
cbf0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
cc00: 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
cc10: 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69  erial-type..*/.i
cc20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
cc30: 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
cc40: 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
cc50: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
cc60: 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
cc70: 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
cc80: 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
cc90: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
cca0: 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
ccb0: 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
ccc0: 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
ccd0: 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
cce0: 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
ccf0: 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
cd00: 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
cd10: 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
cd20: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
cd30: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
cd40: 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
cd50: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
cd60: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
cd70: 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
cd80: 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
cd90: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
cda0: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
cdb0: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
cdc0: 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 6e 73  dbeSerialPut(uns
cdd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
cde0: 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
cdf0: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
ce00: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
ce10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
ce20: 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
ce30: 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e  le_format);.  in
ce40: 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  t len;..  /* Int
ce50: 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
ce60: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
ce70: 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
ce80: 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
ce90: 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  4 v;.    int i;.
cea0: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
ceb0: 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
cec0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
ced0: 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
cee0: 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
cef0: 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
cf00: 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
cf10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
cf20: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
cf30: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
cf40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
cf50: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
cf60: 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c  _type);.    whil
cf70: 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
cf80: 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46  buf[i] = (v&0xFF
cf90: 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
cfa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
cfb0: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
cfc0: 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
cfd0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
cfe0: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
cff0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64   len = sqlite3Vd
d000: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
d010: 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
d020: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
d030: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
d040: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
d050: 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
d060: 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
d070: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
d080: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
d090: 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
d0a0: 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
d0b0: 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
d0c0: 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
d0d0: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
d0e0: 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
d0f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d100: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
d110: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
d120: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
d130: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
d140: 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
d150: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
d160: 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
d170: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
d180: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
d190: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
d1a0: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
d1b0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
d1e0: 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
d1f0: 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
d200: 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
d210: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
d220: 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
d230: 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
d240: 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
d250: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
d260: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
d270: 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
d280: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
d290: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
d2a0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
d2b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d2c0: 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
d2d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
d2e0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
d2f0: 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
d300: 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
d310: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
d320: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
d330: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
d340: 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
d350: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
d360: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
d370: 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
d380: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
d390: 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
d3a0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
d3b0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
d3c0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
d3d0: 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
d3e0: 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
d3f0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
d400: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
d410: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
d420: 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
d430: 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
d440: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
d450: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
d460: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
d470: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
d480: 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
d490: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
d4a0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
d4b0: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
d4c0: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
d4d0: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
d4e0: 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
d4f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
d500: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
d510: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d520: 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
d530: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
d540: 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
d550: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
d560: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
d570: 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
d580: 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
d590: 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
d5a0: 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
d5b0: 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
d5c0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
d5d0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
d5e0: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
d5f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
d600: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
d610: 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
d620: 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
d630: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
d640: 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
d650: 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
d660: 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
d670: 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
d680: 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
d690: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
d6a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d6b0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
d6c0: 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
d6d0: 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
d6e0: 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
d6f0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
d700: 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
d710: 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
d720: 20 54 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   The byte order 
d730: 64 69 66 66 65 72 73 20 6f 6e 20 73 6f 6d 65 20  differs on some 
d740: 28 62 72 6f 6b 65 6e 29 20 61 72 63 68 69 74 65  (broken) archite
d750: 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20 2a 2f  ctures..      */
d760: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
d770: 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
d780: 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
d790: 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  32;.      static
d7a0: 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
d7b0: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 61 73   = 1.0;.      as
d7c0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
d7d0: 3d 3d 73 69 7a 65 6f 66 28 74 31 29 20 26 26 20  ==sizeof(t1) && 
d7e0: 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 31 2c  memcmp(&r1, &t1,
d7f0: 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
d800: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
d810: 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
d820: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
d830: 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
d840: 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
d850: 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
d860: 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
d870: 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
d880: 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
d890: 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
d8a0: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
d8b0: 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
d8c0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
d8d0: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
d8e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
d8f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
d900: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
d910: 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
d920: 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
d930: 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
d940: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
d950: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
d960: 29 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70  ));.        /* p
d970: 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f 75 62 6c  Mem->r = *(doubl
d980: 65 2a 29 26 78 3b 20 2a 2f 0a 20 20 20 20 20 20  e*)&x; */.      
d990: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
d9a0: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
d9b0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
d9c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d9d0: 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
d9e0: 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
d9f0: 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
da00: 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
da10: 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
da20: 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
da30: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
da40: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
da50: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
da60: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
da70: 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c  nt len = (serial
da80: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
da90: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
daa0: 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
dab0: 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20  pMem->n = len;. 
dac0: 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
dad0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
dae0: 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
daf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
db00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
db10: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
db20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db30: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
db40: 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
db50: 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  Ephem;.      }. 
db60: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b       return len;
db70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
db80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
db90: 54 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  The header of a 
dba0: 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20  record consists 
dbb0: 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20 76 61  of a sequence va
dbc0: 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e  riable-length in
dbd0: 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65  tegers..** These
dbe0: 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 61 6c   integers are al
dbf0: 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d 61 6c  most always smal
dc00: 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f 64 65  l and are encode
dc10: 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79  d as a single by
dc20: 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  te..** The follo
dc30: 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65 73  wing macro takes
dc40: 20 61 64 76 61 6e 74 61 67 65 20 74 68 69 73 20   advantage this 
dc50: 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64 65 20  fact to provide 
dc60: 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a  a fast decode.**
dc70: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 73   of the integers
dc80: 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68 65 61   in a record hea
dc90: 64 65 72 2e 20 20 49 74 20 69 73 20 66 61 73 74  der.  It is fast
dca0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
dcb0: 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20  n case.** where 
dcc0: 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 61  the integer is a
dcd0: 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20 20 49   single byte.  I
dce0: 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73 6c  t is a little sl
dcf0: 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a  ower when the.**
dd00: 20 69 6e 74 65 67 65 72 20 69 73 20 74 77 6f 20   integer is two 
dd10: 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e 20 20  or more bytes.  
dd20: 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74 20 69  But overall it i
dd30: 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
dd40: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  The following ex
dd50: 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65 71  pressions are eq
dd60: 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20  uivalent:.**.** 
dd70: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 47      x = sqlite3G
dd80: 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c 20 26  etVarint32( A, &
dd90: 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78  B );.**.**     x
dda0: 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20 41 2c   = GetVarint( A,
ddb0: 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66   B );.**.*/.#def
ddc0: 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28 41 2c  ine GetVarint(A,
ddd0: 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29 29 3c  B)  ((B = *(A))<
dde0: 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71 6c 69  =0x7f ? 1 : sqli
ddf0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 41  te3GetVarint32(A
de00: 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  , &B))../*.** Th
de10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
de20: 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
de30: 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
de40: 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66 69   records specifi
de50: 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31  ed by .** {nKey1
de60: 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b  , pKey1} and {nK
de70: 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74  ey2, pKey2}, ret
de80: 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76  urning a negativ
de90: 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
dea0: 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
deb0: 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  f {nKey1, pKey1}
dec0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
ded0: 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
dee0: 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65  reater than {nKe
def0: 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74  y2, pKey2}.  Bot
df00: 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  h Key1 and Key2 
df10: 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74 72  must be byte str
df20: 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64  ings.** composed
df30: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
df40: 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
df50: 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74  the VDBE..*/.int
df60: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
df70: 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69  rdCompare(.  voi
df80: 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69  d *userData,.  i
df90: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
dfa0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20  void *pKey1, .  
dfb0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
dfc0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
dfd0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
dfe0: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
dff0: 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20  userData;.  u32 
e000: 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20  d1, d2;         
e010: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
e020: 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
e030: 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
e040: 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b   u32 idx1, idx2;
e050: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
e060: 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
e070: 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
e080: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
e090: 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20  r1, szHdr2;  /* 
e0a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
e0b0: 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
e0c0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
e0d0: 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63  nField;.  int rc
e0e0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
e0f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
e100: 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
e110: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
e120: 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  1;.  const unsig
e130: 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20  ned char *aKey2 
e140: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
e150: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a  d char *)pKey2;.
e160: 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d  .  Mem mem1;.  M
e170: 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e  em mem2;.  mem1.
e180: 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
e190: 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20  enc;.  mem2.enc 
e1a0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
e1b0: 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74  .  .  idx1 = Get
e1c0: 56 61 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a  Varint(aKey1, sz
e1d0: 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
e1e0: 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47  Hdr1;.  idx2 = G
e1f0: 65 74 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20  etVarint(aKey2, 
e200: 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20  szHdr2);.  d2 = 
e210: 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64  szHdr2;.  nField
e220: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
e230: 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  eld;.  while( id
e240: 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78  x1<szHdr1 && idx
e250: 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20  2<szHdr2 ){.    
e260: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
e270: 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  ;.    u32 serial
e280: 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20  _type2;..    /* 
e290: 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
e2a0: 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
e2b0: 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
e2c0: 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
e2d0: 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74  dx1 += GetVarint
e2e0: 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
e2f0: 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20  rial_type1 );.  
e300: 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
e310: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
e320: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
e330: 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
e340: 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d  eak;.    idx2 +=
e350: 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79   GetVarint( aKey
e360: 32 2b 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74  2+idx2, serial_t
e370: 79 70 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ype2 );.    if( 
e380: 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c  d2>=nKey2 && sql
e390: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
e3a0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
e3b0: 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e2)>0 ) break;..
e3c0: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
e3d0: 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
e3e0: 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
e3f0: 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
e400: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
e410: 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
e420: 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
e430: 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69  ;.    d2 += sqli
e440: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
e450: 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72  (&aKey2[d2], ser
e460: 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32  ial_type2, &mem2
e470: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
e480: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
e490: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
e4a0: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
e4b0: 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e  mem1, &mem2, i<n
e4c0: 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f  Field ? pKeyInfo
e4d0: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b  ->aColl[i] : 0);
e4e0: 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c  .    if( mem1.fl
e4f0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20  ags & MEM_Dyn ) 
e500: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
e510: 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20  lease(&mem1);.  
e520: 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73    if( mem2.flags
e530: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c   & MEM_Dyn ) sql
e540: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
e550: 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69  se(&mem2);.    i
e560: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
e570: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e580: 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
e590: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  * One of the key
e5a0: 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
e5b0: 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  lds, but all the
e5c0: 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
e5d0: 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65  at point.  ** we
e5e0: 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
e5f0: 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73   incrKey flag is
e600: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
e610: 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20  second key is.  
e620: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61  ** treated as la
e630: 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rger..  */.  if(
e640: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
e650: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72  ( pKeyInfo->incr
e660: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
e670: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
e680: 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a  if( d1<nKey1 ){.
e690: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
e6a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c 6e    }else if( d2<n
e6b0: 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20 72 63  Key2 ){.      rc
e6c0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
e6d0: 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
e6e0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
e6f0: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
e700: 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
e710: 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
e720: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
e730: 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
e740: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
e750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
e760: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64  gument is an ind
e770: 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65  ex entry compose
e780: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
e790: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
e7a0: 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e  ..** The last en
e7b0: 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f  try in this reco
e7c0: 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  rd should be an 
e7d0: 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69  integer (specifi
e7e0: 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  cally.** an inte
e7f0: 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69  ger rowid).  Thi
e800: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
e810: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
e820: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74  bytes in.** that
e830: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74   integer..*/.int
e840: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
e850: 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38  owidLen(const u8
e860: 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73   *aKey){.  u32 s
e870: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
e880: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
e890: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
e8a0: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
e8b0: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
e8c0: 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69  rowid */..  sqli
e8d0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61  te3GetVarint32(a
e8e0: 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  Key, &szHdr);.  
e8f0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
e900: 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31  32(&aKey[szHdr-1
e910: 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
e920: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e930: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
e940: 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a  n(typeRowid);.}.
e950: 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70    ../*.** pCur p
e960: 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
e970: 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
e980: 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
e990: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
e9a0: 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
e9b0: 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
e9c0: 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
e9d0: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
e9e0: 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
e9f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
ea00: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
ea10: 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
ea20: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
ea30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
ea40: 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f  IdxRowid(BtCurso
ea50: 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
ea60: 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
ea70: 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lKey;.  int rc;.
ea80: 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
ea90: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
eaa0: 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
eab0: 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
eac0: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
ead0: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
eae0: 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
eaf0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
eb00: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
eb10: 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74  m m, v;..  sqlit
eb20: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
eb30: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
eb40: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
eb50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
eb60: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eb70: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
eb80: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
eb90: 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
eba0: 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  , nCellKey, 1, &
ebb0: 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
ebc0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ebd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56   }.  sqlite3GetV
ebe0: 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
ebf0: 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c  , &szHdr);.  sql
ec00: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
ec10: 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
ec20: 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b  1], &typeRowid);
ec30: 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
ec40: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
ec50: 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
ec60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ec70: 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
ec80: 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
ec90: 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
eca0: 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
ecb0: 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
ecc0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
ecd0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ece0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
ecf0: 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
ed00: 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
ed10: 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
ed20: 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61   is point to aga
ed30: 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
ed40: 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28  string in pKey (
ed50: 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e  of length nKey).
ed60: 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
ed70: 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
ed80: 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
ed90: 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
eda0: 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
edb0: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
edc0: 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
edd0: 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72  han pKey.  Retur
ede0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
edf0: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b  uccess..**.** pK
ee00: 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ey is either cre
ee10: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
ee20: 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
ee30: 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
ee40: 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
ee50: 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
ee60: 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
ee70: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
ee80: 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
ee90: 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a  nored as well..*
eea0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
eeb0: 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
eec0: 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20    Cursor *pC,   
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eee0: 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
eef0: 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
ef00: 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  /.  int nKey, co
ef10: 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20  nst u8 *pKey,   
ef20: 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f  /* The key to co
ef30: 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  mpare */.  int *
ef40: 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
ef50: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ef60: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
ef70: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
ef80: 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b  .  i64 nCellKey;
ef90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
efa0: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
efb0: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ->pCursor;.  int
efc0: 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d   lenRowid;.  Mem
efd0: 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   m;..  sqlite3Bt
efe0: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
eff0: 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69   &nCellKey);.  i
f000: 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29  f( nCellKey<=0 )
f010: 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
f020: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f030: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
f040: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
f050: 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
f060: 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  rsor, 0, nCellKe
f070: 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
f080: 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
f090: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  n rc;.  }.  lenR
f0a0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
f0b0: 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75  beIdxRowidLen((u
f0c0: 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20  8*)m.z);.  *res 
f0d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
f0e0: 6f 72 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70  ordCompare(pC->p
f0f0: 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e  KeyInfo, m.n-len
f100: 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79  Rowid, m.z, nKey
f110: 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  , pKey);.  sqlit
f120: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
f130: 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
f140: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f150: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f160: 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
f170: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
f180: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
f190: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
f1a0: 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
f1b0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
f1c0: 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
f1d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
f1e0: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
f1f0: 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
f200: 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
f210: 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
f220: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
f230: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
f240: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
f250: 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
f260: 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
f270: 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
f280: 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
f290: 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
f2a0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
f2b0: 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
f2c0: 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
f2d0: 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
f2e0: 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
f2f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
f300: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
f310: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f320: 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
f330: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
f340: 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
f350: 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
f360: 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
f370: 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
f380: 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
f390: 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
f3a0: 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
f3b0: 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
f3c0: 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
f3d0: 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
f3e0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
f3f0: 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
f400: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
f410: 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
f420: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
f430: 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
f440: 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
f450: 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
f460: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
f470: 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
f480: 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
f490: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
f4a0: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
f4b0: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
f4c0: 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
f4d0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
f4e0: 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
f4f0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
f500: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
f510: 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
f520: 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
f530: 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
f540: 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
f550: 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
f560: 64 62 3b 0a 7d 0a                                db;.}.