/ Hex Artifact Content
Login

Artifact 8e6dbe3dac3bdd7d37c87ba553059b5251ba07e5:


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 23 69 66 64 65  = nTmp;.}..#ifde
0830: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0840: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0850: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0860: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0870: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0880: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0890: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
08a0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
08b0: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
08c0: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
08d0: 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  t it contains at
08e0: 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d   least N.** elem
08f0: 65 6e 74 73 2e 20 49 66 20 74 68 65 20 56 64 62  ents. If the Vdb
0900: 65 20 69 73 20 69 6e 20 56 44 42 45 5f 4d 41 47  e is in VDBE_MAG
0910: 49 43 5f 52 55 4e 20 73 74 61 74 65 2c 20 74 68  IC_RUN state, th
0920: 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 61  en.** the Vdbe.a
0930: 4f 70 20 61 72 72 61 79 20 77 69 6c 6c 20 62 65  Op array will be
0940: 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e 74 61 69   sized to contai
0950: 6e 20 65 78 61 63 74 6c 79 20 4e 0a 2a 2a 20 65  n exactly N.** e
0960: 6c 65 6d 65 6e 74 73 2e 20 56 64 62 65 2e 6e 4f  lements. Vdbe.nO
0970: 70 41 6c 6c 6f 63 20 69 73 20 73 65 74 20 74 6f  pAlloc is set to
0980: 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
0990: 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
09a0: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  array..**.** If 
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09e0: 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64 62 65 2e   array,.** Vdbe.
09f0: 61 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70  aOp and Vdbe.nOp
0a00: 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 75 6e 63  Alloc remain unc
0a10: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
0a20: 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e 79 20 6f  so that.** any o
0a30: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a40: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a50: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0a60: 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
0a70: 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ith the rest of 
0a80: 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74  the Vdbe)..*/.st
0a90: 61 74 69 63 20 76 6f 69 64 20 72 65 73 69 7a 65  atic void resize
0aa0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
0ab0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72   int N){.  int r
0ac0: 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d 61 67 69  unMode = p->magi
0ad0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
0ae0: 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d 6f 64 65  N;.  if( runMode
0af0: 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c   || p->nOpAlloc<
0b00: 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  N ){.    VdbeOp 
0b10: 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
0b20: 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30 2a 28 21  New = N + 100*(!
0b30: 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e  runMode);.    in
0b40: 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e  t oldSize = p->n
0b50: 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e 65  OpAlloc;.    pNe
0b60: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
0b70: 63 28 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  c(p->aOp, nNew*s
0b80: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20  izeof(Op));.    
0b90: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0ba0: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0bb0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nNew;.      p->a
0bc0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  Op = pNew;.     
0bd0: 20 69 66 28 20 6e 4e 65 77 3e 6f 6c 64 53 69 7a   if( nNew>oldSiz
0be0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
0bf0: 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53  set(&p->aOp[oldS
0c00: 69 7a 65 5d 2c 20 30 2c 20 28 6e 4e 65 77 2d 6f  ize], 0, (nNew-o
0c10: 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f  ldSize)*sizeof(O
0c20: 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p));.      }.   
0c30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
0c40: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75  Add a new instru
0c50: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73  ction to the lis
0c60: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
0c70: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65  s current in the
0c80: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72  .** VDBE.  Retur
0c90: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
0ca0: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
0cb0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  tion..**.** Para
0cc0: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  meters:.**.**   
0cd0: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20   p              
0ce0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
0cf0: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70  VDBE.**.**    op
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
0d10: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69  e opcode for thi
0d20: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
0d30: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20  .**    p1, p2   
0d40: 20 20 20 20 20 20 20 46 69 72 73 74 20 74 77 6f         First two
0d50: 20 6f 66 20 74 68 65 20 74 68 72 65 65 20 70 6f   of the three po
0d60: 73 73 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e  ssible operands.
0d70: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
0d80: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
0d90: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
0da0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
0db0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
0dc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
0dd0: 50 33 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P3() function to
0de0: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
0df0: 65 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f  e of the P3.** o
0e00: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73  perand..*/.int s
0e10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0e20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0e30: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
0e40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0e50: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
0e60: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
0e70: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
0e80: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
0e90: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0ea0: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69  c<=i ){.    resi
0eb0: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31  zeOpArray(p, i+1
0ec0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
0ed0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
0ee0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0ef0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0f00: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
0f10: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0f20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70  pOp->opcode = op
0f30: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
0f40: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
0f50: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b  ;.  pOp->p3 = 0;
0f60: 0a 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d  .  pOp->p3type =
0f70: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P3_NOTUSED;.  p
0f80: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23  ->expired = 0;.#
0f90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
0fa0: 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  UG.  if( sqlite3
0fb0: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0fc0: 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 50  e ) sqlite3VdbeP
0fd0: 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d  rintOp(0, i, &p-
0fe0: 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66  >aOp[i]);.#endif
0ff0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
1000: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1010: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1020: 73 20 74 68 65 20 70 33 20 76 61 6c 75 65 2e 0a  s the p3 value..
1030: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1040: 62 65 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  beOp3(Vdbe *p, i
1050: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1060: 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63 68 61  nt p2, const cha
1070: 72 20 2a 7a 50 33 2c 69 6e 74 20 70 33 74 79 70  r *zP3,int p3typ
1080: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  e){.  int addr =
1090: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a0: 70 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29  p(p, op, p1, p2)
10b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
10c0: 68 61 6e 67 65 50 33 28 70 2c 20 61 64 64 72 2c  hangeP3(p, addr,
10d0: 20 7a 50 33 2c 20 70 33 74 79 70 65 29 3b 0a 20   zP3, p3type);. 
10e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
10f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1100: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
1110: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
1120: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
1130: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
1140: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1150: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1160: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1170: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
1180: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
1190: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
11a0: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
11b0: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
11c0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
11d0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
11e0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
11f0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1200: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1210: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1220: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1230: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1240: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1250: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1260: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1270: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1280: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
1290: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
12a0: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
12b0: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
12c0: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
12d0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
12e0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
12f0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1300: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1310: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1320: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1330: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1340: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1350: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1360: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1370: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1380: 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  bel(Vdbe *p){.  
1390: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e  int i;.  i = p->
13a0: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
13b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
13c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
13d0: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61  .  if( i>=p->nLa
13e0: 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  belAlloc ){.    
13f0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
1400: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
1410: 32 20 2b 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61  2 + 10;.    p->a
1420: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 52 65  Label = sqliteRe
1430: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 61  allocOrFree(p->a
1440: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c             p->nL
1470: 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  abelAlloc*sizeof
1480: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
1490: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
14a0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
14b0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
14c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69   }.  return -1-i
14d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
14e0: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
14f0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
1500: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
1510: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
1520: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
1530: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
1540: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1550: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
1560: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
1570: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1580: 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  l()..*/.void sql
1590: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15a0: 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e  abel(Vdbe *p, in
15b0: 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20  t x){.  int j = 
15c0: 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20  -1-x;.  assert( 
15d0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15e0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
15f0: 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a  ssert( j>=0 && j
1600: 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  <p->nLabel );.  
1610: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1620: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a  .    p->aLabel[j
1630: 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a  ] = p->nOp;.  }.
1640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1650: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70 63 6f  non-zero if opco
1660: 64 65 20 27 6f 70 27 20 69 73 20 67 75 61 72 65  de 'op' is guare
1670: 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70 75 73  nteed not to pus
1680: 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a 2a 2a  h more values.**
1690: 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45 20 73   onto the VDBE s
16a0: 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70 6f 70  tack than it pop
16b0: 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  s off..*/.static
16c0: 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50 75 73   int opcodeNoPus
16d0: 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a 20 54  h(u8 op){.  /* T
16e0: 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d 41 53  he 10 NOPUSH_MAS
16f0: 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  K_n constants ar
1700: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  e defined in the
1710: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
1720: 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 68 65   ** generated he
1730: 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f 64 65  ader file opcode
1740: 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61 20 31  s.h. Each is a 1
1750: 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c 20 6f  6-bit bitmask, o
1760: 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f 72 72  ne.  ** bit corr
1770: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 61 63  esponding to eac
1780: 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65 6d 65  h opcode impleme
1790: 6e 74 65 64 20 62 79 20 74 68 65 20 76 69 72 74  nted by the virt
17a0: 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69 6e 65  ual.  ** machine
17b0: 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68 65 20   in vdbe.c. The 
17c0: 62 69 74 20 69 73 20 74 72 75 65 20 69 66 20 74  bit is true if t
17d0: 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75 73 68  he word "no-push
17e0: 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a 20 69  " appears.  ** i
17f0: 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  n a comment on t
1800: 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61 73 20  he same line as 
1810: 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58 58 58  the "case OP_XXX
1820: 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71 6c 69  :" in .  ** sqli
1830: 74 65 33 56 64 62 65 45 78 65 63 28 29 20 69 6e  te3VdbeExec() in
1840: 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a 20 20   vdbe.c..  **.  
1850: 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20 69 73  ** If the bit is
1860: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
1870: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70  corresponding op
1880: 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e 74 65  code is guarente
1890: 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f 20 67  ed not.  ** to g
18a0: 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20 77 68  row the stack wh
18b0: 65 6e 20 69 74 20 69 73 20 65 78 65 63 75 74 65  en it is execute
18c0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
18d0: 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a 20 20   may grow the.  
18e0: 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74 20 6d  ** stack by at m
18f0: 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e 0a 20  ost one entry.. 
1900: 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53 48 5f   **.  ** NOPUSH_
1910: 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70 6f 6e  MASK_0 correspon
1920: 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20 30 20  ds to opcodes 0 
1930: 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f 4d 41  to 15. NOPUSH_MA
1940: 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a 20 20  SK_1 contains.  
1950: 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 6f  ** one bit for o
1960: 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33 31 2c  pcodes 16 to 31,
1970: 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20 2a 2a   and so on..  **
1980: 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62 69 74  .  ** 16-bit bit
1990: 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20 74 68  masks (rather th
19a0: 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65 20 73  an 32-bit) are s
19b0: 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70 63 6f  pecified in opco
19c0: 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65 63 61  des.h .  ** beca
19d0: 75 73 65 20 74 68 65 20 66 69 6c 65 20 69 73 20  use the file is 
19e0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
19f0: 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41 77 6b  awk program. Awk
1a00: 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20 20 2a   manipulates.  *
1a10: 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20 61 73  * all numbers as
1a20: 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20   floating-point 
1a30: 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77 61 6e  and we don't wan
1a40: 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f 75 6e  t to risk a roun
1a50: 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 20  ding.  ** error 
1a60: 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69 6c 64  if someone build
1a70: 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20 74 68  s with an awk th
1a80: 61 74 20 75 73 65 73 20 28 66 6f 72 20 65 78 61  at uses (for exa
1a90: 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a 20 20  mple) 32-bit .  
1aa0: 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73 2e 0a  ** IEEE floats..
1ab0: 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63 20 63    */ .  static c
1ac0: 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73 5b 35  onst u32 masks[5
1ad0: 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55 53 48  ] = {.    NOPUSH
1ae0: 5f 4d 41 53 4b 5f 30 20 2b 20 28 28 28 75 6e 73  _MASK_0 + (((uns
1af0: 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53  igned)NOPUSH_MAS
1b00: 4b 5f 31 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e  K_1)<<16),.    N
1b10: 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20 2b 20 28  OPUSH_MASK_2 + (
1b20: 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53  ((unsigned)NOPUS
1b30: 48 5f 4d 41 53 4b 5f 33 29 3c 3c 31 36 29 2c 0a  H_MASK_3)<<16),.
1b40: 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f      NOPUSH_MASK_
1b50: 34 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29  4 + (((unsigned)
1b60: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 29 3c 3c  NOPUSH_MASK_5)<<
1b70: 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f  16),.    NOPUSH_
1b80: 4d 41 53 4b 5f 36 20 2b 20 28 28 28 75 6e 73 69  MASK_6 + (((unsi
1b90: 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b  gned)NOPUSH_MASK
1ba0: 5f 37 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f  _7)<<16),.    NO
1bb0: 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20 28 28  PUSH_MASK_8 + ((
1bc0: 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48  (unsigned)NOPUSH
1bd0: 5f 4d 41 53 4b 5f 39 29 3c 3c 31 36 29 0a 20 20  _MASK_9)<<16).  
1be0: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3c  };.  assert( op<
1bf0: 33 32 2a 35 20 29 3b 0a 20 20 72 65 74 75 72 6e  32*5 );.  return
1c00: 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d 20 26   (masks[op>>5] &
1c10: 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29 29 29   (1<<(op&0x1F)))
1c20: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1c30: 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  BUG.int sqlite3V
1c40: 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73 68 28  dbeOpcodeNoPush(
1c50: 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  u8 op){.  return
1c60: 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70   opcodeNoPush(op
1c70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1c80: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
1c90: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
1ca0: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
1cb0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
1cc0: 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73 75 63  ive..** Each suc
1cd0: 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  h value is a lab
1ce0: 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65  el.  Resolve the
1cf0: 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e   label by settin
1d00: 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61 6c 75  g the P2.** valu
1d10: 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  e to its correct
1d20: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
1d30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
1d50: 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ce after all opc
1d60: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
1d70: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56  nserted..**.** V
1d80: 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e  ariable *pMaxFun
1d90: 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20  cArgs is set to 
1da0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  the maximum valu
1db0: 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75  e of any P2 argu
1dc0: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f  ment .** to an O
1dd0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41  P_Function, OP_A
1de0: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69  ggStep or OP_VFi
1df0: 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69  lter opcode. Thi
1e00: 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  s is used by .**
1e10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1e20: 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20  Ready() to size 
1e30: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
1e40: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   array..**.** Th
1e50: 65 20 69 6e 74 65 67 65 72 20 2a 70 4d 61 78 53  e integer *pMaxS
1e60: 74 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 74  tack is set to t
1e70: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
1e80: 72 20 6f 66 20 76 64 62 65 20 73 74 61 63 6b 0a  r of vdbe stack.
1e90: 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ** entries that 
1ea0: 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20  static analysis 
1eb0: 72 65 76 65 61 6c 73 20 74 68 69 73 20 70 72 6f  reveals this pro
1ec0: 67 72 61 6d 20 6d 69 67 68 74 20 6e 65 65 64 2e  gram might need.
1ed0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ee0: 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68  ine also does th
1ef0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69  e following opti
1f00: 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63  mization:  It sc
1f10: 61 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c 74 20  ans for.** Halt 
1f20: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65  instructions whe
1f30: 72 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  re P1==SQLITE_CO
1f40: 4e 53 54 52 41 49 4e 54 20 6f 72 20 50 32 3d 3d  NSTRAINT or P2==
1f50: 4f 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f 72 0a  OE_Abort or for.
1f60: 2a 2a 20 49 64 78 49 6e 73 65 72 74 20 69 6e 73  ** IdxInsert ins
1f70: 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72 65 20  tructions where 
1f80: 50 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20 73 75  P2!=0.  If no su
1f90: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
1fa0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 6e  s.** found, then
1fb0: 20 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74   every Statement
1fc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1fd0: 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f  changed to a Noo
1fe0: 70 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73 20 77  p.  In.** this w
1ff0: 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65  ay, we avoid cre
2000: 61 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  ating the statem
2010: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
2020: 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e 0a   unnecessarily..
2030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2040: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
2050: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
2060: 78 46 75 6e 63 41 72 67 73 2c 20 69 6e 74 20 2a  xFuncArgs, int *
2070: 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20 69 6e  pMaxStack){.  in
2080: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
2090: 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  rgs = 0;.  int n
20a0: 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e 6e 4f  MaxStack = p->nO
20b0: 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  p;.  Op *pOp;.  
20c0: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
20d0: 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64  >aLabel;.  int d
20e0: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
20f0: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  back = 0;.  int 
2100: 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69  hasStatementBegi
2110: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70  n = 0;.  for(pOp
2120: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2130: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2140: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  pOp++){.    u8 o
2150: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2160: 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70  ode;..    if( op
2170: 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f  code==OP_Functio
2180: 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  n || opcode==OP_
2190: 41 67 67 53 74 65 70 20 0a 23 69 66 6e 64 65 66  AggStep .#ifndef
21a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
21b0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
21c0: 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f    || opcode==OP_
21d0: 56 55 70 64 61 74 65 0a 23 65 6e 64 69 66 0a 20  VUpdate.#endif. 
21e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
21f0: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
2200: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2210: 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20  p->p2;.    }.   
2220: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2230: 48 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66  Halt ){.      if
2240: 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54  ( pOp->p1==SQLIT
2250: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2260: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
2270: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65  t ){.        doe
2280: 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61  sStatementRollba
2290: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
22a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
22b0: 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65  code==OP_Stateme
22c0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53  nt ){.      hasS
22d0: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20  tatementBegin = 
22e0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
22f0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2300: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
2310: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
2320: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
2330: 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20  OP_VRename ){.  
2340: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
2350: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
2360: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2370: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
2380: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
2390: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
23a0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
23b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23c0: 4f 70 5b 2d 32 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-2].opcode==O
23d0: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
23e0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 32 5d 2e 70     n = pOp[-2].p
23f0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
2400: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2410: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
2420: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
2430: 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65  odeNoPush(opcode
2440: 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53  ) ){.      nMaxS
2450: 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20  tack--;.    }.. 
2460: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d     if( pOp->p2>=
2470: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2480: 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70    assert( -1-pOp
2490: 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  ->p2<p->nLabel )
24a0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20  ;.    pOp->p2 = 
24b0: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
24c0: 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2];.  }.  sqlite
24d0: 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  Free(p->aLabel);
24e0: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
24f0: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
2500: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
2510: 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d   *pMaxStack = nM
2520: 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49  axStack;..  /* I
2530: 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62  f we never rollb
2540: 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ack a statement 
2550: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2560: 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  n statement.  **
2570: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
2580: 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  e not needed.  S
2590: 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f  o change every O
25a0: 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  P_Statement.  **
25b0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20   opcode into an 
25c0: 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61  OP_Noop.  This a
25d0: 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73  void a call to s
25e0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
25f0: 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69  usive().  ** whi
2600: 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73  ch can be expens
2610: 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74  ive on some plat
2620: 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  forms..  */.  if
2630: 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  ( hasStatementBe
2640: 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74  gin && !doesStat
2650: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b  ementRollback ){
2660: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  .    for(pOp=p->
2670: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
2680: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
2690: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
26a0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  p->opcode==OP_St
26b0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
26c0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
26d0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
26e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
26f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2700: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
2710: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
2720: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
2730: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2740: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
2750: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
2760: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
2770: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2780: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
2790: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
27a0: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
27b0: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
27c0: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
27d0: 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   Return the.** a
27e0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
27f0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64  rst operation ad
2800: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
2810: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
2820: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f  (Vdbe *p, int nO
2830: 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  p, VdbeOpList co
2840: 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74  nst *aOp){.  int
2850: 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28   addr;.  assert(
2860: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2870: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2880: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
2890: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29 3b 0a   p->nOp + nOp);.
28a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
28b0: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
28c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
28d0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
28e0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b  ;.  if( nOp>0 ){
28f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2900: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
2910: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
2920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
2930: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
2940: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
2950: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
2960: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
2970: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
2980: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
2990: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
29a0: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
29b0: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 70 4f  In->p1;.      pO
29c0: 75 74 2d 3e 70 32 20 3d 20 70 32 3c 30 20 3f 20  ut->p2 = p2<0 ? 
29d0: 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 20  addr + ADDR(p2) 
29e0: 3a 20 70 32 3b 0a 20 20 20 20 20 20 70 4f 75 74  : p2;.      pOut
29f0: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
2a00: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 74 79        pOut->p3ty
2a10: 70 65 20 3d 20 70 49 6e 2d 3e 70 33 20 3f 20 50  pe = pIn->p3 ? P
2a20: 33 5f 53 54 41 54 49 43 20 3a 20 50 33 5f 4e 4f  3_STATIC : P3_NO
2a30: 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51  TUSED;.#ifdef SQ
2a40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
2a50: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62   if( sqlite3_vdb
2a60: 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b  e_addop_trace ){
2a70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a80: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
2a90: 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69  +addr, &p->aOp[i
2aa0: 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d  +addr]);.      }
2ab0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2ac0: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
2ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
2ae0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dr;.}../*.** Cha
2af0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2b00: 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   the P1 operand 
2b10: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2b20: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
2b30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2b40: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
2b50: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
2b60: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
2b70: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
2b80: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
2b90: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
2ba0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
2bb0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
2bc0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
2bd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2be0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
2bf0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2c00: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2c10: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2c20: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2c30: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2c40: 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20  p && addr>=0 && 
2c50: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70  p->nOp>addr && p
2c60: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->aOp ){.    p->
2c70: 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76  aOp[addr].p1 = v
2c80: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2c90: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2ca0: 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72  e of the P2 oper
2cb0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
2cc0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
2cd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ce0: 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  is useful for se
2cf0: 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73  tting a jump des
2d00: 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  tination..*/.voi
2d10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2d20: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69  ngeP2(Vdbe *p, i
2d30: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
2d40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c  ){.  assert( val
2d50: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
2d60: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2d70: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2d80: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2d90: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2da0: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2db0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2dc0: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
2dd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2de0: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
2df0: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
2e00: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
2e10: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
2e20: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2e30: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2e40: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
2e50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2e60: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
2e70: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
2e80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e90: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
2ea0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
2eb0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
2ec0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
2ed0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
2ee0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
2ef0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
2f00: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
2f10: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
2f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f30: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
2f40: 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a  nction(FuncDef *
2f50: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65  pDef){.  if( pDe
2f60: 66 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  f && (pDef->flag
2f70: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2f80: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
2f90: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 65 66   sqliteFree(pDef
2fa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2fb0: 44 65 6c 65 74 65 20 61 20 50 33 20 76 61 6c 75  Delete a P3 valu
2fc0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
2fd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2fe0: 72 65 65 50 33 28 69 6e 74 20 70 33 74 79 70 65  reeP3(int p3type
2ff0: 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69  , void *p3){.  i
3000: 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69  f( p3 ){.    swi
3010: 74 63 68 28 20 70 33 74 79 70 65 20 29 7b 0a 20  tch( p3type ){. 
3020: 20 20 20 20 20 63 61 73 65 20 50 33 5f 44 59 4e       case P3_DYN
3030: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
3040: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P3_KEYINFO:.   
3050: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
3060: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
3070: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3080: 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p3);.        br
3090: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
30a0: 20 20 20 63 61 73 65 20 50 33 5f 4d 50 52 49 4e     case P3_MPRIN
30b0: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  TF: {.        sq
30c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b 0a  lite3_free(p3);.
30d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
30f0: 65 20 50 33 5f 56 44 42 45 46 55 4e 43 3a 20 7b  e P3_VDBEFUNC: {
3100: 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e  .        VdbeFun
3110: 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28  c *pVdbeFunc = (
3120: 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20  VdbeFunc *)p3;. 
3130: 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d         freeEphem
3140: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70 56 64  eralFunction(pVd
3150: 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a  beFunc->pFunc);.
3160: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3170: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
3180: 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a  (pVdbeFunc, 0);.
3190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
31a0: 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20  ee(pVdbeFunc);. 
31b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
31c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
31d0: 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P3_FUNCDEF: {. 
31e0: 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d         freeEphem
31f0: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75  eralFunction((Fu
3200: 6e 63 44 65 66 2a 29 70 33 29 3b 0a 20 20 20 20  ncDef*)p3);.    
3210: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3220: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33   }.      case P3
3230: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20  _MEM: {.        
3240: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
3250: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
3260: 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p3);.        br
3270: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3280: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
3290: 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65   Change N opcode
32a0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64  s starting at ad
32b0: 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f  dr to No-ops..*/
32c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
32d0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
32e0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
32f0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
3300: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
3310: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3320: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3330: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b     while( N-- ){
3340: 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 70 4f  .      freeP3(pO
3350: 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p3type, pOp->
3360: 70 33 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  p3);.      memse
3370: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
3380: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20  (pOp[0]));.     
3390: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
33a0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f  P_Noop;.      pO
33b0: 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p++;.    }.  }.}
33c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
33d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
33e0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
33f0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3400: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3410: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3420: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3430: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3440: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3450: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3460: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3470: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3480: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3490: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
34a0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
34b0: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
34c0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 69  the P3 operand i
34d0: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
34e0: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
34f0: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
3500: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
3510: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
3520: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
3530: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
3540: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
3550: 62 79 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20  bytes of zP3 up 
3560: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
3570: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
3580: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
3590: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
35a0: 79 74 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a  ytes of zP3..**.
35b0: 2a 2a 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49  ** If n==P3_KEYI
35c0: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
35d0: 74 20 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74  t zP3 is a point
35e0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
35f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
3600: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
3610: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
3620: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
3630: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
3640: 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2c  ** sqliteMalloc,
3650: 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65   to be freed whe
3660: 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69  n the Vdbe is fi
3670: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50  nalized..** n==P
3680: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
3690: 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  F indicates that
36a0: 20 7a 50 33 20 70 6f 69 6e 74 73 20 74 6f 20 61   zP3 points to a
36b0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
36c0: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
36d0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20  memory that the 
36e0: 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69  caller has obtai
36f0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
3700: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
3710: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
3720: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
3730: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
3740: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3750: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3760: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3770: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3780: 50 33 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f  P3_STATIC, P3_CO
3790: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
37a0: 63 61 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f  cate that zP3 po
37b0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
37c0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
37d0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
37e0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
37f0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3800: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
3810: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
3820: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
3830: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
3840: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3850: 63 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65  change P3 on the
3860: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3870: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3880: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3890: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
38a0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
38b0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
38c0: 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP3, int n){.  O
38d0: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
38e0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
38f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3900: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
3910: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
3920: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
3930: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 69  ailed() ){.    i
3940: 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e  f (n != P3_KEYIN
3950: 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  FO) {.      free
3960: 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  P3(n, (void*)*(c
3970: 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20  har**)&zP3);.   
3980: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
3990: 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20   }.  if( addr<0 
39a0: 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20  || addr>=p->nOp 
39b0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
39c0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
39d0: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
39e0: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
39f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3a00: 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79  freeP3(pOp->p3ty
3a10: 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  pe, pOp->p3);.  
3a20: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 69  pOp->p3 = 0;.  i
3a30: 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20  f( zP3==0 ){.   
3a40: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3a50: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3a60: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P3_NOTUSED;.  }e
3a70: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
3a80: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
3a90: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
3aa0: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
3ab0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
3ac0: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
3ad0: 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP3)->nField;.  
3ae0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
3af0: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
3b00: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
3b10: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3b20: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
3b30: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
3b40: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
3b50: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
3b60: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
3b70: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3b80: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3b90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3ba0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3bb0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3bc0: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
3bd0: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3be0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3bf0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3c00: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3c10: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3c20: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
3c30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3c40: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3c50: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
3c60: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3c70: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
3c80: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3c90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3ca0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3cb0: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
3cc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 2d  else{.      pOp-
3cd0: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  >p3type = P3_NOT
3ce0: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
3cf0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
3d00: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
3d10: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28  .    pOp->p3 = (
3d20: 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70  char*)zP3;.    p
3d30: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
3d40: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
3d50: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
3d60: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a  pOp->p3 = (char*
3d70: 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP3;.    pOp->p
3d80: 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c  3type = n;.  }el
3d90: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  se{.    if( n==0
3da0: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50   ) n = strlen(zP
3db0: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20  3);.    pOp->p3 
3dc0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
3dd0: 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP3, n);.    pOp
3de0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
3df0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
3e00: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3e10: 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 50  ** Replace the P
3e20: 33 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  3 field of the m
3e30: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
3e40: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  ed instruction w
3e50: 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74  ith.** comment t
3e60: 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ext..*/.void sql
3e70: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
3e80: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
3e90: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
3ea0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
3ec0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
3ed0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3ee0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
3ef0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d  Op[p->nOp-1].p3=
3f00: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  =0 || sqlite3Mal
3f10: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20  locFailed() );. 
3f20: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
3f30: 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65  ormat);.  sqlite
3f40: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c  3VdbeChangeP3(p,
3f50: 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 4d 50 72   -1, sqlite3VMPr
3f60: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
3f70: 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
3f80: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
3f90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
3fa0: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
3fb0: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
3fc0: 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ess..*/.VdbeOp *
3fd0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
3fe0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3ff0: 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  dr){.  assert( p
4000: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4010: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
4020: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
4030: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
4040: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
4050: 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 72 65 74  ailed() );.  ret
4060: 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26 26  urn ((addr>=0 &&
4070: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26   addr<p->nOp)?(&
4080: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30 29  p->aOp[addr]):0)
4090: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
40a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
40b0: 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e  PLAIN) || !defin
40c0: 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20  ed(NDEBUG) \.   
40d0: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42    || defined(VDB
40e0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
40f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
4100: 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  UG)./*.** Comput
4110: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
4120: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 33  describes the P3
4130: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
4140: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
4150: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
4160: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
4170: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
4180: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
4190: 64 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f  displayP3(Op *pO
41a0: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
41b0: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
41c0: 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65 72  ar *zP3;.  asser
41d0: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
41e0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
41f0: 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  3type ){.    cas
4200: 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P3_KEYINFO: {.
4210: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
4220: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
4230: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
4240: 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  fo*)pOp->p3;.   
4250: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4260: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4270: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
4280: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4290: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72  );.      i = str
42a0: 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  len(zTemp);.    
42b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
42c0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
42d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
42e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
42f0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
4300: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
4310: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
4320: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
4330: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
4340: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e           if( i+n
4350: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
4360: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
4370: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c  zTemp[i],",...",
4380: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
4390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
43a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65   }.          zTe
43b0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
43c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65           if( pKe
43d0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
43e0: 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  r && pKeyInfo->a
43f0: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a  SortOrder[j] ){.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
4410: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
4420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4430: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4440: 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p[i], pColl->zNa
4450: 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  me,n+1);.       
4460: 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     i += n;.     
4470: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34     }else if( i+4
4480: 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  <nTemp-6 ){.    
4490: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
44a0: 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29  emp[i],",nil",4)
44b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
44c0: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
44d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
44e0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
44f0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
4500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4510: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
4520: 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP3 = zTemp;.  
4530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4540: 0a 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c  .    case P3_COL
4550: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
4560: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
4570: 43 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33  CollSeq*)pOp->p3
4580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4590: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
45a0: 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28  zTemp, "collseq(
45b0: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
45c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50  zName);.      zP
45d0: 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  3 = zTemp;.     
45e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
45f0: 20 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45    case P3_FUNCDE
4600: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
4610: 65 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63  ef *pDef = (Func
4620: 44 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Def*)pOp->p3;.  
4630: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4640: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4650: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
4660: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
4670: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 7a 50 33  nArg);.      zP3
4680: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
4690: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
46a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
46b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
46c0: 20 20 63 61 73 65 20 50 33 5f 56 54 41 42 3a 20    case P3_VTAB: 
46d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
46e0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 73  vtab *pVtab = (s
46f0: 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 4f 70  qlite3_vtab*)pOp
4700: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->p3;.      sqli
4710: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4720: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
4730: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
4740: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
4750: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
4760: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
4770: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4780: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4790: 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e 70 33     zP3 = pOp->p3
47a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 33 3d  ;.      if( zP3=
47b0: 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  =0 || pOp->opcod
47c0: 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  e==OP_Noop ){.  
47d0: 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22 3b 0a        zP3 = "";.
47e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
47f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 33 21  }.  assert( zP3!
4800: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
4810: 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  P3;.}.#endif...#
4820: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
4830: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
4840: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
4850: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
4860: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
4870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4880: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
4890: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
48a0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
48b0: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
48c0: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
48d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20  {.  char *zP3;. 
48e0: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
48f0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
4900: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
4910: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
4920: 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  4d %s\n";.  if( 
4930: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
4940: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d   stdout;.  zP3 =
4950: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
4960: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
4970: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
4980: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20  Out, zFormat1,. 
4990: 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33       pc, sqlite3
49a0: 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d  OpcodeNames[pOp-
49b0: 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70  >opcode], pOp->p
49c0: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29  1, pOp->p2, zP3)
49d0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
49e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
49f0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
4a00: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
4a10: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
4a20: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
4a30: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
4a40: 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  N){.  if( p ){. 
4a50: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20     while( N-->0 
4a60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4a70: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
4a80: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ++);.    }.  }.}
4a90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4aa0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
4ab0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
4ac0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
4ad0: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
4ae0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
4af0: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
4b00: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
4b10: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
4b20: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
4b30: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
4b40: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
4b50: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
4b60: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
4b70: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4b80: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
4b90: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
4ba0: 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73  PLAIN"..*/.int s
4bb0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
4bc0: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4be0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
4bf0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4c00: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
4c10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4c20: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
4c30: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  ->explain );.  i
4c40: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
4c50: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65  E_MAGIC_RUN ) re
4c60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
4c70: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  SE;.  assert( db
4c80: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
4c90: 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20  MAGIC_BUSY );.  
4ca0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
4cb0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
4cc0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
4cd0: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
4ce0: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
4cf0: 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e  does not put dyn
4d00: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74  amic strings ont
4d10: 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73  o the.  ** the s
4d20: 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62  tack, they may b
4d30: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
4d40: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
4d50: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
4d60: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
4d70: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
4d80: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
4d90: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  coding..  */.  i
4da0: 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e  f( p->pTos==&p->
4db0: 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20  aStack[4] ){.   
4dc0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
4dd0: 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a  (p->aStack, 5);.
4de0: 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74    }.  p->resOnSt
4df0: 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a  ack = 0;..  do{.
4e00: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
4e10: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e  .  }while( i<p->
4e20: 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  nOp && p->explai
4e30: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
4e40: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
4e50: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
4e60: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
4e70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
4e80: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
4e90: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
4ea0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
4eb0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
4ec0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
4ed0: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
4ee0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
4ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
4f00: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
4f10: 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  g, sqlite3ErrStr
4f20: 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29  (p->rc), (char*)
4f30: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
4f40: 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61   Op *pOp = &p->a
4f50: 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a  Op[i];.    Mem *
4f60: 70 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b  pMem = p->aStack
4f70: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
4f80: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
4f90: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
4fa0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
4fb0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
4ff0: 65 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  er */.    pMem++
5000: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
5010: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
5020: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
5030: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
5040: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
5050: 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f  codeNames[pOp->o
5060: 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f  pcode];  /* Opco
5070: 64 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  de */.    assert
5080: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
5090: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
50a0: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
50b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
50c0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
50d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
50e0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d  ITE_UTF8;.    pM
50f0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
5100: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5110: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
5120: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
5150: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5160: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5170: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5180: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5190: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
51a0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
51d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
51e0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
51f0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5200: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5210: 20 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53   MEM_Ephem|MEM_S
5220: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 2f  tr|MEM_Term;   /
5230: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P3 */.    pMem
5240: 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 33 28  ->z = displayP3(
5250: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72  pOp, pMem->zShor
5260: 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  t, sizeof(pMem->
5270: 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 61 73  zShort));.    as
5280: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
5290: 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20   );.    pMem->n 
52a0: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
52b0: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  );.    pMem->typ
52c0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
52d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
52e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20   SQLITE_UTF8;.. 
52f0: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
5300: 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70   = 5 - 2*(p->exp
5310: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
5320: 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  pTos = pMem;.   
5330: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5340: 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e  OK;.    p->resOn
5350: 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72  Stack = 1;.    r
5360: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
5370: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5380: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5390: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
53a0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
53b0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
53c0: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
53d0: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
53e0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
53f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
5400: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
5410: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
5420: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
5430: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
5440: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
5450: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
5460: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
5470: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
5480: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
5490: 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  >p3!=0 ){.    co
54a0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
54b0: 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c 65  p->p3;.    while
54c0: 28 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29  ( isspace(*(u8*)
54d0: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72  z) ) z++;.    pr
54e0: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
54f0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
5500: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
5510: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
5520: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
5530: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
5540: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
5550: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
5560: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
5570: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
5580: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
5590: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
55a0: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
55b0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
55c0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
55d0: 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30  ite3_io_trace==0
55e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
55f0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
5600: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
5610: 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70  [nOp-1];.  if( p
5620: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
5630: 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d  oop && pOp->p3!=
5640: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
5650: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
5660: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
5670: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
5680: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
5690: 70 2d 3e 70 33 29 3b 0a 20 20 20 20 66 6f 72 28  p->p3);.    for(
56a0: 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75 6e  i=0; isspace((un
56b0: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d  signed char)z[i]
56c0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
56d0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
56e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 73  ){.      if( iss
56f0: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
5700: 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  har)z[i]) ){.   
5710: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
5720: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
5730: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
5740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
5760: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
5770: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5780: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
5790: 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 28 22  lite3_io_trace("
57a0: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
57b0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
57c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
57d0: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
57e0: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a  LE_IOTRACE */...
57f0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
5800: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
5810: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  for execution.  
5820: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
5830: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
5840: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
5850: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
5860: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
5870: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
5880: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
5890: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
58a0: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
58b0: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
58c0: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
58d0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
58e0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20   .**.** This is 
58f0: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
5900: 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d  move a VDBE from
5910: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
5920: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
5930: 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  C_RUN..*/.void s
5940: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
5950: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
5980: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c  E */.  int nVar,
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
59b0: 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68  of '?' see in th
59c0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
59d0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20  */.  int nMem,  
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5a00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f   memory cells to
5a10: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
5a20: 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20  nt nCursor,     
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a40: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
5a50: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
5a60: 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69  /.  int isExplai
5a70: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
5a80: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5a90: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
5aa0: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ds is present */
5ab0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  .){.  int n;..  
5ac0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
5ad0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5ae0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5af0: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
5b00: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
5b10: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
5b20: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
5b30: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
5b40: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
5b50: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
5b60: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
5b70: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69   than later. Thi
5b80: 73 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73  s.   * is becaus
5b90: 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65  e the call to re
5ba0: 73 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65  sizeOpArray() be
5bb0: 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74  low may shrink t
5bc0: 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d  he.   * p->aOp[]
5bd0: 20 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d   array to save m
5be0: 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20  emory if called 
5bf0: 77 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47  when in VDBE_MAG
5c00: 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61  IC_RUN .   * sta
5c10: 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d  te..   */.  p->m
5c20: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
5c30: 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  C_RUN;..  /* No 
5c40: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72  instruction ever
5c50: 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61   pushes more tha
5c60: 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  n a single eleme
5c70: 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nt onto the.  **
5c80: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65   stack.  And the
5c90: 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f   stack never gro
5ca0: 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65  ws on successive
5cb0: 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74   executions of t
5cc0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f  he.  ** same loo
5cd0: 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c  p.  So the total
5ce0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72   number of instr
5cf0: 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70  uctions is an up
5d00: 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f  per bound.  ** o
5d10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74  n the maximum st
5d20: 61 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72  ack depth requir
5d30: 65 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65  ed.  (Added late
5d40: 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65  r:)  The.  ** re
5d50: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20  solveP2Values() 
5d60: 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20  call computes a 
5d70: 74 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f  tighter upper bo
5d80: 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  und on the.  ** 
5d90: 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a  stack size..  **
5da0: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
5db0: 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73   all the stack s
5dc0: 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65  pace we will eve
5dd0: 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  r need..  */.  i
5de0: 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20  f( p->aStack==0 
5df0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
5e00: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
5e10: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  m number of args
5e20: 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65   passed to a use
5e30: 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  r function. */. 
5e40: 20 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20     int nStack;  
5e50: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
5e60: 6d 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e  mber of stack en
5e70: 74 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a  tries required *
5e80: 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56  /.    resolveP2V
5e90: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20  alues(p, &nArg, 
5ea0: 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65  &nStack);.    re
5eb0: 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70  sizeOpArray(p, p
5ec0: 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65  ->nOp);.    asse
5ed0: 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20  rt( nVar>=0 );. 
5ee0: 20 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63     assert( nStac
5ef0: 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20  k<p->nOp );.    
5f00: 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20 29 7b  if( isExplain ){
5f10: 0a 20 20 20 20 20 20 6e 53 74 61 63 6b 20 3d 20  .      nStack = 
5f20: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  10;.    }.    p-
5f30: 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65  >aStack = sqlite
5f40: 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  Malloc(.        
5f50: 6e 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d  nStack*sizeof(p-
5f60: 3e 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f  >aStack[0])    /
5f70: 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20  * aStack */.    
5f80: 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28    + nArg*sizeof(
5f90: 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20  Mem*)           
5fa0: 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20     /* apArg */. 
5fb0: 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65       + nVar*size
5fc0: 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20  of(Mem)         
5fd0: 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f        /* aVar */
5fe0: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
5ff0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20  zeof(char*)     
6000: 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72          /* azVar
6010: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d   */.      + nMem
6020: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20  *sizeof(Mem)    
6030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
6040: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  em */.      + nC
6050: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72  ursor*sizeof(Cur
6060: 73 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20  sor*)        /* 
6070: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
6080: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
6090: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
60a0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20  {.      p->aMem 
60b0: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74  = &p->aStack[nSt
60c0: 61 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ack];.      p->n
60d0: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20  Mem = nMem;.    
60e0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e    p->aVar = &p->
60f0: 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20  aMem[nMem];.    
6100: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72    p->nVar = nVar
6110: 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72  ;.      p->okVar
6120: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
6130: 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70  pArg = (Mem**)&p
6140: 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20  ->aVar[nVar];.  
6150: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28      p->azVar = (
6160: 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67  char**)&p->apArg
6170: 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d  [nArg];.      p-
6180: 3e 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72  >apCsr = (Cursor
6190: 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61  **)&p->azVar[nVa
61a0: 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75  r];.      p->nCu
61b0: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
61c0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
61d0: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
61e0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
61f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
6200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6210: 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e    }.  for(n=0; n
6220: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
6230: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
6240: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
6250: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 54 6f 73 20  .  }..  p->pTos 
6260: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d  = &p->aStack[-1]
6270: 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  ;.  p->pc = -1;.
6280: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
6290: 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65  _OK;.  p->unique
62a0: 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65  Cnt = 0;.  p->re
62b0: 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20  turnDepth = 0;. 
62c0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
62d0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
62e0: 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a  >popStack =  0;.
62f0: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20    p->explain |= 
6300: 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e  isExplain;.  p->
6310: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
6320: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
6330: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
6340: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
6350: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
6360: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
6370: 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
6380: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
6390: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
63a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
63b0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
63c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i++){.      p->a
63d0: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
63e0: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
63f0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d  ycles = 0;.    }
6400: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6410: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
6420: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
6430: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
6440: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 68 61  s that cursor ha
6450: 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64  ppens.** to hold
6460: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6470: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
6480: 56 64 62 65 20 2a 70 2c 20 43 75 72 73 6f 72 20  Vdbe *p, Cursor 
6490: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
64a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
64b0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  n;.  }.  if( pCx
64c0: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
64d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
64e0: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
64f0: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66  ursor);.  }.  if
6500: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
6510: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
6520: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
6530: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6540: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6550: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
6560: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
6570: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
6580: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
6590: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
65a0: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
65b0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
65c0: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e  *pModule = pCx->
65d0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
65e0: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
65f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66  ;.    sqlite3Saf
6600: 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20  etyOff(p->db);. 
6610: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
6620: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
6630: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
6640: 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20  tyOn(p->db);.   
6650: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
6660: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
6670: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
6680: 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71 6c  x->pData);.  sql
6690: 69 74 65 46 72 65 65 28 70 43 78 2d 3e 61 54 79  iteFree(pCx->aTy
66a0: 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  pe);.  sqliteFre
66b0: 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(pCx);.}../*.**
66c0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
66d0: 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  rs.*/.static voi
66e0: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
66f0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
6700: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
6710: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
6720: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6730: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
6740: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 6e 56 74      if( !p->inVt
6750: 61 62 4d 65 74 68 6f 64 20 7c 7c 20 28 70 2d 3e  abMethod || (p->
6760: 61 70 43 73 72 5b 69 5d 20 26 26 20 21 70 2d 3e  apCsr[i] && !p->
6770: 61 70 43 73 72 5b 69 5d 2d 3e 70 56 74 61 62 43  apCsr[i]->pVtabC
6780: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
6790: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
67a0: 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73  ursor(p, p->apCs
67b0: 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  r[i]);.      p->
67c0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
67d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
67e0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
67f0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
6800: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6810: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
6820: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
6830: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
6840: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
6850: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
6860: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
6870: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
6880: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
6890: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
68a0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
68b0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
68c0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
68d0: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   i;.  if( p->aSt
68e0: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  ack ){.    relea
68f0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
6900: 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54  tack, 1 + (p->pT
6910: 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29  os - p->aStack))
6920: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
6930: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
6940: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
6950: 72 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65  rsors(p);.  rele
6960: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
6970: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
6980: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
6990: 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29  Clear(&p->sFifo)
69a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65  ;.  if( p->conte
69b0: 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66  xtStack ){.    f
69c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e  or(i=0; i<p->con
69d0: 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b  textStackTop; i+
69e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
69f0: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
6a00: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
6a10: 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d  i].sFifo);.    }
6a20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
6a30: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
6a40: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
6a50: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
6a60: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
6a70: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
6a80: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
6a90: 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  0;.  sqliteFree(
6aa0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
6ab0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
6ac0: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
6ad0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
6ae0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
6af0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
6b00: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
6b10: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
6b20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
6b30: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
6b40: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
6b50: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
6b60: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
6b70: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
6b80: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
6b90: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
6ba0: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
6bb0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
6bc0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
6bd0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
6be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6bf0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
6c00: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
6c10: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
6c20: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
6c30: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
6c40: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
6c50: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
6c60: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
6c70: 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d  eFree(p->aColNam
6c80: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
6c90: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
6ca0: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
6cb0: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  = nResColumn;.  
6cc0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
6cd0: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
6ce0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
6cf0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
6d00: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
6d10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
6d20: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
6d30: 0a 20 20 20 20 28 70 43 6f 6c 4e 61 6d 65 2b 2b  .    (pColName++
6d40: 29 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  )->flags = MEM_N
6d50: 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ull;.  }.}../*.*
6d60: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
6d70: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
6d80: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
6d90: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
6da0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
6db0: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
6dc0: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
6dd0: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
6de0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
6df0: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
6e00: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
6e10: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
6e20: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e  ls()..**.** If N
6e30: 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74 20  ==P3_STATIC  it 
6e40: 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65  means that zName
6e50: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
6e60: 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74   a constant stat
6e70: 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64  ic.** string and
6e80: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
6e90: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49  y the pointer. I
6ea0: 66 20 69 74 20 69 73 20 50 33 5f 44 59 4e 41 4d  f it is P3_DYNAM
6eb0: 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65  IC, then .** the
6ec0: 20 73 74 72 69 6e 67 20 69 73 20 66 72 65 65 64   string is freed
6ed0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 46 72 65   using sqliteFre
6ee0: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
6ef0: 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69  e is finished wi
6f00: 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77  th.** it. Otherw
6f10: 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20  ise, N bytes of 
6f20: 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64  zName are copied
6f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6f40: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56  VdbeSetColName(V
6f50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  dbe *p, int idx,
6f60: 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20   int var, const 
6f70: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
6f80: 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   N){.  int rc;. 
6f90: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
6fa0: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
6fb0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
6fc0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
6fd0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
6fe0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
6ff0: 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 20 53  led() ) return S
7000: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61  QLITE_NOMEM;.  a
7010: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
7020: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
7030: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
7040: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
7050: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69  ResColumn]);.  i
7060: 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43  f( N==P3_DYNAMIC
7070: 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43   || N==P3_STATIC
7080: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7090: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
70a0: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
70b0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
70c0: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
70d0: 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
70e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
70f0: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
7100: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53  ame, zName, N, S
7110: 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54  QLITE_UTF8,SQLIT
7120: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
7130: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
7140: 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44  TE_OK && N==P3_D
7150: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43  YNAMIC ){.    pC
7160: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
7170: 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73  (pColName->flags
7180: 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c  &(~MEM_Static))|
7190: 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f  MEM_Dyn;.    pCo
71a0: 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b  lName->xDel = 0;
71b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
71c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
71d0: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
71e0: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
71f0: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
7200: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
7210: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
7220: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
7230: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
7240: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
7250: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
7260: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
7270: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
7280: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
7290: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
72a0: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
72b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
72c0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
72d0: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
72e0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
72f0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
7300: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
7310: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
7320: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
7330: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
7340: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
7350: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
7360: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
7370: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
7380: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
7390: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
73a0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
73b0: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
73c0: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
73d0: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
73e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
73f0: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
7400: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
7410: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
7420: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
7430: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
7440: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
7450: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
7460: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
7470: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
7480: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
7490: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
74a0: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
74b0: 63 28 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28  c(db, rc);.  if(
74c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
74e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
74f0: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
7500: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
7510: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
7520: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
7530: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
7540: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
7550: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
7560: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
7570: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
7580: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
7590: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
75a0: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
75b0: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
75c0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
75d0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
75e0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
75f0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
7600: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
7610: 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
7620: 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
7630: 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  / .  for(i=0; i<
7640: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
7650: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
7660: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7670: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
7680: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
7690: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
76a0: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
76b0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
76c0: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
76d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
76e0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
76f0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
7700: 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
7710: 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
7720: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
7730: 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
7740: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
7750: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66  {.    sqlite3Saf
7760: 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20  etyOff(db);.    
7770: 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
7780: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
7790: 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71  mmitArg);.    sq
77a0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
77b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
77c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
77d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
77e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
77f0: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
7800: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
7810: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
7820: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
7830: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
7840: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
7850: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
7860: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
7870: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
7880: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
7890: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
78a0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
78b0: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
78c0: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
78d0: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
78e0: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
78f0: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
7900: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
7910: 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  :.  In that case
7920: 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20   we do.  ** not 
7930: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
7940: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
7950: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73 69  s, so use the si
7960: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20  mple case then. 
7970: 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20   ** too..  */.  
7980: 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71  if( 0==strlen(sq
7990: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
79a0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
79b0: 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73  .pBt)) || nTrans
79c0: 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  <=1 ){.    for(i
79d0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
79e0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
79f0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
7a00: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
7a10: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
7a20: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
7a30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
7a40: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
7a50: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
7a60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
7a70: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
7a80: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
7a90: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
7aa0: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
7ab0: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
7ac0: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
7ad0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
7ae0: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
7af0: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
7b00: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
7b10: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
7b20: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
7b30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
7b40: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
7b50: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
7b60: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
7b70: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
7b80: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
7b90: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
7ba0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
7bb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7bc0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7bd0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
7be0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7bf0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
7c00: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
7c10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
7c20: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
7c30: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
7c40: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
7c50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7c60: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
7c70: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
7c80: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
7c90: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
7ca0: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
7cb0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
7cc0: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
7cd0: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
7ce0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7cf0: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
7d00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
7d10: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
7d20: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
7d30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7d40: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
7d50: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  {.    int needSy
7d60: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
7d70: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
7d80: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
7d90: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
7da0: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
7db0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
7dc0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
7dd0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
7de0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
7df0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6d   sqlite3_file *m
7e00: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
7e10: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  64 offset = 0;..
7e20: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
7e30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7e40: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
7e50: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72  do {.      u32 r
7e60: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c  andom;.      sql
7e70: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
7e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
7e90: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
7ea0: 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f  (random), &rando
7eb0: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
7ec0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
7ed0: 74 66 28 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20  tf("%s-mj%08X", 
7ee0: 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f  zMainFile, rando
7ef0: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
7f00: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
7f10: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
7f20: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7f30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  ;.      }.    }w
7f40: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 46  hile( sqlite3OsF
7f50: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
7f60: 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  r) );..    /* Op
7f70: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
7f80: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63  urnal. */.    rc
7f90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
7fa0: 45 78 63 6c 75 73 69 76 65 28 7a 4d 61 73 74 65  Exclusive(zMaste
7fb0: 72 2c 20 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a  r, &master, 0);.
7fc0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7fd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
7fe0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
7ff0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
8000: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
8010: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
8020: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
8030: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
8040: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
8050: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
8060: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8070: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
8080: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
8090: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
80a0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
80b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
80c0: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
80d0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
80e0: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
80f0: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
8100: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
8110: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
8120: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
8130: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
8140: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
8150: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
8160: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
8170: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
8180: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
8190: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
81a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
81b0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
81c0: 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65  nue;   /* Ignore
81d0: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
81e0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  se */.      if( 
81f0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
8200: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
8210: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8220: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
8230: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8240: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
8250: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
8260: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
8270: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
8280: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
8290: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
82a0: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
82b0: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
82c0: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
82d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
82e0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
82f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
8300: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8310: 6d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  master, zFile, s
8320: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20  trlen(zFile)+1, 
8330: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
8340: 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c 65   offset += strle
8350: 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  n(zFile)+1;.    
8360: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8370: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
8380: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8390: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(&master);.    
83a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
83b0: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
83c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
83d0: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
83e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
83f0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
8400: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20      }.    }...  
8410: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
8420: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8430: 65 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  e. Before doing 
8440: 74 68 69 73 2c 20 6f 70 65 6e 20 74 68 65 20 64  this, open the d
8450: 69 72 65 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20  irectory.    ** 
8460: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8470: 61 6c 20 66 69 6c 65 20 69 73 20 73 74 6f 72 65  al file is store
8480: 20 69 6e 20 73 6f 20 74 68 61 74 20 69 74 20 67   in so that it g
8490: 65 74 73 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a  ets synced too..
84a0: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e      */.    zMain
84b0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
84c0: 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62  reeGetDirname(db
84d0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 23  ->aDb[0].pBt);.#
84e0: 69 66 20 30 0a 20 20 20 20 72 63 20 3d 20 73 71  if 0.    rc = sq
84f0: 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
8500: 74 6f 72 79 28 6d 61 73 74 65 72 2c 20 7a 4d 61  tory(master, zMa
8510: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
8520: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
8530: 7c 0a 20 20 20 20 20 20 20 20 20 20 28 6e 65 65  |.          (nee
8540: 64 53 79 6e 63 20 26 26 20 28 72 63 3d 73 71 6c  dSync && (rc=sql
8550: 69 74 65 33 4f 73 53 79 6e 63 28 6d 61 73 74 65  ite3OsSync(maste
8560: 72 2c 30 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  r,0))!=SQLITE_OK
8570: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
8580: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65  e3OsClose(&maste
8590: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
85a0: 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65  3OsDelete(zMaste
85b0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
85c0: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
85d0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
85e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
85f0: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
8600: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
8610: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
8620: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
8630: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
8640: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
8650: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
8660: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
8670: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
8680: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
8690: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
86a0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
86b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
86c0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
86d0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
86e0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
86f0: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
8700: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
8710: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
8720: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
8730: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
8740: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
8750: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
8760: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
8770: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
8780: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
8790: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
87a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
87b0: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
87c0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
87d0: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
87e0: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
87f0: 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cured..    */.  
8800: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
8810: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
8820: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
8830: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8840: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8850: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26  .      if( pBt &
8860: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
8870: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
8880: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8890: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
88a0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
88b0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
88c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
88d0: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
88e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
88f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8900: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
8910: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
8920: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
8930: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
8940: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8950: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
8960: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
8970: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
8980: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
8990: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
89a0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
89b0: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
89c0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
89d0: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
89e0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
89f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8a00: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  lete(zMaster);. 
8a10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
8a20: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
8a30: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
8a40: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
8a50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
8a60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8a70: 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 7a 4d  SyncDirectory(zM
8a80: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
8a90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8aa0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
8ab0: 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e 20 54 68   is not good. Th
8ac0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8ad0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 64   file has been d
8ae0: 65 6c 65 74 65 64 2c 20 62 75 74 0a 20 20 20 20  eleted, but.    
8af0: 20 20 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f    ** the directo
8b00: 72 79 20 73 79 6e 63 20 66 61 69 6c 65 64 2e 20  ry sync failed. 
8b10: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70  There is no comp
8b20: 6c 65 74 65 6c 79 20 73 61 66 65 20 63 6f 75 72  letely safe cour
8b30: 73 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  se of.      ** a
8b40: 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65 72 65 2e  ction from here.
8b50: 20 54 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   The individual 
8b60: 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74 61 69 6e  journals contain
8b70: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8b80: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  .      ** master
8b90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 62   journal file, b
8ba0: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
8bb0: 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 69 66  ay of knowing if
8bc0: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d   that.      ** m
8bd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
8be0: 69 73 74 73 20 6e 6f 77 20 6f 72 20 69 66 20 69  ists now or if i
8bf0: 74 20 77 69 6c 6c 20 65 78 69 73 74 20 61 66 74  t will exist aft
8c00: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  er the operating
8c10: 0a 20 20 20 20 20 20 2a 2a 20 73 79 73 74 65 6d  .      ** system
8c20: 20 63 72 61 73 68 20 74 68 61 74 20 6d 61 79 20   crash that may 
8c30: 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73 79 6e 63  follow the fsync
8c40: 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 20 20  () failure..    
8c50: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
8c60: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
8c70: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
8c80: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
8c90: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
8ca0: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
8cb0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
8cc0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
8cd0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8ce0: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
8cf0: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
8d00: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
8d10: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
8d20: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
8d30: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8d40: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
8d50: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
8d60: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
8d70: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
8d80: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
8d90: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
8da0: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
8db0: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
8dc0: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
8dd0: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
8de0: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
8df0: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
8e00: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
8e10: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
8e20: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
8e30: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
8e40: 72 73 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rs();.    for(i=
8e50: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
8e60: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
8e70: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8e80: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8e90: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
8ea0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8eb0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
8ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8ed0: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
8ee0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
8ef0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
8f00: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
8f10: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
8f20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
8f30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
8f40: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
8f50: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
8f60: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
8f70: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
8f80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
8f90: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
8fa0: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
8fb0: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
8fc0: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
8fd0: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
8fe0: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
8ff0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
9000: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
9010: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
9020: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
9030: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
9040: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
9050: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9060: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
9070: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
9080: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9090: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
90a0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
90b0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
90c0: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
90d0: 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  t = 0;.  p = db-
90e0: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
90f0: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
9100: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
9110: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
9120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
9130: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
9140: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
9150: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
9160: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
9170: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
9180: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
9190: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
91a0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72  ./*.** Find ever
91b0: 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65  y active VM othe
91c0: 72 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64  r than pVdbe and
91d0: 20 63 68 61 6e 67 65 20 69 74 73 20 73 74 61 74   change its stat
91e0: 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64  us to.** aborted
91f0: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
9200: 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73  when one VM caus
9210: 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75  es a rollback du
9220: 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f  e to an.** ON CO
9230: 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20  NFLICT ROLLBACK 
9240: 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d  clause (for exam
9250: 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72  ple).  The other
9260: 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20   VMs must be.** 
9270: 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20  aborted so that 
9280: 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65  they do not have
9290: 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74   data rolled out
92a0: 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68   from underneath
92b0: 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67  .** them leading
92c0: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a   to a segfault..
92d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
92e0: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
92f0: 64 62 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  dbes(sqlite3 *db
9300: 2c 20 56 64 62 65 20 2a 70 45 78 63 65 70 74 29  , Vdbe *pExcept)
9310: 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72  {.  Vdbe *pOther
9320: 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 64  ;.  for(pOther=d
9330: 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72  b->pVdbe; pOther
9340: 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d  ; pOther=pOther-
9350: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
9360: 20 70 4f 74 68 65 72 3d 3d 70 45 78 63 65 70 74   pOther==pExcept
9370: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9380: 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67   if( pOther->mag
9390: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
93a0: 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63  UN || pOther->pc
93b0: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
93c0: 20 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64     checkActiveVd
93d0: 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20 20 63  beCnt(db);.    c
93e0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
93f0: 4f 74 68 65 72 29 3b 0a 20 20 20 20 63 68 65 63  Other);.    chec
9400: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
9410: 62 29 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  b);.    pOther->
9420: 61 62 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 7d  aborted = 1;.  }
9430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9440: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9450: 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
9460: 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
9470: 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
9480: 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
9490: 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
94a0: 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
94b0: 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
94c0: 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
94d0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
94e0: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
94f0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
9500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9510: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
9520: 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
9530: 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
9540: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
9550: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
9560: 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  HALT..**.** Retu
9570: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
9580: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
9590: 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
95a0: 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
95b0: 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
95c0: 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
95d0: 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
95e0: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
95f0: 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
9600: 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
9610: 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
9620: 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
9630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9640: 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
9650: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
9660: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
9670: 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e   i;.  int (*xFun
9680: 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d  c)(Btree *pBt) =
9690: 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e   0;  /* Function
96a0: 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68   to call on each
96b0: 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a   btree backend *
96c0: 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69 61  /.  int isSpecia
96d0: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
96e0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
96f0: 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e if SQLITE_NOME
9700: 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20  M or IOERR */.. 
9710: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
9720: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
9730: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
9740: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
9750: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
9760: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
9770: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
9780: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
9790: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
97a0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
97b0: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
97c0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ne. .  **.  ** S
97d0: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 3a 0a 20  pecial errors:. 
97e0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20   **.  **     If 
97f0: 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  an SQLITE_NOMEM 
9800: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
9810: 64 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  d in a statement
9820: 20 74 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a   that writes to.
9830: 20 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74    **     the dat
9840: 61 62 61 73 65 2c 20 74 68 65 6e 20 65 69 74 68  abase, then eith
9850: 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  er a statement o
9860: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  r transaction mu
9870: 73 74 20 62 65 20 72 6f 6c 6c 65 64 0a 20 20 2a  st be rolled.  *
9880: 2a 20 20 20 20 20 62 61 63 6b 20 74 6f 20 65 6e  *     back to en
9890: 73 75 72 65 20 74 68 65 20 74 72 65 65 2d 73 74  sure the tree-st
98a0: 72 75 63 74 75 72 65 73 20 61 72 65 20 69 6e 20  ructures are in 
98b0: 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
98c0: 74 65 2e 20 41 0a 20 20 2a 2a 20 20 20 20 20 73  te. A.  **     s
98d0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
98e0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
98f0: 61 63 6b 20 69 66 20 6f 6e 65 20 69 73 20 6f 70  ack if one is op
9900: 65 6e 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68  en, otherwise th
9910: 65 0a 20 20 2a 2a 20 20 20 20 20 65 6e 74 69 72  e.  **     entir
9920: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
9930: 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
9940: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k..  **.  **    
9950: 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f   If an SQLITE_IO
9960: 45 52 52 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ERR error has oc
9970: 63 75 72 65 64 20 69 6e 20 61 20 73 74 61 74 65  cured in a state
9980: 6d 65 6e 74 20 74 68 61 74 20 77 72 69 74 65 73  ment that writes
9990: 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68 65   to.  **     the
99a0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
99b0: 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
99c0: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
99d0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 65 0a  olled back. The.
99e0: 20 20 2a 2a 20 20 20 20 20 49 2f 4f 20 65 72 72    **     I/O err
99f0: 6f 72 20 6d 61 79 20 68 61 76 65 20 63 61 75 73  or may have caus
9a00: 65 64 20 67 61 72 62 61 67 65 20 74 6f 20 62 65  ed garbage to be
9a10: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
9a20: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 20 20  journal .  **   
9a30: 20 20 66 69 6c 65 2e 20 57 65 72 65 20 74 68 65    file. Were the
9a40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
9a50: 63 6f 6e 74 69 6e 75 65 20 61 6e 64 20 65 76 65  continue and eve
9a60: 6e 74 75 61 6c 6c 79 20 62 65 20 72 6f 6c 6c 65  ntually be rolle
9a70: 64 20 0a 20 20 2a 2a 20 20 20 20 20 62 61 63 6b  d .  **     back
9a80: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 6d 69   that garbage mi
9a90: 67 68 74 20 65 6e 64 20 75 70 20 69 6e 20 74 68  ght end up in th
9aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9ab0: 0a 20 20 2a 2a 20 20 20 20 20 0a 20 20 2a 2a 20  .  **     .  ** 
9ac0: 20 20 20 20 49 6e 20 62 6f 74 68 20 6f 66 20 74      In both of t
9ad0: 68 65 20 61 62 6f 76 65 20 63 61 73 65 73 2c 20  he above cases, 
9ae0: 74 68 65 20 56 64 62 65 2e 65 72 72 6f 72 41 63  the Vdbe.errorAc
9af0: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
9b00: 20 0a 20 20 2a 2a 20 20 20 20 20 69 67 6e 6f 72   .  **     ignor
9b10: 65 64 2e 20 49 66 20 74 68 65 20 73 71 6c 69 74  ed. If the sqlit
9b20: 65 33 2e 61 75 74 6f 43 6f 6d 6d 69 74 20 66 6c  e3.autoCommit fl
9b30: 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ag is false and 
9b40: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  a transaction.  
9b50: 2a 2a 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64  **     is rolled
9b60: 20 62 61 63 6b 2c 20 69 74 20 77 69 6c 6c 20 62   back, it will b
9b70: 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 20  e set to true.. 
9b80: 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 20 65   **.  ** Other e
9b90: 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors:.  **.  **
9ba0: 20 4e 6f 20 65 72 72 6f 72 3a 0a 20 20 2a 2a 0a   No error:.  **.
9bb0: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69    */..  if( sqli
9bc0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
9bd0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
9be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9bf0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69   }.  if( p->magi
9c00: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
9c10: 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 72 65  N ){.    /* Alre
9c20: 61 64 79 20 68 61 6c 74 65 64 2e 20 20 4e 6f 74  ady halted.  Not
9c30: 68 69 6e 67 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20  hing to do. */. 
9c40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61     assert( p->ma
9c50: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
9c60: 48 41 4c 54 20 29 3b 0a 23 69 66 6e 64 65 66 20  HALT );.#ifndef 
9c70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9c80: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 6c 6f  UALTABLE.    clo
9c90: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
9ca0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
9cb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9cc0: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
9cd0: 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41  ors(p);.  checkA
9ce0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
9cf0: 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
9d00: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
9d10: 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
9d20: 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
9d30: 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  d */.  if( p->pc
9d40: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  >=0 ){.    int m
9d50: 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
9d60: 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
9d70: 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 2f 2a   p->rc */.    /*
9d80: 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
9d90: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
9da0: 72 6f 72 73 20 2d 20 53 51 4c 49 54 45 5f 4e 4f  rors - SQLITE_NO
9db0: 4d 45 4d 20 6f 72 20 53 51 4c 49 54 45 5f 49 4f  MEM or SQLITE_IO
9dc0: 45 52 52 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d  ERR */.    mrc =
9dd0: 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20   p->rc & 0xff;. 
9de0: 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
9df0: 72 20 3d 20 28 0a 20 20 20 20 20 20 20 20 28 6d  r = (.        (m
9e00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
9e10: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
9e20: 49 4f 45 52 52 20 7c 7c 20 6d 72 63 3d 3d 53 51  IOERR || mrc==SQ
9e30: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 29 3f  LITE_INTERRUPT)?
9e40: 31 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73  1:0);.    if( is
9e50: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
9e60: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f        /* This lo
9e70: 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63 20 61  op does static a
9e80: 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 71  nalysis of the q
9e90: 75 65 72 79 20 74 6f 20 73 65 65 20 77 68 69 63  uery to see whic
9ea0: 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  h of the.      *
9eb0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  * following thre
9ec0: 65 20 63 61 74 65 67 6f 72 69 65 73 20 69 74 20  e categories it 
9ed0: 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20  falls into:.    
9ee0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
9ef0: 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20    Read-only.    
9f00: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
9f10: 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  ith statement jo
9f20: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20  urnal.      **  
9f30: 20 20 20 51 75 65 72 79 20 77 69 74 68 6f 75 74     Query without
9f40: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9f50: 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  al.      **.    
9f60: 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f    ** We could do
9f70: 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20   something more 
9f80: 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68 69  elegant than thi
9f90: 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  s static analysi
9fa0: 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a  s (i.e..      **
9fb0: 20 73 74 6f 72 65 20 74 68 65 20 74 79 70 65 20   store the type 
9fc0: 6f 66 20 71 75 65 72 79 20 61 73 20 70 61 72 74  of query as part
9fd0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61 74   of the compliat
9fe0: 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74 20  ion phase), but 
9ff0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69  .      ** handli
a000: 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49  ng malloc() or I
a010: 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61 20 66  O failure is a f
a020: 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64  airly obscure ed
a030: 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20 20 20  ge case so .    
a040: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 72 6f    ** this is pro
a050: 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20 54 6f  bably easier. To
a060: 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61 6e 20  do: Might be an 
a070: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
a080: 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  educe .      ** 
a090: 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65 72 79  code size a very
a0a0: 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68   small amount th
a0b0: 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  ough....      */
a0c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 52 65 61  .      int isRea
a0d0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  dOnly = 1;.     
a0e0: 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74   int isStatement
a0f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
a100: 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e  rt(p->aOp || p->
a110: 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66  nOp==0);.      f
a120: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
a130: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
a140: 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b   switch( p->aOp[
a150: 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  i].opcode ){.   
a160: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54         case OP_T
a170: 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20  ransaction:.    
a180: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
a190: 69 73 20 61 20 62 69 74 20 73 74 72 61 6e 67 65  is a bit strange
a1a0: 2e 20 49 66 20 77 65 20 68 69 74 20 61 20 6d 61  . If we hit a ma
a1b0: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
a1c0: 6f 72 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  or and.         
a1d0: 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
a1e0: 65 6e 74 20 64 69 64 20 6e 6f 74 20 6f 70 65 6e  ent did not open
a1f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
a200: 6e 73 61 63 74 69 6f 6e 2c 20 77 65 20 77 69 6c  nsaction, we wil
a210: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
a220: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
a230: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
a240: 20 61 6e 64 20 61 62 6f 72 74 20 61 6c 6c 20 6f   and abort all o
a250: 74 68 65 72 20 61 63 74 69 76 65 0a 20 20 20 20  ther active.    
a260: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
a270: 6d 65 6e 74 73 2e 20 4f 72 2c 20 69 66 20 74 68  ments. Or, if th
a280: 69 73 20 69 73 20 61 6e 20 53 51 4c 49 54 45 5f  is is an SQLITE_
a290: 49 4e 54 45 52 52 55 50 54 20 65 72 72 6f 72 2c  INTERRUPT error,
a2a0: 20 77 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   we.            
a2b0: 2a 2a 20 77 69 6c 6c 20 6f 6e 6c 79 20 72 6f 6c  ** will only rol
a2c0: 6c 62 61 63 6b 20 69 66 20 74 68 65 20 69 6e 74  lback if the int
a2d0: 65 72 72 75 70 74 65 64 20 73 74 61 74 65 6d 65  errupted stateme
a2e0: 6e 74 20 77 61 73 20 61 20 77 72 69 74 65 2e 0a  nt was a write..
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
a300: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 74             ** It
a310: 20 63 6f 75 6c 64 20 62 65 20 61 72 67 75 65 64   could be argued
a320: 20 74 68 61 74 20 72 65 61 64 2d 6f 6e 6c 79 20   that read-only 
a330: 73 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c  statements shoul
a340: 64 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  d never.        
a350: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
a360: 61 6e 79 74 68 69 6e 67 2e 20 42 75 74 20 63 61  anything. But ca
a370: 72 65 66 75 6c 20 61 6e 61 6c 79 73 69 73 20 69  reful analysis i
a380: 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
a390: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
a3a0: 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 63 68 61   making this cha
a3b0: 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  nge.            
a3c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
a3d0: 66 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 20  f( p->aOp[i].p2 
a3e0: 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
a3f0: 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
a400: 20 20 20 20 20 20 20 20 20 20 69 73 52 65 61 64            isRead
a410: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
a420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a440: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
a450: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
a460: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
a470: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
a480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a490: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  }.      }.  .   
a4a0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
a4b0: 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
a4c0: 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20  , we need do no 
a4d0: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e  rollback at all.
a4e0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
a4f0: 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74    ** proceed wit
a500: 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61  h the special ha
a510: 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  ndling..      */
a520: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 52 65  .      if( !isRe
a530: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
a540: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a550: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
a560: 44 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74  D && isStatement
a570: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
a580: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
a590: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
a5a0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
a5b0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
a5c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
a5d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a5e0: 4e 4f 4d 45 4d 20 26 26 20 69 73 53 74 61 74 65  NOMEM && isState
a5f0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
a600: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
a610: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
a620: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  mt;.        }els
a630: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
a640: 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
a650: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
a660: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
a670: 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
a680: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
a690: 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
a6a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
a6b0: 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
a6c0: 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
a6d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72       sqlite3Abor
a6f0: 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65  tOtherActiveVdbe
a700: 73 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  s(db, p);.      
a710: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
a720: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
a730: 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
a740: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
a750: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a760: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
a770: 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
a780: 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
a790: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
a7a0: 61 63 74 69 76 65 20 76 64 62 65 2c 20 74 68 65  active vdbe, the
a7b0: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65  n.    ** we do e
a7c0: 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
a7d0: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
a7e0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
a7f0: 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
a800: 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
a810: 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
a820: 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
a830: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
a840: 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
a850: 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e  ove has occured.
a860: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
a870: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
a880: 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  && db->activeVdb
a890: 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  eCnt==1 ){.     
a8a0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
a8b0: 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
a8c0: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
a8d0: 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
a8e0: 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
a8f0: 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
a900: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
a910: 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70  , and the vdbe p
a920: 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20  rogram was .    
a930: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
a940: 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  l or hit an 'OR 
a950: 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
a960: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
a970: 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ommit .        *
a980: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  * is required.. 
a990: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a9a0: 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43    int rc = vdbeC
a9b0: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20  ommit(db);.     
a9c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a9d0: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
a9e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a9f0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
aa00: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
aa10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
aa20: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
aa30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
aa40: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
aa50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
aa60: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
aa70: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
aa80: 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
aa90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
aaa0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
aab0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
aac0: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
aad0: 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e   }else if( !xFun
aae0: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  c ){.      if( p
aaf0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ab00: 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
ab10: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
ab20: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65        if( p->ope
ab30: 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  nedStatement ){.
ab40: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
ab50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
ab60: 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  mmitStmt;.      
ab70: 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
ab80: 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
ab90: 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
aba0: 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d  .        xFunc =
abb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
abc0: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
abd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
abe0: 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65  sqlite3AbortOthe
abf0: 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62 2c  rActiveVdbes(db,
ac00: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   p);.        sql
ac10: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
ac20: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
ac30: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
ac40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ac50: 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e   .    /* If xFun
ac60: 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  c is not NULL, t
ac70: 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66  hen it is one of
ac80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
ac90: 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20  lbackStmt or.   
aca0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
acb0: 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c  CommitStmt. Call
acc0: 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68   it once on each
acd0: 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20   backend. If an 
ace0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20  error occurs.   
acf0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75   ** and the retu
ad00: 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c  rn code is still
ad10: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20   SQLITE_OK, set 
ad20: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
ad30: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
ad40: 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20  * error value.. 
ad50: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
ad60: 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20  (!xFunc ||.     
ad70: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
ad80: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c  treeCommitStmt |
ad90: 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73  |.      xFunc==s
ada0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
adb0: 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20  ackStmt.    );. 
adc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e     for(i=0; xFun
add0: 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  c && i<db->nDb; 
ade0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
adf0: 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65   rc;.      Btree
ae00: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
ae10: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
ae20: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
ae30: 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29   rc = xFunc(pBt)
ae40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
ae50: 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49   && (p->rc==SQLI
ae60: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
ae70: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ae80: 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  T) ){.          
ae90: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
aea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
aeb0: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
aec0: 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  sg, 0);.        
aed0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
aee0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
aef0: 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
af00: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
af10: 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d  E and the statem
af20: 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ent was committe
af30: 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  d, .    ** set t
af40: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
af50: 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
af60: 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
af70: 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  n && p->pc>=0 ){
af80: 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75 6e  .      if( !xFun
af90: 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69  c || xFunc==sqli
afa0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
afb0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  mt ){.        sq
afc0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
afd0: 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
afe0: 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
aff0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b000: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
b010: 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
b020: 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
b030: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
b040: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f     /* Rollback o
b050: 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68  r commit any sch
b060: 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74  ema changes that
b070: 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20   occurred. */.  
b080: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
b090: 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c  ITE_OK && db->fl
b0a0: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
b0b0: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
b0c0: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
b0d0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
b0e0: 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66   0);.      db->f
b0f0: 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  lags = (db->flag
b100: 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s | SQLITE_Inter
b110: 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d  nChanges);.    }
b120: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
b130: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
b140: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
b150: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
b160: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
b170: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
b180: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
b190: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20  VdbeCnt--;.  }. 
b1a0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b1b0: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
b1c0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b1d0: 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e  t(db);..  return
b1e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b1f0: 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
b200: 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
b210: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b220: 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
b230: 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
b240: 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
b250: 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
b260: 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
b270: 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
b280: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
b290: 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
b2a0: 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
b2b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b2c0: 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
b2d0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
b2e0: 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
b2f0: 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
b300: 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
b310: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
b320: 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
b330: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
b340: 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
b350: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
b360: 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
b370: 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
b380: 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
b390: 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
b3a0: 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
b3b0: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
b3c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
b3d0: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
b3e0: 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
b3f0: 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
b400: 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
b410: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
b420: 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
b430: 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
b440: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
b450: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
b460: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
b470: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
b480: 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
b490: 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
b4a0: 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
b4b0: 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
b4c0: 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
b4d0: 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
b4e0: 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
b4f0: 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
b500: 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
b510: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
b520: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (db);.  sqlite3V
b530: 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73 71  dbeHalt(p);.  sq
b540: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
b550: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  b);..  /* If the
b560: 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
b570: 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
b580: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
b590: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
b5a0: 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
b5b0: 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
b5c0: 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
b5d0: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
b5e0: 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
b5f0: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
b600: 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
b610: 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
b620: 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
b630: 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
b640: 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
b650: 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
b660: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
b670: 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
b680: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
b690: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
b6a0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
b6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
b6c0: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
b6d0: 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
b6e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73  , SQLITE_UTF8, s
b6f0: 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a 20 20  qlite3FreeX);.  
b700: 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
b710: 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70  = p->rc;.      p
b720: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
b730: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
b740: 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
b750: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
b760: 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
b770: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
b780: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
b790: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
b7a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
b7b0: 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
b7c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
b7d0: 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
b7e0: 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
b7f0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
b800: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
b810: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
b820: 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
b830: 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
b840: 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
b850: 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
b860: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
b870: 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
b880: 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
b890: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
b8a0: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 7d 0a   p->rc, 0);.  }.
b8b0: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
b8c0: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
b8d0: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
b8e0: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
b8f0: 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
b900: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
b910: 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
b920: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b930: 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74   p->pTos<&p->aSt
b940: 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d  ack[p->pc<0?0:p-
b950: 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61 53 74 61  >pc] || !p->aSta
b960: 63 6b 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42  ck );.#ifdef VDB
b970: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
b980: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
b990: 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
b9a0: 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
b9b0: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
b9c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
b9d0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
b9e0: 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
b9f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
ba00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
ba10: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
ba20: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
ba30: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
ba40: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
ba50: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
ba60: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
ba70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
ba80: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
ba90: 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
baa0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
bab0: 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
bac0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
bad0: 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
bae0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
baf0: 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
bb00: 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
bb10: 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
bb20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bb30: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
bb40: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
bb50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bb60: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
bb70: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
bb80: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
bb90: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70  _MAGIC_INIT;.  p
bba0: 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20  ->aborted = 0;. 
bbb0: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
bbc0: 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
bbd0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
bbe0: 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
bbf0: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
bc00: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
bc10: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
bc20: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
bc30: 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
bc40: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
bc50: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
bc60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
bc70: 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
bc80: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
bc90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
bca0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
bcb0: 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
bcc0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
bcd0: 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
bce0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
bcf0: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
bd00: 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
bd10: 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
bd20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
bd30: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
bd40: 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72  IC_INIT ){.    r
bd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
bd60: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
bd70: 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
bd80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bd90: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
bda0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
bdb0: 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
bdc0: 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
bdd0: 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
bde0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
bdf0: 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
be00: 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
be10: 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
be20: 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
be30: 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
be40: 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
be50: 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
be60: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
be70: 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
be80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
be90: 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
bea0: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
beb0: 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
bec0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
bed0: 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
bee0: 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
bef0: 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
bf00: 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
bf10: 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
bf20: 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
bf30: 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70  sk&(1<<i))) && p
bf40: 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
bf50: 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
bf60: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
bf70: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
bf80: 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
bf90: 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
bfa0: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
bfb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
bfc0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
bfd0: 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
bfe0: 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
bff0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
c000: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
c010: 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70  urn;.  Cleanup(p
c020: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
c030: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
c040: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
c050: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
c060: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
c070: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
c080: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20   p->db->pVdbe = 
c090: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
c0a0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
c0b0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
c0c0: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
c0d0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70    }.  if( p->aOp
c0e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c0f0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
c100: 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  .      Op *pOp =
c110: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
c120: 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70     freeP3(pOp->p
c130: 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b  3type, pOp->p3);
c140: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c150: 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20  eFree(p->aOp);. 
c160: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
c170: 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
c180: 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65  >nVar);.  sqlite
c190: 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  Free(p->aLabel);
c1a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
c1b0: 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c 65  >aStack);.  rele
c1c0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
c1d0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
c1e0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c1f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
c200: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
c210: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 53  sqliteFree(p->zS
c220: 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ql);.  p->magic 
c230: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
c240: 44 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  D;.  sqliteFree(
c250: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  p);.}../*.** If 
c260: 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
c270: 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
c280: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
c290: 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
c2a0: 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
c2b0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
c2c0: 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76  code.  If no Mov
c2d0: 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  eTo is pending, 
c2e0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
c2f0: 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64  does nothing and
c300: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
c310: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
c320: 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
c330: 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  to(Cursor *p){. 
c340: 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
c350: 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
c360: 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
c370: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
c380: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
c390: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
c3a0: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  t;.#endif.    as
c3b0: 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
c3c0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
c3d0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
c3e0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
c3f0: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
c400: 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
c410: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c420: 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b  ;.    *p->pIncrK
c430: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c  ey = 0;.    p->l
c440: 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f  astRowid = keyTo
c450: 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  Int(p->movetoTar
c460: 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  get);.    p->row
c470: 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
c480: 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  =0;.    if( res<
c490: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c4a0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
c4b0: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  (p->pCursor, &re
c4c0: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
c4d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c4e0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
c4f0: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
c500: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
c510: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  +;.#endif.    p-
c520: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
c530: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
c540: 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
c550: 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74  STALE;.  }.  ret
c560: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c570: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
c580: 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
c590: 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
c5a0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
c5b0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
c5c0: 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
c5d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c5e0: 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74  lRead().** sqlit
c5f0: 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
c600: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
c610: 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a  SerialWrite().**
c620: 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
c630: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
c640: 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
c650: 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
c660: 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
c670: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
c680: 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
c690: 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
c6a0: 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
c6b0: 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
c6c0: 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
c6d0: 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
c6e0: 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
c6f0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
c700: 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
c710: 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
c720: 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
c730: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
c740: 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
c750: 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
c760: 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
c770: 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
c780: 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
c790: 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
c7a0: 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
c7b0: 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
c7c0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
c7d0: 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
c7e0: 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
c7f0: 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
c800: 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
c810: 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
c820: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
c830: 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
c840: 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
c850: 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
c860: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
c870: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
c880: 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
c890: 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
c8a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
c8b0: 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
c8c0: 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
c8d0: 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c910: 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
c930: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
c940: 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
c960: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
c970: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
c980: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
c990: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
c9a0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
c9b0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
c9e0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
c9f0: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
ca10: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
ca20: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
ca30: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
ca40: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
ca50: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
ca60: 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
ca90: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
caa0: 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
cab0: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
cac0: 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
cad0: 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
cb00: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
cb10: 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
cb30: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
cb40: 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
cb50: 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
cb80: 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
cb90: 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
cba0: 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
cbb0: 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
cbc0: 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
cbd0: 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
cbe0: 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
cbf0: 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
cc00: 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
cc10: 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
cc20: 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
cc30: 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
cc40: 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
cc50: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
cc60: 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
cc70: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
cc80: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
cc90: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
cca0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
ccb0: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
ccc0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
ccd0: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
cce0: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
ccf0: 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
cd00: 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
cd10: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
cd20: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
cd30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
cd40: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
cd50: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
cd60: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
cd70: 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
cd80: 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
cd90: 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
cda0: 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30  ((((i64)0x000010
cdb0: 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
cdc0: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
cdd0: 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
cde0: 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
cdf0: 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
ce00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ce10: 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   8+i;.    }.    
ce20: 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69  u = i<0 ? -i : i
ce30: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  ;.    if( u<=127
ce40: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
ce50: 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
ce60: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
ce70: 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
ce80: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
ce90: 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
cea0: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
ceb0: 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
cec0: 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
ced0: 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
cee0: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
cef0: 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
cf00: 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
cf10: 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  ( flags&(MEM_Str
cf20: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
cf30: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
cf40: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
cf50: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
cf60: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20  pMem->u.i;.  }. 
cf70: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
cf80: 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
cf90: 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
cfa0: 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
cfb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cfc0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
cfd0: 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
cfe0: 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
cff0: 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
d000: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d010: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
d020: 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
d030: 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
d040: 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
d050: 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
d060: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
d070: 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
d080: 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
d090: 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
d0a0: 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
d0b0: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
d0c0: 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
d0d0: 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
d0e0: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
d0f0: 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
d100: 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
d110: 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
d120: 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
d130: 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
d140: 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
d150: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
d160: 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
d170: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
d180: 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
d190: 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
d1a0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
d1b0: 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
d1c0: 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
d1d0: 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
d1e0: 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
d1f0: 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
d200: 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
d210: 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
d220: 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
d230: 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
d240: 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
d250: 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
d260: 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
d270: 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
d280: 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
d290: 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
d2a0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
d2b0: 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
d2c0: 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
d2d0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
d2e0: 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
d2f0: 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
d300: 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
d310: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
d320: 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
d330: 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
d340: 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
d350: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
d360: 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
d370: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
d380: 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
d390: 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
d3a0: 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
d3b0: 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
d3c0: 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
d3d0: 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
d3e0: 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
d3f0: 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
d400: 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
d410: 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
d420: 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
d430: 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
d440: 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
d450: 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
d460: 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
d470: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
d480: 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 23 69 66   correct..*/.#if
d490: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
d4a0: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
d4b0: 4f 41 54 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  OAT.static doubl
d4c0: 65 20 66 6c 6f 61 74 53 77 61 70 28 64 6f 75 62  e floatSwap(doub
d4d0: 6c 65 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  le in){.  union 
d4e0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a  {.    double r;.
d4f0: 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
d500: 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
d510: 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
d520: 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
d530: 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
d540: 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
d550: 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
d560: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
d570: 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
d580: 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
d590: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
d5a0: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
d5b0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
d5c0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
d5d0: 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
d5e0: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
d5f0: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
d600: 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
d610: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
d620: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
d630: 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
d640: 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
d650: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
d660: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
d670: 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
d680: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
d690: 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
d6a0: 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77  .  nBuf must alw
d6b0: 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20  ays be.** large 
d6c0: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
d6d0: 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e  he entire field.
d6e0: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
d6f0: 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62   field is.** a b
d700: 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d  lob with a zero-
d710: 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65  filled tail, the
d720: 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65  n buf[] might be
d730: 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a   just the right.
d740: 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20  ** size to hold 
d750: 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70  everything excep
d760: 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66  t for the zero-f
d770: 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20  illed tail.  If 
d780: 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79  buf[].** is only
d790: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
d7a0: 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f  old the non-zero
d7b0: 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e   prefix, then on
d7c0: 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  ly write that.**
d7d0: 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66   prefix into buf
d7e0: 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b  [].  But if buf[
d7f0: 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  ] is large enoug
d800: 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74  h to hold both t
d810: 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64  he.** prefix and
d820: 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77   the tail then w
d830: 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20  rite the prefix 
d840: 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c  and set the tail
d850: 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73   to all.** zeros
d860: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
d870: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
d880: 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
d890: 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
d8a0: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
d8b0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
d8c0: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
d8d0: 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
d8e0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
d8f0: 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
d900: 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
d910: 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
d920: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d930: 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
d940: 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d  f, int nBuf, Mem
d950: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
d960: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20  _format){.  u32 
d970: 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71  serial_type = sq
d980: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
d990: 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66  ype(pMem, file_f
d9a0: 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65  ormat);.  int le
d9b0: 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
d9c0: 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
d9d0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
d9e0: 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
d9f0: 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
da00: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
da10: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
da20: 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
da30: 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
da40: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29  izeof(pMem->r) )
da50: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
da60: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 70 4d 65  dEndianFloat(pMe
da70: 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d  m->r);.      mem
da80: 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72  cpy(&v, &pMem->r
da90: 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
daa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
dab0: 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
dac0: 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
dad0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
dae0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
daf0: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
db00: 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29  ert( len<=nBuf )
db10: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
db20: 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
db30: 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20   = (v&0xFF);.   
db40: 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
db50: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
db60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
db70: 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
db80: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
db90: 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
dba0: 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
dbb0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
dbc0: 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69  _Zero)?pMem->u.i
dbd0: 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
dbe0: 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   == sqlite3VdbeS
dbf0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
dc00: 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
dc10: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
dc20: 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65  <=nBuf );.    le
dc30: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
dc40: 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
dc50: 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
dc60: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
dc70: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
dc80: 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d      len += pMem-
dc90: 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20  >u.i;.      if( 
dca0: 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20  len>nBuf ){.    
dcb0: 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a      len = nBuf;.
dcc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
dcd0: 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
dce0: 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
dcf0: 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
dd00: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
dd10: 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
dd20: 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
dd30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
dd40: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
dd50: 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
dd60: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
dd70: 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
dd80: 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
dd90: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
dda0: 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
ddb0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
ddc0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
ddd0: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
dde0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
ddf0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
de00: 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
de10: 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
de20: 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
de30: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
de40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
de50: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
de60: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
de70: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
dea0: 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
deb0: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
dec0: 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
ded0: 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
dee0: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
def0: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
df00: 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
df10: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
df20: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
df30: 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
df40: 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
df50: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
df60: 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
df70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
df80: 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
df90: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
dfa0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
dfb0: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
dfc0: 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
dfd0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
dfe0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
dff0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
e000: 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
e010: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e020: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
e030: 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
e040: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
e050: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
e060: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e070: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
e080: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
e090: 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
e0a0: 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
e0b0: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
e0c0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
e0d0: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
e0e0: 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
e0f0: 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
e100: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e110: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e120: 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
e130: 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
e140: 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
e150: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
e160: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
e170: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
e180: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
e190: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
e1a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
e1b0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e1c0: 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
e1d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
e1e0: 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
e1f0: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
e200: 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
e210: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
e220: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
e230: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
e240: 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
e250: 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
e260: 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
e270: 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
e280: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
e290: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
e2a0: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
e2b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e2c0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e2d0: 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
e2e0: 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
e2f0: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e300: 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
e310: 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
e320: 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
e330: 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
e340: 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
e350: 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
e360: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e370: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
e380: 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
e390: 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
e3a0: 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
e3b0: 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
e3c0: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
e3d0: 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
e3e0: 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
e3f0: 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
e400: 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
e410: 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
e420: 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
e430: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
e440: 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
e450: 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
e460: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
e470: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
e480: 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
e490: 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
e4a0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e4b0: 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
e4c0: 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  0;.      double 
e4d0: 72 32 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 73  r2 = r1;.      s
e4e0: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e4f0: 6f 61 74 28 72 32 29 3b 0a 20 20 20 20 20 20 61  oat(r2);.      a
e500: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 32  ssert( sizeof(r2
e510: 29 3d 3d 73 69 7a 65 6f 66 28 74 31 29 20 26 26  )==sizeof(t1) &&
e520: 20 6d 65 6d 63 6d 70 28 26 72 32 2c 20 26 74 31   memcmp(&r2, &t1
e530: 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
e540: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
e550: 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
e560: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
e570: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
e580: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
e590: 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
e5a0: 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
e5b0: 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
e5c0: 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
e5d0: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
e5e0: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
e5f0: 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
e600: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
e610: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
e620: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e630: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
e640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
e650: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
e660: 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
e670: 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
e680: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
e690: 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
e6a0: 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  x));.        swa
e6b0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e6c0: 74 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  t(pMem->r);.    
e6d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e6e0: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  = MEM_Real;.    
e6f0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
e700: 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   8;.    }.    ca
e710: 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
e720: 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
e730: 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
e740: 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
e750: 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
e760: 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
e770: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e780: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e790: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
e7a0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
e7b0: 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69   int len = (seri
e7c0: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
e7d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
e7e0: 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
e7f0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
e800: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65  .      pMem->xDe
e810: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  l = 0;.      if(
e820: 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30   serial_type&0x0
e830: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
e840: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
e850: 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  tr | MEM_Ephem;.
e860: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e870: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e880: 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45   = MEM_Blob | ME
e890: 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
e8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65  .      return le
e8b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
e8c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e8d0: 2a 20 54 68 65 20 68 65 61 64 65 72 20 6f 66 20  * The header of 
e8e0: 61 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74  a record consist
e8f0: 73 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20  s of a sequence 
e900: 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20  variable-length 
e910: 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65  integers..** The
e920: 73 65 20 69 6e 74 65 67 65 72 73 20 61 72 65 20  se integers are 
e930: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d  almost always sm
e940: 61 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f  all and are enco
e950: 64 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ded as a single 
e960: 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c  byte..** The fol
e970: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b  lowing macro tak
e980: 65 73 20 61 64 76 61 6e 74 61 67 65 20 74 68 69  es advantage thi
e990: 73 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64  s fact to provid
e9a0: 65 20 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a  e a fast decode.
e9b0: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ** of the intege
e9c0: 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68  rs in a record h
e9d0: 65 61 64 65 72 2e 20 20 49 74 20 69 73 20 66 61  eader.  It is fa
e9e0: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
e9f0: 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72  mon case.** wher
ea00: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73  e the integer is
ea10: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20   a single byte. 
ea20: 20 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20   It is a little 
ea30: 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a  slower when the.
ea40: 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74 77  ** integer is tw
ea50: 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e  o or more bytes.
ea60: 20 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74    But overall it
ea70: 20 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a   is faster..**.*
ea80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ea90: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
eaa0: 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a  equivalent:.**.*
eab0: 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65  *     x = sqlite
eac0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c  3GetVarint32( A,
ead0: 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20   &B );.**.**    
eae0: 20 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20   x = GetVarint( 
eaf0: 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64  A, B );.**.*/.#d
eb00: 65 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28  efine GetVarint(
eb10: 41 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29  A,B)  ((B = *(A)
eb20: 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71  )<=0x7f ? 1 : sq
eb30: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
eb40: 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20  (A, &B))../*.** 
eb50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
eb60: 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
eb70: 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
eb80: 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69  ex records speci
eb90: 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65  fied by .** {nKe
eba0: 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b  y1, pKey1} and {
ebb0: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72  nKey2, pKey2}, r
ebc0: 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74  eturning a negat
ebd0: 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
ebe0: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
ebf0: 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   if {nKey1, pKey
ec00: 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  1} is less than,
ec10: 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
ec20: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e   greater than {n
ec30: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42  Key2, pKey2}.  B
ec40: 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  oth Key1 and Key
ec50: 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73  2 must be byte s
ec60: 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73  trings.** compos
ec70: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
ec80: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
ec90: 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69  f the VDBE..*/.i
eca0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
ecb0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76  cordCompare(.  v
ecc0: 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20  oid *userData,. 
ecd0: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
ece0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a  t void *pKey1, .
ecf0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
ed00: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
ed10: 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  {.  KeyInfo *pKe
ed20: 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f  yInfo = (KeyInfo
ed30: 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33  *)userData;.  u3
ed40: 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20  2 d1, d2;       
ed50: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
ed60: 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
ed70: 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
ed80: 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78  .  u32 idx1, idx
ed90: 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  2;      /* Offse
eda0: 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
edb0: 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
edc0: 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
edd0: 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f  Hdr1, szHdr2;  /
ede0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
edf0: 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
ee00: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
ee10: 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
ee20: 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
ee30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
ee40: 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
ee50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
ee60: 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ey1;.  const uns
ee70: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
ee80: 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  2 = (const unsig
ee90: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32  ned char *)pKey2
eea0: 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20  ;..  Mem mem1;. 
eeb0: 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d   Mem mem2;.  mem
eec0: 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
eed0: 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e  ->enc;.  mem2.en
eee0: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
eef0: 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 47  c;.  .  idx1 = G
ef00: 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c 20  etVarint(aKey1, 
ef10: 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
ef20: 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d  szHdr1;.  idx2 =
ef30: 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 32   GetVarint(aKey2
ef40: 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20  , szHdr2);.  d2 
ef50: 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65  = szHdr2;.  nFie
ef60: 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
ef70: 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
ef80: 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
ef90: 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20  dx2<szHdr2 ){.  
efa0: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
efb0: 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69  e1;.    u32 seri
efc0: 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f  al_type2;..    /
efd0: 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
efe0: 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
eff0: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
f000: 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
f010: 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69   idx1 += GetVari
f020: 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  nt( aKey1+idx1, 
f030: 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
f040: 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
f050: 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
f060: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
f070: 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
f080: 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20  break;.    idx2 
f090: 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b  += GetVarint( aK
f0a0: 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61 6c  ey2+idx2, serial
f0b0: 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69 66  _type2 );.    if
f0c0: 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73  ( d2>=nKey2 && s
f0d0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f0e0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
f0f0: 79 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype2)>0 ) break;
f100: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
f110: 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
f120: 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
f130: 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
f140: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
f150: 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
f160: 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
f170: 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71  1);.    d2 += sq
f180: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
f190: 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73  et(&aKey2[d2], s
f1a0: 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65  erial_type2, &me
f1b0: 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m2);..    /* Do 
f1c0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
f1d0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
f1e0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
f1f0: 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69  (&mem1, &mem2, i
f200: 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
f210: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
f220: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e  );.    if( mem1.
f230: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
f240: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
f250: 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a  Release(&mem1);.
f260: 20 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61      if( mem2.fla
f270: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73  gs & MEM_Dyn ) s
f280: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
f290: 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20  ease(&mem2);.   
f2a0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
f2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f2c0: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
f2d0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b   /* One of the k
f2e0: 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
f2f0: 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74  ields, but all t
f300: 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
f310: 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20  that point.  ** 
f320: 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
f330: 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20  he incrKey flag 
f340: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
f350: 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a  e second key is.
f360: 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20    ** treated as 
f370: 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  larger..  */.  i
f380: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
f390: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e  if( pKeyInfo->in
f3a0: 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  crKey ){.      r
f3b0: 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  c = -1;.    }els
f3c0: 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29  e if( d1<nKey1 )
f3d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
f3e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32      }else if( d2
f3f0: 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20  <nKey2 ){.      
f400: 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  rc = -1;.    }. 
f410: 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
f420: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
f430: 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
f440: 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20  Field.          
f450: 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f       && pKeyInfo
f460: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
f470: 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
f480: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f490: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f4a0: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69  argument is an i
f4b0: 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f  ndex entry compo
f4c0: 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  sed using the OP
f4d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
f4e0: 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  de..** The last 
f4f0: 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65  entry in this re
f500: 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61  cord should be a
f510: 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69  n integer (speci
f520: 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  fically.** an in
f530: 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54  teger rowid).  T
f540: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f550: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
f560: 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68  f bytes in.** th
f570: 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  at integer..*/.i
f580: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
f590: 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20  xRowidLen(const 
f5a0: 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
f5b0: 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
f5c0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
f5d0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
f5e0: 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
f5f0: 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
f600: 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71  e rowid */..  sq
f610: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
f620: 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a  (aKey, &szHdr);.
f630: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
f640: 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72  nt32(&aKey[szHdr
f650: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
f660: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
f670: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
f680: 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
f690: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  }.  ../*.** pCur
f6a0: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
f6b0: 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
f6c0: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
f6d0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
f6e0: 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
f6f0: 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
f700: 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
f710: 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
f720: 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
f730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
f740: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
f750: 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
f760: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
f770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f780: 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72  beIdxRowid(BtCur
f790: 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
f7a0: 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
f7b0: 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
f7c0: 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
f7d0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
f7e0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
f7f0: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
f800: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
f810: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
f820: 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
f830: 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
f840: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
f850: 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
f860: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
f870: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
f880: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
f890: 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
f8a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f8b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
f8c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
f8d0: 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
f8e0: 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
f8f0: 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
f900: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
f910: 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   rc;.  }.  sqlit
f920: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
f930: 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b  8*)m.z, &szHdr);
f940: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
f950: 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
f960: 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52  szHdr-1], &typeR
f970: 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69  owid);.  lenRowi
f980: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
f990: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
f9a0: 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  eRowid);.  sqlit
f9b0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
f9c0: 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
f9d0: 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
f9e0: 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
f9f0: 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
fa00: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
fa10: 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
fa20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fa30: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
fa40: 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
fa50: 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
fa60: 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20  sor pC is point 
fa70: 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
fa80: 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
fa90: 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20  pKey (of length 
faa0: 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e  nKey).  Write in
fab0: 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
fac0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
fad0: 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
fae0: 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
faf0: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
fb00: 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
fb10: 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20  ater than pKey. 
fb20: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
fb30: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
fb40: 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68  .** pKey is eith
fb50: 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
fb60: 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
fb70: 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
fb80: 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
fb90: 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
fba0: 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
fbb0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
fbc0: 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
fbd0: 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
fbe0: 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ell..*/.int sqli
fbf0: 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
fc00: 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a  pare(.  Cursor *
fc10: 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
fc20: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
fc30: 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
fc40: 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  inst */.  int nK
fc50: 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ey, const u8 *pK
fc60: 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  ey,   /* The key
fc70: 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
fc80: 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fca0: 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
fcb0: 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
fcc0: 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
fcd0: 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
fce0: 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
fcf0: 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
fd00: 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f  sor;.  int lenRo
fd10: 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  wid;.  Mem m;.. 
fd20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
fd30: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
fd40: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
fd50: 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
fd60: 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
fd70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fd80: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
fd90: 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
fda0: 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
fdb0: 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
fdc0: 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
fdd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
fde0: 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
fdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
fe00: 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a  owidLen((u8*)m.z
fe10: 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
fe20: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
fe30: 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66  pare(pC->pKeyInf
fe40: 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c  o, m.n-lenRowid,
fe50: 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79   m.z, nKey, pKey
fe60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
fe70: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
fe80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fe90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
fea0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
feb0: 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
fec0: 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
fed0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
fee0: 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
fef0: 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
ff00: 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
ff10: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
ff20: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
ff30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
ff40: 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 64 62 2d   nChange){.  db-
ff50: 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
ff60: 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
ff70: 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
ff80: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
ff90: 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
ffa0: 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
ffb0: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
ffc0: 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
ffd0: 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
ffe0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fff0: 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
10000 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
10010 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
10020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
10030 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
10040 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
10050 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
10060 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
10070 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
10080 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
10090 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
100a0 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
100b0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
100c0 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
100d0 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
100e0 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
100f0 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
10100 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
10110 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
10120 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
10130 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
10140 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
10150 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
10160 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
10170 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
10180 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
10190 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
101a0 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
101b0 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
101c0 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
101d0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
101e0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
101f0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
10200 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
10210 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
10220 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
10230 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
10240 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
10250 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
10260 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10270 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
10280 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
10290 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
102a0 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.