/ Hex Artifact Content
Login

Artifact b0aeed4ff33352904b392ee6c7408bae5b141b9b:


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 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
02f0: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0300: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0310: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0320: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0330: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0340: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0350: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0360: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0370: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0380: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
0390: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03a0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03c0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03d0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
03f0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0400: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0410: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0420: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0430: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0440: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0450: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0460: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 64  ro(db, sizeof(Vd
0470: 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  be) );.  if( p==
0480: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0490: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66  p->db = db;.  if
04a0: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
04b0: 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50     db->pVdbe->pP
04c0: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70  rev = p;.  }.  p
04d0: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56  ->pNext = db->pV
04e0: 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  dbe;.  p->pPrev 
04f0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65  = 0;.  db->pVdbe
0500: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = p;.  p->magic
0510: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
0520: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  IT;.  return p;.
0530: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0540: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0550: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0560: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0580: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0590: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
05a0: 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20   n){.  if( p==0 
05b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
05c0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05d0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
05e0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
05f0: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a  ->db, z, n);.}..
0600: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0610: 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20   SQL associated 
0620: 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64 20  with a prepared 
0630: 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e  statement.*/.con
0640: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0650: 56 64 62 65 47 65 74 53 71 6c 28 56 64 62 65 20  VdbeGetSql(Vdbe 
0660: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
0670: 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >zSql;.}../*.** 
0680: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
0690: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
06a0: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
06b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
06c0: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
06d0: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
06e0: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
06f0: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e  char *zTmp;.  in
0700: 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20  t nTmp;.  tmp = 
0710: 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42  *pA;.  *pA = *pB
0720: 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20  ;.  *pB = tmp;. 
0730: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78   pTmp = pA->pNex
0740: 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d  t;.  pA->pNext =
0750: 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42   pB->pNext;.  pB
0760: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a  ->pNext = pTmp;.
0770: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72    pTmp = pA->pPr
0780: 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20  ev;.  pA->pPrev 
0790: 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pB->pPrev;.  p
07a0: 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b  B->pPrev = pTmp;
07b0: 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53  .  zTmp = pA->zS
07c0: 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d  ql;.  pA->zSql =
07d0: 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d   pB->zSql;.  pB-
07e0: 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20  >zSql = zTmp;.  
07f0: 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b  nTmp = pA->nSql;
0800: 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42  .  pA->nSql = pB
0810: 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53  ->nSql;.  pB->nS
0820: 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69  ql = nTmp;.}..#i
0830: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0840: 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61  G./*.** Turn tra
0850: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a  cing on or off.*
0860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0870: 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c  beTrace(Vdbe *p,
0880: 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20   FILE *trace){. 
0890: 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63   p->trace = trac
08a0: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
08b0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08c0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
08d0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
08e0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
08f0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
0900: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0910: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0920: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0930: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0940: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0950: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 0a 2a  tain exactly N.*
0960: 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 56 64 62 65  * elements. Vdbe
0970: 2e 6e 4f 70 41 6c 6c 6f 63 20 69 73 20 73 65 74  .nOpAlloc is set
0980: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
0990: 6e 65 77 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  new size of.** t
09a0: 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
09b0: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
09c0: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
09d0: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
09e0: 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64  the array,.** Vd
09f0: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0a00: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a10: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a20: 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e  is so that.** an
0a30: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0a40: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
0a50: 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  be correctly dea
0a60: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
0aa0: 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  izeOpArray(Vdbe 
0ab0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  *p, int N){.  in
0ac0: 74 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d  t runMode = p->m
0ad0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
0ae0: 5f 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d  _RUN;.  if( runM
0af0: 6f 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c  ode || p->nOpAll
0b00: 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  oc<N ){.    Vdbe
0b10: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  Op *pNew;.    in
0b20: 74 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30  t nNew = N + 100
0b30: 2a 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20  *(!runMode);.   
0b40: 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70   int oldSize = p
0b50: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20  ->nOpAlloc;.    
0b60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
0b70: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e  ealloc(p->aOp, n
0b80: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0b90: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
0ba0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  .      p->nOpAll
0bb0: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
0bc0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bd0: 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f        if( nNew>o
0be0: 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ldSize ){.      
0bf0: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
0c00: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e  [oldSize], 0, (n
0c10: 4e 65 77 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a  New-oldSize)*siz
0c20: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 20 20  eof(Op));.      
0c30: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
0c40: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
0c50: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
0c60: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
0c70: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0c80: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0c90: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0ca0: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0cb0: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0cc0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0cd0: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
0ce0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
0cf0: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
0d00: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
0d10: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
0d20: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
0d40: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
0d50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
0d60: 2a 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20 20  **    p1, p2    
0d70: 20 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20        First two 
0d80: 6f 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73  of the three pos
0d90: 73 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a  sible operands..
0da0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0db0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0dc0: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0dd0: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0de0: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0df0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0e00: 33 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  3() function to 
0e10: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0e20: 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70   of the P3.** op
0e30: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56  lite3VdbeAddOp(V
0e50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
0e60: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
0e70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
0e80: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
0e90: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
0ea0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0eb0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0ec0: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
0ed0: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a  <=i ){.    resiz
0ee0: 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31 29  eOpArray(p, i+1)
0ef0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  ;.    if( p->db-
0f00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
0f10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
0f30: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
0f40: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
0f50: 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20  ->opcode = op;. 
0f60: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20   pOp->p1 = p1;. 
0f70: 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20   pOp->p2 = p2;. 
0f80: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
0f90: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
0fa0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0fb0: 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  xpired = 0;.#ifd
0fc0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64    if( sqlite3_vd
0fe0: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29  be_addop_trace )
0ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
1000: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
1010: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  p[i]);.#endif.  
1020: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
1030: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1040: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1050: 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f 0a  he p3 value..*/.
1060: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f  int sqlite3VdbeO
1070: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
1080: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1090: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
10a0: 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29 7b  zP3,int p3type){
10b0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
10c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70  lite3VdbeAddOp(p
10d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20  , op, p1, p2);. 
10e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10f0: 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP3(p, addr, zP
1100: 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72 65  3, p3type);.  re
1110: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1120: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1130: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1140: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1150: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1160: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1170: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1180: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
1190: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
11a0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
11b0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
11c0: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
11d0: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
11e0: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
11f0: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1200: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1210: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1220: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1230: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1240: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1250: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1260: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1270: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1280: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
1290: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
12a0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
12b0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
12c0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
12d0: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
12e0: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
12f0: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1300: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1310: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1320: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1330: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1340: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1350: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1360: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1370: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1380: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
1390: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
13a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
13b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13c0: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
13d0: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
13e0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
13f0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1400: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1410: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
1420: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d  nLabelAlloc = p-
1430: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1440: 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62   10;.    p->aLab
1450: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1460: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1470: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
14b0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
14c0: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
14d0: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
14e0: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
14f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1500: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1510: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1520: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1530: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1540: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1550: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
1560: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
1570: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
1580: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1590: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
15a0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
15b0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
15c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
15d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
15e0: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
15f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1600: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1610: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
1630: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
1640: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
1650: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1660: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
1670: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1680: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1690: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
16a0: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
16b0: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
16c0: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
16d0: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
16e0: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
16f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1700: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1710: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1720: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
1730: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
1740: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
1750: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
1760: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
1770: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
1780: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
1790: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
17a0: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
17b0: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
17c0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
17d0: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
17e0: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
17f0: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1800: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1810: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1820: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
1830: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
1840: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
1850: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
1860: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
1870: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
1880: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
1890: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
18a0: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
18b0: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
18c0: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
18d0: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
18e0: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
18f0: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1900: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1910: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1920: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
1930: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
1940: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
1950: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
1960: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
1970: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
1980: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1990: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
19a0: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
19b0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
19c0: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
19d0: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
19e0: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
19f0: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1a00: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1a10: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1a20: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
1a30: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
1a40: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
1a50: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
1a60: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
1a70: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
1a80: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1a90: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1aa0: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1ab0: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1ac0: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1ad0: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1ae0: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1af0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1b00: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1b10: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1b20: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1b30: 55 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29  USH_MASK_1)<<16)
1b40: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1b50: 4b 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_2 + (((unsigne
1b60: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29  d)NOPUSH_MASK_3)
1b70: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1b80: 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e  H_MASK_4 + (((un
1b90: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1ba0: 53 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_5)<<16),.    
1bb0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20  NOPUSH_MASK_6 + 
1bc0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1bd0: 53 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c  SH_MASK_7)<<16),
1be0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1bf0: 5f 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _8 + (((unsigned
1c00: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c  )NOPUSH_MASK_9)<
1c10: 3c 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65  <16).  };.  asse
1c20: 72 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20  rt( op<32*5 );. 
1c30: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f   return (masks[o
1c40: 70 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26  p>>5] & (1<<(op&
1c50: 30 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e  0x1F)));.}..#ifn
1c60: 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
1c70: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1c80: 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20  NoPush(u8 op){. 
1c90: 20 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f   return opcodeNo
1ca0: 50 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64  Push(op);.}.#end
1cb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  if../*.** Loop t
1cc0: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
1cd0: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
1ce0: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
1cf0: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45  e negative..** E
1d00: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
1d10: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
1d20: 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79  lve the label by
1d30: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a   setting the P2.
1d40: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  ** value to its 
1d50: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
1d60: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1d70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d80: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
1d90: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
1da0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
1db0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
1dc0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
1dd0: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1de0: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
1df0: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
1e00: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
1e10: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
1e20: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
1e30: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
1e40: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
1e50: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
1e60: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
1e70: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
1e80: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  *.** The integer
1e90: 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73   *pMaxStack is s
1ea0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1eb0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  m number of vdbe
1ec0: 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65   stack.** entrie
1ed0: 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e  s that static an
1ee0: 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74  alysis reveals t
1ef0: 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68  his program migh
1f00: 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t need..**.** Th
1f10: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
1f20: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
1f30: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ng optimization:
1f40: 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a    It scans for.*
1f50: 2a 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69  * Halt instructi
1f60: 6f 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51  ons where P1==SQ
1f70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1f80: 6f 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20  or P2==OE_Abort 
1f90: 6f 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73  or for.** IdxIns
1fa0: 65 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ert instructions
1fb0: 20 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49   where P2!=0.  I
1fc0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1fd0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e  ction is.** foun
1fe0: 64 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74  d, then every St
1ff0: 61 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74  atement instruct
2000: 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74  ion is changed t
2010: 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a  o a Noop.  In.**
2020: 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76   this way, we av
2030: 6f 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65  oid creating the
2040: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2050: 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73  al file unnecess
2060: 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  arily..*/.static
2070: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
2080: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
2090: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
20a0: 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b  , int *pMaxStack
20b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
20c0: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a  t nMaxArgs = 0;.
20d0: 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20    int nMaxStack 
20e0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a  = p->nOp;.  Op *
20f0: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
2100: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
2110: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
2120: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
2130: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
2140: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
2150: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
2160: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
2170: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
2180: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
2190: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
21a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
21b0: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
21c0: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a  de==OP_AggStep .
21d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21e0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
21f0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f  .        || opco
2200: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23  de==OP_VUpdate.#
2210: 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2220: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
2230: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2240: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
2250: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
2260: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20  de==OP_Halt ){. 
2270: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
2280: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
2290: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
22a0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
22b0: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
22c0: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
22d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22e0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
22f0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
2300: 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42     hasStatementB
2310: 65 67 69 6e 20 3d 20 31 3b 0a 23 69 66 6e 64 65  egin = 1;.#ifnde
2320: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2330: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
2340: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2350: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2360: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2370: 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53  e ){.      doesS
2380: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
2390: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
23a0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
23b0: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
23c0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
23d0: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
23e0: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
23f0: 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e 6f 70  sert( pOp[-2].op
2400: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2410: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2420: 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-2].p1;.      
2430: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2440: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2450: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2460: 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68  if( opcodeNoPush
2470: 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20  (opcode) ){.    
2480: 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20    nMaxStack--;. 
2490: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
24a0: 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69  p->p2>=0 ) conti
24b0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
24c0: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
24d0: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70  Label );.    pOp
24e0: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31  ->p2 = aLabel[-1
24f0: 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20  -pOp->p2];.  }. 
2500: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
2510: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
2520: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
2530: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
2540: 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78 53  axArgs;.  *pMaxS
2550: 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63 6b  tack = nMaxStack
2560: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65  ;..  /* If we ne
2570: 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73  ver rollback a s
2580: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
2590: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65  tion, then state
25a0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
25b0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e  ctions are not n
25c0: 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67  eeded.  So chang
25d0: 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65  e every OP_State
25e0: 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ment.  ** opcode
25f0: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2600: 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20  .  This avoid a 
2610: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2620: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2630: 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20  .  ** which can 
2640: 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20  be expensive on 
2650: 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a  some platforms..
2660: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74    */.  if( hasSt
2670: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20  atementBegin && 
2680: 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f  !doesStatementRo
2690: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
26a0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
26b0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
26c0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
26d0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
26e0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
26f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   ){.        pOp-
2700: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
2710: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2720: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2730: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
2740: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2750: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
2760: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
2770: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2780: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
2790: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
27a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
27b0: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
27c0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
27d0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
27e0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
27f0: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2800: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2810: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2820: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2830: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2850: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
2860: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
2870: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
2880: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
2890: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
28a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
28b0: 4e 49 54 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f  NIT );.  resizeO
28c0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
28d0: 20 2b 20 6e 4f 70 29 3b 0a 20 20 69 66 28 20 70   + nOp);.  if( p
28e0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
28f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
2900: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
2910: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
2920: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
2930: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
2940: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
2950: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
2960: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
2970: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
2980: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
2990: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
29a0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
29b0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
29c0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
29d0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
29e0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
29f0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
2a00: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
2a10: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
2a20: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
2a30: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
2a40: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
2a50: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
2a60: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
2a70: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a80: 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  G.      if( sqli
2a90: 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
2aa0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
2ab0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
2ac0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
2ad0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
2ae0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2af0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
2b00: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
2b10: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2b20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2b30: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
2b40: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
2b50: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2b60: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2b70: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
2b80: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
2b90: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
2ba0: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
2bb0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
2bc0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
2bd0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
2be0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
2bf0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
2c00: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
2c10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2c20: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP1(Vdbe *p, in
2c30: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2c40: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2c50: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2c60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2c70: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2c80: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2c90: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2ca0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2cb0: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
2cc0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2cd0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2ce0: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
2cf0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2d00: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
2d10: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
2d20: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
2d30: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
2d40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d50: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
2d60: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2d70: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2d80: 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20  rt( val>=0 );.  
2d90: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2da0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2db0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2dc0: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
2dd0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
2de0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2df0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
2e00: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2e10: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
2e20: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
2e30: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
2e40: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2e50: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
2e60: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2e70: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2e80: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
2e90: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2ea0: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
2eb0: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
2ec0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
2ed0: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
2ee0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
2ef0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
2f00: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
2f10: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
2f20: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
2f30: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
2f40: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
2f50: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
2f60: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
2f70: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75  meralFunction(Fu
2f80: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
2f90: 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65  if( pDef && (pDe
2fa0: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
2fb0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
2fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2fd0: 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a  free(pDef);.  }.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2ff0: 61 20 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65  a P3 value if ne
3000: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
3010: 69 63 20 76 6f 69 64 20 66 72 65 65 50 33 28 69  ic void freeP3(i
3020: 6e 74 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20  nt p3type, void 
3030: 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29  *p3){.  if( p3 )
3040: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 33  {.    switch( p3
3050: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
3060: 73 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P3_DYNAMIC:. 
3070: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59       case P3_KEY
3080: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
3090: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
30a0: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
30b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b  qlite3_free(p3);
30c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
30d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
30e0: 73 65 20 50 33 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P3_MPRINTF: {
30f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3100: 5f 66 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20  _free(p3);.     
3110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3120: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
3130: 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20  VDBEFUNC: {.    
3140: 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56      VdbeFunc *pV
3150: 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46  dbeFunc = (VdbeF
3160: 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20  unc *)p3;.      
3170: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
3180: 75 6e 63 74 69 6f 6e 28 70 56 64 62 65 46 75 6e  unction(pVdbeFun
3190: 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  c->pFunc);.     
31a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
31b0: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
31c0: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
31d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31e0: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
31f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3200: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33   }.      case P3
3210: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
3220: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
3230: 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44  lFunction((FuncD
3240: 65 66 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ef*)p3);.       
3250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3260: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45        case P3_ME
3270: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M: {.        sql
3280: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
3290: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33  qlite3_value*)p3
32a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32c0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68    }.}.../*.** Ch
32d0: 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73  ange N opcodes s
32e0: 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20  tarting at addr 
32f0: 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f  to No-ops..*/.vo
3300: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3310: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
3320: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3330: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
3340: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
3350: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
3360: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
3370: 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20  while( N-- ){.  
3380: 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e      freeP3(pOp->
3390: 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29  p3type, pOp->p3)
33a0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
33b0: 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  Op, 0, sizeof(pO
33c0: 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f  p[0]));.      pO
33d0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
33e0: 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b  oop;.      pOp++
33f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
3400: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3410: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
3420: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3430: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3440: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3450: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
3460: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3470: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3480: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3490: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
34a0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
34b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
34c0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
34d0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
34e0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
34f0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
3500: 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P3 operand is d
3510: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
3520: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
3530: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
3540: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
3550: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3560: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
3570: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
3580: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
3590: 79 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74  ytes of zP3 up t
35a0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
35b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
35c0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
35d0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
35e0: 74 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a  tes of zP3..**.*
35f0: 2a 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e  * If n==P3_KEYIN
3600: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
3610: 20 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65   zP3 is a pointe
3620: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
3630: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
3640: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
3650: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
3660: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
3670: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3680: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
3690: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
36a0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
36b0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
36c0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
36d0: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
36e0: 74 20 7a 50 33 20 70 6f 69 6e 74 73 20 74 6f 20  t zP3 points to 
36f0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
3700: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
3710: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
3720: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
3730: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3740: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
3750: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
3760: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
3770: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
3780: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
3790: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
37a0: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
37b0: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
37c0: 6e 20 28 50 33 5f 53 54 41 54 49 43 2c 20 50 33  n (P3_STATIC, P3
37d0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
37e0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 33  ndicate that zP3
37f0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
3800: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
3810: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
3820: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
3830: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
3840: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
3850: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
3860: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
3870: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
3880: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
3890: 65 6e 20 63 68 61 6e 67 65 20 50 33 20 6f 6e 20  en change P3 on 
38a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
38b0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
38c0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
38d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
38e0: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP3(Vdbe *p, int
38f0: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
3900: 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP3, int n){.
3910: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73    Op *pOp;.  ass
3920: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
3930: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3940: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
3950: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  p==0 || p->aOp==
3960: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
3970: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
3980: 69 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49  if (n != P3_KEYI
3990: 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65  NFO) {.      fre
39a0: 65 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  eP3(n, (void*)*(
39b0: 63 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20  char**)&zP3);.  
39c0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
39d0: 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30    }.  if( addr<0
39e0: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
39f0: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
3a00: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69  ->nOp - 1;.    i
3a10: 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75  f( addr<0 ) retu
3a20: 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20  rn;.  }.  pOp = 
3a30: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3a40: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3a50: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3a60: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3a70: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3a80: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
3a90: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3aa0: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P3_NOTUSED;.  }
3ab0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b  else if( n==P3_K
3ac0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
3ad0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
3ae0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
3af0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
3b00: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
3b10: 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP3)->nField;. 
3b20: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3b30: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3b40: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3b50: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3b60: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3b70: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3b80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
3b90: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
3ba0: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
3bb0: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3bc0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3bd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3be0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3bf0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3c00: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
3c10: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3c20: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3c30: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3c40: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3c50: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3c60: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
3c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3c80: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3c90: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
3ca0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3cb0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
3cc0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3cd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3ce0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3cf0: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
3d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
3d10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3d20: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
3d30: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
3d40: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
3d50: 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59  se if( n==P3_KEY
3d60: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
3d70: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
3d80: 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f  har*)zP3;.    pO
3d90: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b  p->p3type = P3_K
3da0: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3db0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3dc0: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
3dd0: 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  zP3;.    pOp->p3
3de0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3df0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3e00: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33  ) n = strlen(zP3
3e10: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
3e20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
3e30: 70 28 70 2d 3e 64 62 2c 20 7a 50 33 2c 20 6e 29  p(p->db, zP3, n)
3e40: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3e50: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
3e60: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
3e70: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  DEBUG./*.** Repl
3e80: 61 63 65 20 74 68 65 20 50 33 20 66 69 65 6c 64  ace the P3 field
3e90: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
3ea0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
3eb0: 72 75 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ruction with.** 
3ec0: 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f  comment text..*/
3ed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3ee0: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
3ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
3f00: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
3f10: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73  a_list ap;.  ass
3f20: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
3f30: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
3f40: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
3f50: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
3f60: 4f 70 2d 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 70  Op-1].p3==0 || p
3f70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3f80: 65 64 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  ed );.  va_start
3f90: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
3fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3fb0: 67 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69  geP3(p, -1, sqli
3fc0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
3fd0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c  b, zFormat, ap),
3fe0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
3ff0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
4000: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
4010: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
4020: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
4030: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
4040: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
4050: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4060: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4070: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4080: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
4090: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
40a0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
40b0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
40c0: 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  led );.  return 
40d0: 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ((addr>=0 && add
40e0: 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61  r<p->nOp)?(&p->a
40f0: 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a  Op[addr]):0);.}.
4100: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4110: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
4120: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
4130: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
4140: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
4150: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
4160: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
4170: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4180: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
4190: 72 69 62 65 73 20 74 68 65 20 50 33 20 70 61 72  ribes the P3 par
41a0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
41b0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
41c0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
41d0: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
41e0: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
41f0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
4200: 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63  layP3(Op *pOp, c
4210: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
4220: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
4230: 7a 50 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  zP3;.  assert( n
4240: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
4250: 69 74 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70  itch( pOp->p3typ
4260: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33  e ){.    case P3
4270: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
4280: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
4290: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
42a0: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
42b0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
42c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
42d0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
42e0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
42f0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4300: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4310: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4320: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4330: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4340: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4350: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4360: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
4370: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
4380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4390: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
43a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
43b0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
43c0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
43d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
43e0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4400: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4410: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4420: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4430: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4440: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4450: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4460: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
4470: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4480: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
4490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
44a0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
44b0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
44c0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
44d0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
44e0: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
44f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4500: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4510: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4520: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4540: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4550: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4560: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
4570: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
4580: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33  emp );.      zP3
4590: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
45a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
45b0: 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51   case P3_COLLSEQ
45c0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
45d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
45e0: 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Seq*)pOp->p3;.  
45f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4600: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4610: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
4620: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
4630: 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  e);.      zP3 = 
4640: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
4650: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4660: 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b  se P3_FUNCDEF: {
4670: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
4680: 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a  pDef = (FuncDef*
4690: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
46a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
46b0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
46c0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
46d0: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
46e0: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
46f0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4700: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
4710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4720: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
4730: 73 65 20 50 33 5f 56 54 41 42 3a 20 7b 0a 20 20  se P3_VTAB: {.  
4740: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
4750: 20 2a 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74   *pVtab = (sqlit
4760: 65 33 5f 76 74 61 62 2a 29 70 4f 70 2d 3e 70 33  e3_vtab*)pOp->p3
4770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4780: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4790: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
47a0: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
47b0: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
47c0: 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a     zP3 = zTemp;.
47d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
47f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
4800: 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  P3 = pOp->p3;.  
4810: 20 20 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c      if( zP3==0 |
4820: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
4830: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
4840: 20 20 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20    zP3 = "";.    
4850: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4860: 61 73 73 65 72 74 28 20 7a 50 33 21 3d 30 20 29  assert( zP3!=0 )
4870: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b 0a  ;.  return zP3;.
4880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  }.#endif...#if d
4890: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
48a0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
48b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
48c0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
48d0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
48e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
48f0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
4900: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
4910: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
4920: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
4930: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
4940: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61  char *zP3;.  cha
4950: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74  r zPtr[50];.  st
4960: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4970: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
4980: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
4990: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
49a0: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
49b0: 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73  out;.  zP3 = dis
49c0: 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72  playP3(pOp, zPtr
49d0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
49e0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
49f0: 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20   zFormat1,.     
4a00: 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f   pc, sqlite3Opco
4a10: 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63  deNames[pOp->opc
4a20: 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode], pOp->p1, p
4a30: 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20  Op->p2, zP3);.  
4a40: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
4a50: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4a60: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
4a70: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
4a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a90: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4aa0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
4ab0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77    if( p ){.    w
4ac0: 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20  hile( N-->0 ){. 
4ad0: 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32       assert( N<2
4ae0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
4af0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 73 71  ].db );.      sq
4b00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
4b10: 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a  ase(p++);.    }.
4b20: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
4b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
4b40: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
4b50: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
4b60: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
4b70: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
4b80: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
4b90: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
4ba0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
4bb0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
4bc0: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
4bd0: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
4be0: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
4bf0: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
4c00: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4c10: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
4c20: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
4c30: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a  t "EXPLAIN"..*/.
4c40: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c  int sqlite3VdbeL
4c50: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20  ist(.  Vdbe *p  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
4c80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4c90: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
4ca0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
4cb0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
4cc0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
4cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
4ce0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
4cf0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4d00: 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72  _MISUSE;.  asser
4d10: 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  t( db->magic==SQ
4d20: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20  LITE_MAGIC_BUSY 
4d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
4d40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
4d50: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
4d60: 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  USY );..  /* Eve
4d70: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
4d80: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 75  code does not pu
4d90: 74 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  t dynamic string
4da0: 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  s onto the.  ** 
4db0: 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79 20  the stack, they 
4dc0: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
4dd0: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
4de0: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
4df0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
4e00: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
4e10: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
4e20: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
4e30: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d  /.  if( p->pTos=
4e40: 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29  =&p->aStack[4] )
4e50: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
4e60: 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c  Array(p->aStack,
4e70: 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65   5);.  }.  p->re
4e80: 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20  sOnStack = 0;.. 
4e90: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
4ea0: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
4eb0: 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65  i<p->nOp && p->e
4ec0: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
4ed0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
4ee0: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
4ef0: 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  f( i>=p->nOp ){.
4f00: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
4f10: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
4f20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
4f30: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
4f40: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
4f50: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
4f60: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
4f70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
4f80: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
4f90: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
4fa0: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 45  ErrMsg, sqlite3E
4fb0: 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20 28 63  rrStr(p->rc), (c
4fc0: 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65  har*)0);.  }else
4fd0: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
4fe0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
4ff0: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *pMem = p->a
5000: 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d  Stack;.    pMem-
5010: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5020: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  ;.    pMem->type
5030: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5040: 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  R;.    pMem->u.i
5050: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
5080: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  counter */.    p
5090: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
50a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
50b0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
50c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d  _Term;.    pMem-
50d0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
50e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
50f0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a  Op->opcode];  /*
5100: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 61   Opcode */.    a
5110: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5120: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
5130: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5140: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
5150: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5160: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
5170: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
5180: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5190: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
51a0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
51b0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
51e0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
51f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5200: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
5210: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5220: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
5230: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5240: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
5270: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5280: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5290: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
52a0: 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68 65 6d 7c  ags = MEM_Ephem|
52b0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
52c0: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
52d0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
52e0: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
52f0: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
5300: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
5310: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
5320: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65  >z!=0 );.    pMe
5330: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
5340: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
5350: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5360: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
5370: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
5380: 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43  8;..    p->nResC
5390: 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32 2a 28 70  olumn = 5 - 2*(p
53a0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
53b0: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d 65 6d    p->pTos = pMem
53c0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
53d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e  LITE_OK;.    p->
53e0: 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 31 3b 0a  resOnStack = 1;.
53f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5400: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
5410: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
5420: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
5430: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
5440: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
5450: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
5460: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
5470: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
5480: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
5490: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
54a0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
54b0: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
54c0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
54d0: 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  pOp;.  if( nOp<1
54e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
54f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31   = &p->aOp[nOp-1
5500: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
5510: 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26  code==OP_Noop &&
5520: 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20   pOp->p3!=0 ){. 
5530: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5540: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
5550: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
5560: 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20  (u8*)z) ) z++;. 
5570: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
5580: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
5590: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
55a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
55b0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
55c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
55d0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
55e0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
55f0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
5600: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
5610: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5620: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
5630: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
5640: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
5650: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
5660: 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61  ( sqlite3_io_tra
5670: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
5680: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
5690: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
56a0: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
56b0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
56c0: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
56d0: 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >p3!=0 ){.    in
56e0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
56f0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
5700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
5710: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
5720: 22 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  ", pOp->p3);.   
5730: 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63   for(i=0; isspac
5740: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
5750: 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  )z[i]); i++){}. 
5760: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
5770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
5780: 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ( isspace((unsig
5790: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29  ned char)z[i]) )
57a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
57b0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
57c0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
57d0: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
57e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
57f0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
5800: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
5810: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
5820: 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72     sqlite3_io_tr
5830: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
5840: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
5850: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
5860: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
5870: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
5880: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  */.../*.** Prepa
5890: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
58a0: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
58b0: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  on.  This involv
58c0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
58d0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
58e0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
58f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
5900: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
5910: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
5920: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
5930: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
5940: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
5950: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
5960: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
5970: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
5980: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
5990: 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45  y to move a VDBE
59a0: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
59b0: 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45  _INIT to.** VDBE
59c0: 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76  _MAGIC_RUN..*/.v
59d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
59e0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
59f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5a10: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
5a20: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
5a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5a40: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
5a50: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
5a60: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
5a70: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
5a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5a90: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
5aa0: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
5ab0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5ae0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
5af0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ate */.  int isE
5b00: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5b20: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
5b30: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
5b40: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
5b50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
5b60: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  = p->db;..  asse
5b70: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
5b80: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5b90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5ba0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
5bb0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
5bc0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
5bd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
5be0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
5bf0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
5c00: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
5c10: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
5c20: 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20  n later. This.  
5c30: 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68   * is because th
5c40: 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65  e call to resize
5c50: 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20  OpArray() below 
5c60: 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20  may shrink the. 
5c70: 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72    * p->aOp[] arr
5c80: 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72  ay to save memor
5c90: 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e  y if called when
5ca0: 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   in VDBE_MAGIC_R
5cb0: 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a  UN .   * state..
5cc0: 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63     */.  p->magic
5cd0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
5ce0: 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73 74  N;..  /* No inst
5cf0: 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75 73  ruction ever pus
5d00: 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 20  hes more than a 
5d10: 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20 6f  single element o
5d20: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61  nto the.  ** sta
5d30: 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74 61  ck.  And the sta
5d40: 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20 6f  ck never grows o
5d50: 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78 65  n successive exe
5d60: 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  cutions of the. 
5d70: 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20 20   ** same loop.  
5d80: 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  So the total num
5d90: 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ber of instructi
5da0: 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72 20  ons is an upper 
5db0: 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  bound.  ** on th
5dc0: 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20  e maximum stack 
5dd0: 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e 20  depth required. 
5de0: 20 28 41 64 64 65 64 20 6c 61 74 65 72 3a 29 20   (Added later:) 
5df0: 20 54 68 65 0a 20 20 2a 2a 20 72 65 73 6f 6c 76   The.  ** resolv
5e00: 65 50 32 56 61 6c 75 65 73 28 29 20 63 61 6c 6c  eP2Values() call
5e10: 20 63 6f 6d 70 75 74 65 73 20 61 20 74 69 67 68   computes a tigh
5e20: 74 65 72 20 75 70 70 65 72 20 62 6f 75 6e 64 20  ter upper bound 
5e30: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63  on the.  ** stac
5e40: 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a  k size..  **.  *
5e50: 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c  * Allocation all
5e60: 20 74 68 65 20 73 74 61 63 6b 20 73 70 61 63 65   the stack space
5e70: 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20 6e 65   we will ever ne
5e80: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
5e90: 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20  ->aStack==0 ){. 
5ea0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
5eb0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
5ec0: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
5ed0: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
5ee0: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
5ef0: 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20 2f  nt nStack;     /
5f00: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
5f10: 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72 69 65   of stack entrie
5f20: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
5f30: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
5f40: 73 28 70 2c 20 26 6e 41 72 67 2c 20 26 6e 53 74  s(p, &nArg, &nSt
5f50: 61 63 6b 29 3b 0a 20 20 20 20 72 65 73 69 7a 65  ack);.    resize
5f60: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
5f70: 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
5f80: 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 61  nVar>=0 );.    a
5f90: 73 73 65 72 74 28 20 6e 53 74 61 63 6b 3c 70 2d  ssert( nStack<p-
5fa0: 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28 20  >nOp );.    if( 
5fb0: 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  isExplain ){.   
5fc0: 20 20 20 6e 53 74 61 63 6b 20 3d 20 31 30 3b 0a     nStack = 10;.
5fd0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 53 74      }.    p->aSt
5fe0: 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ack = sqlite3DbM
5ff0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
6000: 20 20 20 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a        nStack*siz
6010: 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d  eof(p->aStack[0]
6020: 29 20 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a  )    /* aStack *
6030: 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73  /.      + nArg*s
6040: 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20  izeof(Mem*)     
6050: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72           /* apAr
6060: 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  g */.      + nVa
6070: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20  r*sizeof(Mem)   
6080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6090: 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Var */.      + n
60a0: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
60b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
60c0: 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20   azVar */.      
60d0: 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  + nMem*sizeof(Me
60e0: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
60f0: 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20   /* aMem */.    
6100: 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65    + nCursor*size
6110: 6f 66 28 43 75 72 73 6f 72 2a 29 20 20 20 20 20  of(Cursor*)     
6120: 20 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20     /* apCsr */. 
6130: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64     );.    if( !d
6140: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6150: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
6160: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53   = &p->aStack[nS
6170: 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  tack];.      p->
6180: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20  nMem = nMem;.   
6190: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d     p->aVar = &p-
61a0: 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20  >aMem[nMem];.   
61b0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61     p->nVar = nVa
61c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61  r;.      p->okVa
61d0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
61e0: 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26  apArg = (Mem**)&
61f0: 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  p->aVar[nVar];. 
6200: 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20       p->azVar = 
6210: 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72  (char**)&p->apAr
6220: 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70  g[nArg];.      p
6230: 2d 3e 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f  ->apCsr = (Curso
6240: 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56  r**)&p->azVar[nV
6250: 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  ar];.      p->nC
6260: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
6270: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
6280: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
6290: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
62a0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
62b0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  l;.        p->aV
62c0: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
62d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
62e0: 28 6e 3d 30 3b 20 6e 3c 6e 53 74 61 63 6b 3b 20  (n=0; n<nStack; 
62f0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
6300: 3e 61 53 74 61 63 6b 5b 6e 5d 2e 64 62 20 3d 20  >aStack[n].db = 
6310: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
6320: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b  }.  }.  for(n=0;
6330: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
6340: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d  {.    p->aMem[n]
6350: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
6360: 6c 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  l;.    p->aMem[n
6370: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 0a  ].db = db;.  }..
6380: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e    p->pTos = &p->
6390: 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d  aStack[-1];.  p-
63a0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
63b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
63c0: 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20   p->uniqueCnt = 
63d0: 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65  0;.  p->returnDe
63e0: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72  pth = 0;.  p->er
63f0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
6400: 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74  bort;.  p->popSt
6410: 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65  ack =  0;.  p->e
6420: 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c  xplain |= isExpl
6430: 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ain;.  p->magic 
6440: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
6450: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
6460: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
6470: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
6480: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
6490: 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65   255;.  p->opene
64a0: 64 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  dStatement = 0;.
64b0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
64c0: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ILE.  {.    int 
64d0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
64e0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
64f0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
6500: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
6510: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
6520: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
6530: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
6540: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e  lose a cursor an
6550: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
6560: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
6570: 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a   cursor happens.
6580: 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ** to hold..*/.v
6590: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
65a0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
65b0: 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  p, Cursor *pCx){
65c0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
65d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
65e0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
65f0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
6600: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
6610: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
6620: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
6630: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
6640: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
6650: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66  x->pBt);.  }.#if
6660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6670: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6680: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
6690: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
66a0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
66b0: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
66c0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
66d0: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
66e0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
66f0: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
6700: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
6710: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
6720: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
6730: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f  (p->db);.    pMo
6740: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
6750: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  abCursor);.    s
6760: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
6770: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ->db);.    p->in
6780: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
6790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
67a0: 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70  ite3_free(pCx->p
67b0: 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
67c0: 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65  _free(pCx->aType
67d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
67e0: 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(pCx);.}../*.**
67f0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
6800: 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  rs.*/.static voi
6810: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
6820: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
6830: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
6840: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
6850: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6860: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
6870: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 6e 56 74      if( !p->inVt
6880: 61 62 4d 65 74 68 6f 64 20 7c 7c 20 28 70 2d 3e  abMethod || (p->
6890: 61 70 43 73 72 5b 69 5d 20 26 26 20 21 70 2d 3e  apCsr[i] && !p->
68a0: 61 70 43 73 72 5b 69 5d 2d 3e 70 56 74 61 62 43  apCsr[i]->pVtabC
68b0: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
68c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
68d0: 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73  ursor(p, p->apCs
68e0: 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  r[i]);.      p->
68f0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
6900: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
6910: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
6920: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
6930: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6940: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
6950: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
6960: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
6970: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
6980: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
6990: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
69a0: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
69b0: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
69c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
69d0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
69e0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
69f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6a00: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   i;.  if( p->aSt
6a10: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  ack ){.    relea
6a20: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
6a30: 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54  tack, 1 + (p->pT
6a40: 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29  os - p->aStack))
6a50: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
6a60: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
6a70: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
6a80: 72 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65  rsors(p);.  rele
6a90: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
6aa0: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
6ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
6ac0: 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29  Clear(&p->sFifo)
6ad0: 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65  ;.  if( p->conte
6ae0: 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66  xtStack ){.    f
6af0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e  or(i=0; i<p->con
6b00: 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b  textStackTop; i+
6b10: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6b20: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
6b30: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
6b40: 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d  i].sFifo);.    }
6b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6b60: 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  e(p->contextStac
6b70: 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e  k);.  }.  p->con
6b80: 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20  textStack = 0;. 
6b90: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6ba0: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
6bb0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20  contextStackTop 
6bc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
6bd0: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
6be0: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
6bf0: 30 3b 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61  0;.  p->resOnSta
6c00: 63 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck = 0;.}../*.**
6c10: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
6c20: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
6c30: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
6c40: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6c50: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
6c60: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
6c70: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
6c80: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
6c90: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
6ca0: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
6cb0: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
6cc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
6cd0: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
6ce0: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
6cf0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
6d00: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
6d10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6d20: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
6d30: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
6d40: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
6d50: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
6d60: 20 6e 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   n;.  releaseMem
6d70: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
6d80: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
6d90: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
6da0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
6db0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
6dc0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
6dd0: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
6de0: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  olumn = nResColu
6df0: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
6e00: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
6e10: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
6e20: 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20  llocZero(p->db, 
6e30: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
6e40: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
6e50: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
6e60: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
6e70: 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61 6d   ){.    (pColNam
6e80: 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  e++)->flags = ME
6e90: 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  M_Null;.  }.}../
6ea0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
6eb0: 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
6ec0: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
6ed0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
6ee0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
6ef0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
6f00: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
6f10: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
6f20: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
6f30: 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
6f40: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
6f50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
6f60: 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  mCols()..**.** I
6f70: 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20  f N==P3_STATIC  
6f80: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e  it means that zN
6f90: 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ame is a pointer
6fa0: 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73   to a constant s
6fb0: 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20  tatic.** string 
6fc0: 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20  and we can just 
6fd0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
6fe0: 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44 59  . If it is P3_DY
6ff0: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20  NAMIC, then .** 
7000: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66 72  the string is fr
7010: 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
7020: 33 5f 66 72 65 65 28 29 20 77 68 65 6e 20 74 68  3_free() when th
7030: 65 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68  e vdbe is finish
7040: 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f  ed with.** it. O
7050: 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65  therwise, N byte
7060: 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63  s of zName are c
7070: 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  opied..*/.int sq
7080: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7090: 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ame(Vdbe *p, int
70a0: 20 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63   idx, int var, c
70b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
70c0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  , int N){.  int 
70d0: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
70e0: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
70f0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
7100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
7110: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
7120: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
7130: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
7140: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7150: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
7160: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
7170: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
7180: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
7190: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
71a0: 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41    if( N==P3_DYNA
71b0: 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41  MIC || N==P3_STA
71c0: 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TIC ){.    rc = 
71d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
71e0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
71f0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
7200: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
7210: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
7220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7230: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
7240: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e  olName, zName, N
7250: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51  , SQLITE_UTF8,SQ
7260: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7270: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7280: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50  QLITE_OK && N==P
7290: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
72a0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
72b0: 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c   = (pColName->fl
72c0: 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63  ags&(~MEM_Static
72d0: 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20  ))|MEM_Dyn;.    
72e0: 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d  pColName->xDel =
72f0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7300: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
7310: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
7320: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
7330: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
7340: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
7350: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
7360: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
7370: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
7380: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
7390: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
73a0: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
73b0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
73c0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
73d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
73e0: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
73f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
7400: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
7410: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
7420: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
7430: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
7440: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
7450: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
7460: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
7470: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
7480: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
7490: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
74a0: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
74b0: 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  0;..  /* Before 
74c0: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
74d0: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
74e0: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
74f0: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
7500: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
7510: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
7520: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
7530: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
7540: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
7550: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
7560: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
7570: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
7580: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
7590: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
75a0: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
75b0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
75c0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
75d0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
75e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
75f0: 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20  Sync(db, rc);.  
7600: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7610: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
7620: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
7630: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
7640: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
7650: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
7660: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
7670: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
7680: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
7690: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
76a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
76b0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
76c0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
76d0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
76e0: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
76f0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
7700: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
7710: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
7720: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
7730: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
7740: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
7750: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
7760: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
7770: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
7780: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7790: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
77a0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
77b0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
77c0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
77d0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
77e0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
77f0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
7800: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
7810: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
7820: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
7830: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
7840: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
7850: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
7860: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
7870: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
7880: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
7890: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
78a0: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20  SafetyOff(db);. 
78b0: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
78c0: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
78d0: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
78e0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
78f0: 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
7900: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7910: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
7920: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NT;.    }.  }.. 
7930: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
7940: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
7950: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
7960: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
7970: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
7980: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
7990: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
79a0: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
79b0: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
79c0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
79d0: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
79e0: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
79f0: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
7a00: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
7a10: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
7a20: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
7a30: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
7a40: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
7a50: 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63  ory:.  In that c
7a60: 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e  ase we do.  ** n
7a70: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
7a80: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
7a90: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
7aa0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
7ab0: 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f  n.  ** too..  */
7ac0: 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e  .  if( 0==strlen
7ad0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
7ae0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
7af0: 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72  [0].pBt)) || nTr
7b00: 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f  ans<=1 ){.    fo
7b10: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
7b20: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
7b30: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
7b40: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
7b50: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
7b60: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
7b70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7b80: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
7b90: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
7ba0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
7bb0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
7bc0: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
7bd0: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
7be0: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
7bf0: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
7c00: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
7c10: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
7c20: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
7c30: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
7c40: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
7c50: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
7c60: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
7c70: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
7c80: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
7c90: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
7ca0: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
7cb0: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
7cc0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
7cd0: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
7ce0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
7cf0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
7d00: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
7d10: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
7d20: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
7d30: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
7d40: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
7d50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
7d60: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
7d70: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
7d80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
7d90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7da0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
7db0: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
7dc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
7dd0: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
7de0: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
7df0: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
7e00: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
7e10: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
7e20: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
7e30: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
7e40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7e50: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
7e60: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
7e70: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7e80: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
7e90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7ea0: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
7eb0: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
7ec0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
7ed0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
7ee0: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
7ef0: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
7f00: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
7f10: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
7f20: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
7f30: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
7f40: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
7f50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
7f60: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
7f70: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
7f80: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  = 0;..    /* Sel
7f90: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
7fa0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
7fb0: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
7fc0: 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20   u32 random;.   
7fd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7fe0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
7ff0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
8000: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
8010: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
8020: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
8030: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
8040: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
8050: 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78  nFile, random&0x
8060: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
8070: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
8080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8090: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
80a0: 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
80b0: 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  ( sqlite3OsAcces
80c0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
80d0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
80e0: 58 49 53 54 53 29 20 29 3b 0a 0a 20 20 20 20 2f  XISTS) );..    /
80f0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
8100: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
8110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8120: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
8130: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
8140: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c  er, .        SQL
8150: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
8160: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
8170: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 53  REATE|.        S
8180: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
8190: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
81a0: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
81b0: 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66   0.    );.    if
81c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
81d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
81e0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
81f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8200: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
8210: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
8220: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
8230: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
8240: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
8250: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
8260: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8270: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
8280: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
8290: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
82a0: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
82b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
82c0: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
82d0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
82e0: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
82f0: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
8300: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8310: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
8320: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
8330: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
8340: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
8350: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
8360: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
8370: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8380: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
8390: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
83a0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  pBt;.      if( i
83b0: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==1 ) continue; 
83c0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
83d0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
83e0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26  .      if( pBt &
83f0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
8400: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
8410: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
8420: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
8430: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
8440: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
8450: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30       if( zFile[0
8460: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
8470: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d    /* Ignore :mem
8480: 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
8490: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e  /.        if( !n
84a0: 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69  eedSync && !sqli
84b0: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
84c0: 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20  bled(pBt) ){.   
84d0: 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
84e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
84f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8500: 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74  te3OsWrite(pMast
8510: 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65  er, zFile, strle
8520: 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  n(zFile)+1, offs
8530: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
8540: 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 46  set += strlen(zF
8550: 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
8560: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8570: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
8580: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
8590: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
85a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
85b0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
85c0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
85d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
85e0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
85f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8610: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20  .    }...    /* 
8620: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
8630: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
8640: 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d  .    zMainFile =
8650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8660: 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  Dirname(db->aDb[
8670: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  0].pBt);.    if(
8680: 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20   (needSync .    
8690: 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f   && (rc=sqlite3O
86a0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
86b0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
86c0: 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  L))!=SQLITE_OK) 
86d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
86e0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
86f0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
8700: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
8710: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
8720: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8730: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8750: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
8760: 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
8770: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
8780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
8790: 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
87a0: 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
87b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
87c0: 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
87d0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
87e0: 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
87f0: 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
8800: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
8810: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8820: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
8830: 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
8840: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
8850: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8860: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
8870: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
8880: 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
8890: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
88a0: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
88b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
88c0: 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
88d0: 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
88e0: 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
88f0: 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
8900: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8910: 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
8920: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
8930: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
8940: 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
8950: 75 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ure occured..   
8960: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
8970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8980: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
8990: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
89a0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
89b0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
89c0: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
89d0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
89e0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
89f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
8a00: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
8a10: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
8a20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8a30: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
8a40: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
8a50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8a60: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
8a70: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
8a80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8a90: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
8aa0: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
8ab0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8ac0: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
8ad0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
8ae0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
8af0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
8b00: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
8b10: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
8b20: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
8b30: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
8b40: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
8b50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
8b60: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
8b70: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8b80: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
8b90: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
8ba0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
8bb0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
8bc0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8bd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
8be0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
8bf0: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
8c00: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
8c10: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
8c20: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
8c30: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
8c40: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
8c50: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
8c60: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
8c70: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
8c80: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
8c90: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
8ca0: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
8cb0: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
8cc0: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
8cd0: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
8ce0: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
8cf0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
8d00: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
8d10: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
8d20: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
8d30: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
8d40: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
8d50: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
8d60: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
8d70: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
8d80: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
8d90: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
8da0: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
8db0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
8dc0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
8dd0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8de0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8df0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
8e00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8e10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
8e20: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
8e30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 61   }.    }.    ena
8e40: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
8e50: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
8e60: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
8e70: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
8e80: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
8e90: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
8ea0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
8eb0: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  at the sqlite3.a
8ec0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75  ctiveVdbeCnt cou
8ed0: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
8ee0: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
8ef0: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
8f00: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
8f10: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
8f20: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
8f30: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
8f40: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
8f50: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
8f60: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
8f70: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
8f80: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
8f90: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
8fa0: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
8fb0: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
8fc0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
8fd0: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
8fe0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
8ff0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
9000: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
9010: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
9020: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
9030: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
9040: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
9050: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
9060: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
9070: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
9080: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
9090: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
90a0: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
90b0: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
90c0: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
90d0: 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65  eVdbeCnt );.}.#e
90e0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
90f0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
9100: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
9110: 46 69 6e 64 20 65 76 65 72 79 20 61 63 74 69 76  Find every activ
9120: 65 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e 20  e VM other than 
9130: 70 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67 65  pVdbe and change
9140: 20 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a 2a   its status to.*
9150: 2a 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69 73  * aborted.  This
9160: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f 6e   happens when on
9170: 65 20 56 4d 20 63 61 75 73 65 73 20 61 20 72 6f  e VM causes a ro
9180: 6c 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61 6e  llback due to an
9190: 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  .** ON CONFLICT 
91a0: 52 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65 20  ROLLBACK clause 
91b0: 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20 20  (for example).  
91c0: 54 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75  The other VMs mu
91d0: 73 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65 64  st be.** aborted
91e0: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f   so that they do
91f0: 20 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20 72   not have data r
9200: 6f 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  olled out from u
9210: 6e 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68 65  nderneath.** the
9220: 6d 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20 73  m leading to a s
9230: 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76 6f 69 64  egfault..*/.void
9240: 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68   sqlite3AbortOth
9250: 65 72 41 63 74 69 76 65 56 64 62 65 73 28 73 71  erActiveVdbes(sq
9260: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
9270: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 56 64 62  *pExcept){.  Vdb
9280: 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f 72  e *pOther;.  for
9290: 28 70 4f 74 68 65 72 3d 64 62 2d 3e 70 56 64 62  (pOther=db->pVdb
92a0: 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74 68 65  e; pOther; pOthe
92b0: 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29  r=pOther->pNext)
92c0: 7b 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72  {.    if( pOther
92d0: 3d 3d 70 45 78 63 65 70 74 20 29 20 63 6f 6e 74  ==pExcept ) cont
92e0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
92f0: 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42  ther->magic!=VDB
9300: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
9310: 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f  Other->pc<0 ) co
9320: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63 68 65 63  ntinue;.    chec
9330: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
9340: 62 29 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c  b);.    closeAll
9350: 43 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29 3b  Cursors(pOther);
9360: 0a 20 20 20 20 63 68 65 63 6b 41 63 74 69 76 65  .    checkActive
9370: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20  VdbeCnt(db);.   
9380: 20 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64   pOther->aborted
9390: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
93a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
93b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
93c0: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
93d0: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
93e0: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
93f0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
9400: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
9410: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
9420: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
9430: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
9440: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
9450: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
9460: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
9470: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
9480: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
9490: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
94a0: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
94b0: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
94c0: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a 2a  TE_MAGIC_HALT..*
94d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
94e0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
94f0: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
9500: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
9510: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
9520: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
9530: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
9540: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
9550: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
9560: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
9570: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
9580: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
9590: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
95a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
95b0: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  lt(Vdbe *p){.  s
95c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
95d0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
95e0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65  nt (*xFunc)(Btre
95f0: 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a  e *pBt) = 0;  /*
9600: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
9610: 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20  l on each btree 
9620: 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  backend */.  int
9630: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
9640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9650: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51  et to true if SQ
9660: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f  LITE_NOMEM or IO
9670: 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ERR */..  /* Thi
9680: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
9690: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
96a0: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
96b0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
96c0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
96d0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
96e0: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
96f0: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
9700: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
9710: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
9720: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
9730: 2a 2a 0a 20 20 2a 2a 20 53 70 65 63 69 61 6c 20  **.  ** Special 
9740: 65 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a  errors:.  **.  *
9750: 2a 20 20 20 20 20 49 66 20 61 6e 20 53 51 4c 49  *     If an SQLI
9760: 54 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f 72 20 68  TE_NOMEM error h
9770: 61 73 20 6f 63 63 75 72 65 64 20 69 6e 20 61 20  as occured in a 
9780: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
9790: 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20 20 20  rites to.  **   
97a0: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20    the database, 
97b0: 74 68 65 6e 20 65 69 74 68 65 72 20 61 20 73 74  then either a st
97c0: 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
97d0: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
97e0: 6f 6c 6c 65 64 0a 20 20 2a 2a 20 20 20 20 20 62  olled.  **     b
97f0: 61 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ack to ensure th
9800: 65 20 74 72 65 65 2d 73 74 72 75 63 74 75 72 65  e tree-structure
9810: 73 20 61 72 65 20 69 6e 20 61 20 63 6f 6e 73 69  s are in a consi
9820: 73 74 65 6e 74 20 73 74 61 74 65 2e 20 41 0a 20  stent state. A. 
9830: 20 2a 2a 20 20 20 20 20 73 74 61 74 65 6d 65 6e   **     statemen
9840: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
9850: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20   rolled back if 
9860: 6f 6e 65 20 69 73 20 6f 70 65 6e 2c 20 6f 74 68  one is open, oth
9870: 65 72 77 69 73 65 20 74 68 65 0a 20 20 2a 2a 20  erwise the.  ** 
9880: 20 20 20 20 65 6e 74 69 72 65 20 74 72 61 6e 73      entire trans
9890: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
98a0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  olled back..  **
98b0: 0a 20 20 2a 2a 20 20 20 20 20 49 66 20 61 6e 20  .  **     If an 
98c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 65 72 72  SQLITE_IOERR err
98d0: 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 69  or has occured i
98e0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68  n a statement th
98f0: 61 74 20 77 72 69 74 65 73 20 74 6f 0a 20 20 2a  at writes to.  *
9900: 2a 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61  *     the databa
9910: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  se, then the ent
9920: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
9930: 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
9940: 61 63 6b 2e 20 54 68 65 0a 20 20 2a 2a 20 20 20  ack. The.  **   
9950: 20 20 49 2f 4f 20 65 72 72 6f 72 20 6d 61 79 20    I/O error may 
9960: 68 61 76 65 20 63 61 75 73 65 64 20 67 61 72 62  have caused garb
9970: 61 67 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  age to be writte
9980: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
9990: 20 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c 65 2e   .  **     file.
99a0: 20 57 65 72 65 20 74 68 65 20 74 72 61 6e 73 61   Were the transa
99b0: 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75  ction to continu
99c0: 65 20 61 6e 64 20 65 76 65 6e 74 75 61 6c 6c 79  e and eventually
99d0: 20 62 65 20 72 6f 6c 6c 65 64 20 0a 20 20 2a 2a   be rolled .  **
99e0: 20 20 20 20 20 62 61 63 6b 20 74 68 61 74 20 67       back that g
99f0: 61 72 62 61 67 65 20 6d 69 67 68 74 20 65 6e 64  arbage might end
9a00: 20 75 70 20 69 6e 20 74 68 65 20 64 61 74 61 62   up in the datab
9a10: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 20  ase file..  **  
9a20: 20 20 20 0a 20 20 2a 2a 20 20 20 20 20 49 6e 20     .  **     In 
9a30: 62 6f 74 68 20 6f 66 20 74 68 65 20 61 62 6f 76  both of the abov
9a40: 65 20 63 61 73 65 73 2c 20 74 68 65 20 56 64 62  e cases, the Vdb
9a50: 65 2e 65 72 72 6f 72 41 63 74 69 6f 6e 20 76 61  e.errorAction va
9a60: 72 69 61 62 6c 65 20 69 73 20 0a 20 20 2a 2a 20  riable is .  ** 
9a70: 20 20 20 20 69 67 6e 6f 72 65 64 2e 20 49 66 20      ignored. If 
9a80: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 75 74 6f  the sqlite3.auto
9a90: 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 66  Commit flag is f
9aa0: 61 6c 73 65 20 61 6e 64 20 61 20 74 72 61 6e 73  alse and a trans
9ab0: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20  action.  **     
9ac0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
9ad0: 69 74 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  it will be set t
9ae0: 6f 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a  o true..  **.  *
9af0: 2a 20 4f 74 68 65 72 20 65 72 72 6f 72 73 3a 0a  * Other errors:.
9b00: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20 65 72 72    **.  ** No err
9b10: 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 0a 20  or:.  **.  */.. 
9b20: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
9b30: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9b40: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
9b50: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
9b60: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
9b70: 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
9b80: 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 6c 74 65  /* Already halte
9b90: 64 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64  d.  Nothing to d
9ba0: 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  o. */.    assert
9bb0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
9bc0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a 23  _MAGIC_HALT );.#
9bd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9be0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9bf0: 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73      closeAllCurs
9c00: 6f 72 73 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20  ors(p);.#endif. 
9c10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9c20: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  _OK;.  }.  close
9c30: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
9c40: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
9c50: 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
9c60: 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
9c70: 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
9c80: 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
9c90: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66   started */.  if
9ca0: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
9cb0: 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
9cc0: 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
9cd0: 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
9ce0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
9cf0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
9d00: 63 69 61 6c 20 65 72 72 6f 72 73 20 2d 20 53 51  cial errors - SQ
9d10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 53 51  LITE_NOMEM or SQ
9d20: 4c 49 54 45 5f 49 4f 45 52 52 20 2a 2f 0a 20 20  LITE_IOERR */.  
9d30: 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
9d40: 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
9d50: 69 61 6c 45 72 72 6f 72 20 3d 20 28 0a 20 20 20  ialError = (.   
9d60: 20 20 20 20 20 28 6d 72 63 3d 3d 53 51 4c 49 54       (mrc==SQLIT
9d70: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
9d80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20  SQLITE_IOERR || 
9d90: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
9da0: 52 52 55 50 54 29 3f 31 3a 30 29 3b 0a 20 20 20  RRUPT)?1:0);.   
9db0: 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
9dc0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
9dd0: 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73  This loop does s
9de0: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f  tatic analysis o
9df0: 66 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 73  f the query to s
9e00: 65 65 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a  ee which of the.
9e10: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
9e20: 6e 67 20 74 68 72 65 65 20 63 61 74 65 67 6f 72  ng three categor
9e30: 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74  ies it falls int
9e40: 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o:.      **.    
9e50: 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e    **     Read-on
9e60: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ly.      **     
9e70: 51 75 65 72 79 20 77 69 74 68 20 73 74 61 74 65  Query with state
9e80: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ment journal.   
9e90: 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20     **     Query 
9ea0: 77 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e  without statemen
9eb0: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
9ec0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 63  **.      ** We c
9ed0: 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e  ould do somethin
9ee0: 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20 74  g more elegant t
9ef0: 68 61 6e 20 74 68 69 73 20 73 74 61 74 69 63 20  han this static 
9f00: 61 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20  analysis (i.e.. 
9f10: 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68       ** store th
9f20: 65 20 74 79 70 65 20 6f 66 20 71 75 65 72 79 20  e type of query 
9f30: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
9f40: 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61 73 65  ompliation phase
9f50: 29 2c 20 62 75 74 20 0a 20 20 20 20 20 20 2a 2a  ), but .      **
9f60: 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63   handling malloc
9f70: 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
9f80: 20 69 73 20 61 20 66 61 69 72 6c 79 20 6f 62 73   is a fairly obs
9f90: 63 75 72 65 20 65 64 67 65 20 63 61 73 65 20 73  cure edge case s
9fa0: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
9fb0: 20 69 73 20 70 72 6f 62 61 62 6c 79 20 65 61 73   is probably eas
9fc0: 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74  ier. Todo: Might
9fd0: 20 62 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   be an opportuni
9fe0: 74 79 20 74 6f 20 72 65 64 75 63 65 20 0a 20 20  ty to reduce .  
9ff0: 20 20 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65      ** code size
a000: 20 61 20 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d   a very small am
a010: 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20  ount though.... 
a020: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
a030: 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 31  t isReadOnly = 1
a040: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53 74  ;.      int isSt
a050: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
a060: 20 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70     assert(p->aOp
a070: 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a   || p->nOp==0);.
a080: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a090: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a  <p->nOp; i++){ .
a0a0: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
a0b0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
a0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
a0d0: 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  se OP_Transactio
a0e0: 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  n:.            /
a0f0: 2a 20 54 68 69 73 20 69 73 20 61 20 62 69 74 20  * This is a bit 
a100: 73 74 72 61 6e 67 65 2e 20 49 66 20 77 65 20 68  strange. If we h
a110: 69 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  it a malloc() or
a120: 20 49 4f 20 65 72 72 6f 72 20 61 6e 64 0a 20 20   IO error and.  
a130: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
a140: 20 73 74 61 74 65 6d 65 6e 74 20 64 69 64 20 6e   statement did n
a150: 6f 74 20 6f 70 65 6e 20 61 20 73 74 61 74 65 6d  ot open a statem
a160: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
a170: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20   we will.       
a180: 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
a190: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
a1a0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72  saction and abor
a1b0: 74 20 61 6c 6c 20 6f 74 68 65 72 20 61 63 74 69  t all other acti
a1c0: 76 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ve.            *
a1d0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 4f 72  * statements. Or
a1e0: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  , if this is an 
a1f0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a200: 20 65 72 72 6f 72 2c 20 77 65 0a 20 20 20 20 20   error, we.     
a210: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f         ** will o
a220: 6e 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  nly rollback if 
a230: 74 68 65 20 69 6e 74 65 72 72 75 70 74 65 64 20  the interrupted 
a240: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
a250: 77 72 69 74 65 2e 0a 20 20 20 20 20 20 20 20 20  write..         
a260: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
a270: 20 20 2a 2a 20 49 74 20 63 6f 75 6c 64 20 62 65    ** It could be
a280: 20 61 72 67 75 65 64 20 74 68 61 74 20 72 65 61   argued that rea
a290: 64 2d 6f 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74  d-only statement
a2a0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 0a 20  s should never. 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f             ** ro
a2c0: 6c 6c 62 61 63 6b 20 61 6e 79 74 68 69 6e 67 2e  llback anything.
a2d0: 20 42 75 74 20 63 61 72 65 66 75 6c 20 61 6e 61   But careful ana
a2e0: 6c 79 73 69 73 20 69 73 20 72 65 71 75 69 72 65  lysis is require
a2f0: 64 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 20  d before.       
a300: 20 20 20 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 74       ** making t
a310: 68 69 73 20 63 68 61 6e 67 65 0a 20 20 20 20 20  his change.     
a320: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a330: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70        if( p->aOp
a340: 5b 69 5d 2e 70 32 20 7c 7c 20 6d 72 63 21 3d 53  [i].p2 || mrc!=S
a350: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
a360: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a370: 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b   isReadOnly = 0;
a380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
a390: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a3a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
a3b0: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20   OP_Statement:. 
a3c0: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74 61             isSta
a3d0: 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  tement = 1;.    
a3e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a3f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a400: 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
a410: 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
a420: 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64  ad-only, we need
a430: 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   do no rollback 
a440: 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73  at all. Otherwis
a450: 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e,.      ** proc
a460: 65 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65  eed with the spe
a470: 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
a480: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
a490: 28 20 21 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b  ( !isReadOnly ){
a4a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
a4b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
a4c0: 5f 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74  _BLOCKED && isSt
a4d0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
a4e0: 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c       xFunc = sql
a4f0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
a500: 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  kStmt;.         
a510: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
a520: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
a530: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 3d 3d  else if( p->rc==
a540: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
a550: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
a560: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
a570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a580: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
a590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5a0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
a5b0: 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
a5c0: 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
a5d0: 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
a5e0: 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
a5f0: 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
a600: 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
a610: 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
a620: 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
a630: 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
a640: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
a650: 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74  te3AbortOtherAct
a660: 69 76 65 56 64 62 65 73 28 64 62 2c 20 70 29 3b  iveVdbes(db, p);
a670: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a680: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
a690: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
a6a0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
a6b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
a6d0: 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
a6e0: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
a6f0: 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
a700: 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76 64  e only active vd
a710: 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  be, then.    ** 
a720: 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
a730: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
a740: 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
a750: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
a760: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
a770: 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
a780: 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
a790: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
a7a0: 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
a7b0: 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
a7c0: 63 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  ccured. .    */.
a7d0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f      if( db->auto
a7e0: 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63  Commit && db->ac
a7f0: 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29  tiveVdbeCnt==1 )
a800: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
a810: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
a820: 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
a830: 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
a840: 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
a850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
a860: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
a870: 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  is true, and the
a880: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
a890: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  s .        ** su
a8a0: 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20  ccessful or hit 
a8b0: 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
a8c0: 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65  straint. This me
a8d0: 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
a8e0: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
a8f0: 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ired..        */
a900: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
a910: 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29  = vdbeCommit(db)
a920: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
a930: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
a940: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a950: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
a960: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a970: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a980: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
a990: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
a9a0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
a9b0: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
a9c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a9d0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
a9e0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
a9f0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
aa00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa10: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
aa20: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
aa30: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
aa40: 28 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20  ( !xFunc ){.    
aa50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
aa60: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
aa70: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
aa80: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
aa90: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
aaa0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
aab0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
aac0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b  BtreeCommitStmt;
aad0: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
aae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
aaf0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
ab00: 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
ab10: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
ab20: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
ab30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ab40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
ab50: 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64  ortOtherActiveVd
ab60: 62 65 73 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  bes(db, p);.    
ab70: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
ab80: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
ab90: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
aba0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
abb0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
abc0: 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20  If xFunc is not 
abd0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
abe0: 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42   one of sqlite3B
abf0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
ac00: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
ac10: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
ac20: 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20  t. Call it once 
ac30: 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e  on each backend.
ac40: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
ac50: 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  urs.    ** and t
ac60: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  he return code i
ac70: 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f  s still SQLITE_O
ac80: 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72  K, set the retur
ac90: 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65  n code to the ne
aca0: 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76  w.    ** error v
acb0: 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
acc0: 20 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c   assert(!xFunc |
acd0: 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73  |.      xFunc==s
ace0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
acf0: 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78  tStmt ||.      x
ad00: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
ad10: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20  eeRollbackStmt. 
ad20: 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d     );.    for(i=
ad30: 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62  0; xFunc && i<db
ad40: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
ad50: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
ad60: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
ad70: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
ad80: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
ad90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75          rc = xFu
ada0: 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  nc(pBt);.       
adb0: 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72   if( rc && (p->r
adc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
add0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
ade0: 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20  NSTRAINT) ){.   
adf0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
ae00: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
ae10: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
ae20: 2d 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20  ->zErrMsg, 0);. 
ae30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ae40: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
ae50: 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
ae60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
ae70: 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65  r DELETE and the
ae80: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63   statement was c
ae90: 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a  ommitted, .    *
aea0: 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65  * set the change
aeb0: 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a   counter. .    *
aec0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
aed0: 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70  ngeCntOn && p->p
aee0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c>=0 ){.      if
aef0: 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e  ( !xFunc || xFun
af00: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43  c==sqlite3BtreeC
af10: 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20  ommitStmt ){.   
af20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af30: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
af40: 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
af50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
af60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
af70: 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
af80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
af90: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
afa0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c   }.  .    /* Rol
afb0: 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20  lback or commit 
afc0: 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67  any schema chang
afd0: 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  es that occurred
afe0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
aff0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
b000: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
b010: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
b020: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b030: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
b040: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ema(db, 0);.    
b050: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64    db->flags = (d
b060: 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54  b->flags | SQLIT
b070: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
b080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
b090: 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
b0a0: 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
b0b0: 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
b0c0: 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
b0d0: 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
b0e0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
b0f0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
b100: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
b110: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
b120: 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
b130: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
b140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b150: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  K;.}../*.** Each
b160: 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
b170: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
b180: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
b190: 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
b1a0: 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
b1b0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
b1c0: 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
b1d0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
b1e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b1f0: 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
b200: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
b210: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
b220: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
b230: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
b240: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
b250: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
b260: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
b270: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
b280: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
b290: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
b2a0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
b2b0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
b2c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
b2d0: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
b2e0: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
b2f0: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
b300: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
b310: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
b320: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
b330: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
b340: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
b350: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
b360: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
b370: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
b380: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
b390: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
b3a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
b3b0: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
b3c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b3d0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
b3e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
b3f0: 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
b400: 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
b410: 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
b420: 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
b430: 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
b440: 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
b450: 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
b460: 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
b470: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
b480: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73  afetyOn(db);.  s
b490: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
b4a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65  );.  sqlite3Safe
b4b0: 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a  tyOff(db);..  /*
b4c0: 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
b4d0: 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
b4e0: 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
b4f0: 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
b500: 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
b510: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
b520: 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
b530: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
b540: 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
b550: 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
b560: 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
b570: 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
b580: 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
b590: 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
b5a0: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
b5b0: 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
b5c0: 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
b5d0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
b5e0: 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
b5f0: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
b600: 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d      if( p->zErrM
b610: 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
b620: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
b630: 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45  b->pErr,-1,p->zE
b640: 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46  rrMsg,SQLITE_UTF
b650: 38 2c 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  8,sqlite3_free);
b660: 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  .      db->errCo
b670: 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20  de = p->rc;.    
b680: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
b690: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
b6a0: 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73  p->rc ){.      s
b6b0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
b6c0: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d  p->rc, 0);.    }
b6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
b6e0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
b6f0: 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20  ITE_OK, 0);.    
b700: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  }.  }else if( p-
b710: 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
b720: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
b730: 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
b740: 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
b750: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
b760: 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
b770: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
b780: 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
b790: 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
b7a0: 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
b7b0: 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
b7c0: 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
b7d0: 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
b7e0: 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
b7f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
b800: 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
b810: 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
b820: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
b830: 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
b840: 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
b850: 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
b860: 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
b870: 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
b880: 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  run..  */.  asse
b890: 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e  rt( p->pTos<&p->
b8a0: 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30  aStack[p->pc<0?0
b8b0: 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61  :p->pc] || !p->a
b8c0: 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20  Stack );.#ifdef 
b8d0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
b8e0: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
b8f0: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
b900: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
b910: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
b920: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
b930: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
b940: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
b950: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
b960: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
b970: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
b980: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
b990: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
b9a0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
b9b0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
b9c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b9d0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
b9e0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
b9f0: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
ba00: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
ba10: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
ba20: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
ba30: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
ba40: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
ba50: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
ba60: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
ba70: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
ba80: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
ba90: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
baa0: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
bab0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
bac0: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
bad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bae0: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
baf0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
bb00: 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30    p->aborted = 0
bb10: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
bb20: 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
bb30: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
bb40: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
bb50: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
bb60: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
bb70: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bb80: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
bb90: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
bba0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
bbb0: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
bbc0: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
bbd0: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
bbe0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
bbf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bc00: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
bc10: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
bc20: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
bc30: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
bc40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
bc50: 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
bc60: 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
bc70: 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
bc80: 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c );.  }else if(
bc90: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
bca0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
bcb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bcc0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
bcd0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
bce0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
bcf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
bd00: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
bd10: 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
bd20: 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
bd30: 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
bd40: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
bd50: 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
bd60: 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
bd70: 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
bd80: 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
bd90: 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
bda0: 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
bdb0: 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
bdc0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
bdd0: 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
bde0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
bdf0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
be00: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
be10: 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
be20: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
be30: 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
be40: 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
be50: 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
be60: 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
be70: 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
be80: 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
be90: 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26  (mask&(1<<i))) &
bea0: 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
beb0: 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
bec0: 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
bed0: 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
bee0: 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
bef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
bf00: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
bf10: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
bf20: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
bf30: 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
bf40: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
bf50: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
bf60: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
bf70: 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75  return;.  Cleanu
bf80: 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  p(p);.  if( p->p
bf90: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
bfa0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
bfb0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
bfc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
bfd0: 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
bfe0: 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65      p->db->pVdbe
bff0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
c000: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
c010: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
c020: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
c030: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  v;.  }.  if( p->
c040: 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  aOp ){.    for(i
c050: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
c060: 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f  +){.      Op *pO
c070: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
c080: 20 20 20 20 20 20 66 72 65 65 50 33 28 70 4f 70        freeP3(pOp
c090: 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p3type, pOp->p
c0a0: 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  3);.    }.    sq
c0b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f  lite3_free(p->aO
c0c0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  p);.  }.  releas
c0d0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
c0e0: 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73  r, p->nVar);.  s
c0f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c100: 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
c110: 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b  3_free(p->aStack
c120: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
c130: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
c140: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
c150: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
c160: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43  lite3_free(p->aC
c170: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
c180: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29  e3_free(p->zSql)
c190: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
c1a0: 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
c1b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c1c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  );.}../*.** If a
c1d0: 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
c1e0: 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
c1f0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
c200: 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
c210: 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52  * MoveTo now.  R
c220: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
c230: 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65  ode.  If no Move
c240: 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74  To is pending, t
c250: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
c260: 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20  oes nothing and 
c270: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
c280: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
c290: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
c2a0: 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  o(Cursor *p){.  
c2b0: 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
c2c0: 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
c2d0: 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
c2e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
c2f0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
c300: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
c310: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
c320: 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
c330: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c340: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
c350: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
c360: 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
c370: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
c380: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
c390: 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65  .    *p->pIncrKe
c3a0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61  y = 0;.    p->la
c3b0: 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49  stRowid = keyToI
c3c0: 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  nt(p->movetoTarg
c3d0: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  et);.    p->rowi
c3e0: 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  dIsValid = res==
c3f0: 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  0;.    if( res<0
c400: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
c410: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
c420: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  p->pCursor, &res
c430: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
c440: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c450: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
c460: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
c470: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
c480: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e  ;.#endif.    p->
c490: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
c4a0: 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
c4b0: 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
c4c0: 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  TALE;.  }.  retu
c4d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c4e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
c4f0: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
c500: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
c510: 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
c520: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c530: 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
c540: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
c550: 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Read().** sqlite
c560: 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
c570: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c580: 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a  erialWrite().**.
c590: 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
c5a0: 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
c5b0: 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
c5c0: 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
c5d0: 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
c5e0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
c5f0: 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
c600: 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
c610: 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
c620: 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
c630: 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
c640: 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
c650: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
c660: 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
c670: 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
c680: 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
c690: 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
c6a0: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
c6b0: 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
c6c0: 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
c6d0: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
c6e0: 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
c6f0: 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
c700: 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
c710: 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
c720: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
c730: 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
c740: 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
c750: 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
c760: 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
c770: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
c780: 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
c790: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
c7a0: 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
c7b0: 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72   data blob seper
c7c0: 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
c7d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
c7e0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
c7f0: 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
c800: 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
c810: 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
c820: 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
c830: 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
c840: 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
c850: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
c880: 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
c8a0: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
c8b0: 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
c8d0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
c8e0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
c8f0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
c900: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
c910: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c920: 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
c950: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
c960: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
c970: 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
c980: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
c990: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
c9c0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
c9d0: 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
ca00: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
ca10: 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
ca20: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
ca30: 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
ca40: 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
ca70: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
ca80: 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
caa0: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
cab0: 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
cac0: 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
caf0: 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
cb00: 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
cb10: 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
cb20: 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
cb30: 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
cb40: 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
cb50: 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
cb60: 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
cb70: 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
cb80: 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
cb90: 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
cba0: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
cbb0: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
cbc0: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
cbd0: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
cbe0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
cbf0: 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
cc00: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
cc10: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
cc20: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
cc30: 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
cc40: 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
cc50: 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
cc60: 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
cc70: 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
cc80: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
cc90: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
cca0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
ccb0: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
ccc0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
ccd0: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
cce0: 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
ccf0: 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
cd00: 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
cd10: 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30  (((i64)0x0000100
cd20: 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
cd30: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
cd40: 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
cd50: 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
cd60: 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
cd70: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cd80: 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  8+i;.    }.    u
cd90: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
cda0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
cdb0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
cdc0: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
cdd0: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
cde0: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
cdf0: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
ce00: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
ce10: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
ce20: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
ce30: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
ce40: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
ce50: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
ce60: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
ce70: 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
ce80: 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
ce90: 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
cea0: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
ceb0: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
cec0: 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
ced0: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20  Mem->u.i;.  }.  
cee0: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
cef0: 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
cf00: 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
cf10: 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
cf20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
cf30: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
cf40: 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
cf50: 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
cf60: 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
cf70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
cf80: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
cf90: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
cfa0: 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
cfb0: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
cfc0: 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
cfd0: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
cfe0: 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
cff0: 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
d000: 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
d010: 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
d020: 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
d030: 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
d040: 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
d050: 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
d060: 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
d070: 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
d080: 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
d090: 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
d0a0: 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
d0b0: 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
d0c0: 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
d0d0: 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
d0e0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
d0f0: 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
d100: 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
d110: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
d120: 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
d130: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
d140: 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
d150: 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
d160: 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
d170: 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
d180: 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
d190: 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
d1a0: 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
d1b0: 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
d1c0: 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
d1d0: 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
d1e0: 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
d1f0: 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
d200: 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
d210: 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
d220: 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
d230: 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
d240: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
d250: 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
d260: 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
d270: 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
d280: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
d290: 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
d2a0: 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
d2b0: 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
d2c0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
d2d0: 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
d2e0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
d2f0: 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
d300: 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
d310: 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
d320: 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
d330: 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
d340: 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
d350: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
d360: 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
d370: 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
d380: 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
d390: 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
d3a0: 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
d3b0: 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
d3c0: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
d3d0: 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
d3e0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
d3f0: 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 23 69 66 64  correct..*/.#ifd
d400: 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
d410: 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
d420: 41 54 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  AT.static double
d430: 20 66 6c 6f 61 74 53 77 61 70 28 64 6f 75 62 6c   floatSwap(doubl
d440: 65 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  e in){.  union {
d450: 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  .    double r;. 
d460: 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
d470: 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
d480: 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
d490: 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
d4a0: 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
d4b0: 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
d4c0: 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
d4d0: 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
d4e0: 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
d4f0: 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
d500: 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
d510: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
d520: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
d530: 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
d540: 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
d550: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
d560: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
d570: 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
d580: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
d590: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
d5a0: 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
d5b0: 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
d5c0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
d5d0: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
d5e0: 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
d5f0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
d600: 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
d610: 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61    nBuf must alwa
d620: 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65  ys be.** large e
d630: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
d640: 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20  e entire field. 
d650: 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
d660: 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c  field is.** a bl
d670: 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66  ob with a zero-f
d680: 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e  illed tail, then
d690: 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20   buf[] might be 
d6a0: 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a  just the right.*
d6b0: 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65  * size to hold e
d6c0: 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74  verything except
d6d0: 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69   for the zero-fi
d6e0: 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62  lled tail.  If b
d6f0: 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  uf[].** is only 
d700: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
d710: 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ld the non-zero 
d720: 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c  prefix, then onl
d730: 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20  y write that.** 
d740: 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b  prefix into buf[
d750: 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d  ].  But if buf[]
d760: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
d770: 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68   to hold both th
d780: 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20  e.** prefix and 
d790: 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72  the tail then wr
d7a0: 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61  ite the prefix a
d7b0: 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20  nd set the tail 
d7c0: 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e  to all.** zeros.
d7d0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
d7e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
d7f0: 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
d800: 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
d810: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
d820: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
d830: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
d840: 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
d850: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
d860: 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
d870: 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
d880: 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
d890: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
d8a0: 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
d8b0: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20  , int nBuf, Mem 
d8c0: 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
d8d0: 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73  format){.  u32 s
d8e0: 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c  erial_type = sql
d8f0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d900: 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f  pe(pMem, file_fo
d910: 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65 6e  rmat);.  int len
d920: 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
d930: 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
d940: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
d950: 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
d960: 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
d970: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
d980: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
d990: 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
d9a0: 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
d9b0: 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b  zeof(pMem->r) );
d9c0: 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
d9d0: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 70 4d 65 6d  EndianFloat(pMem
d9e0: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ->r);.      memc
d9f0: 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
da00: 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
da10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
da20: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
da30: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
da40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
da50: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
da60: 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  _type);.    asse
da70: 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b  rt( len<=nBuf );
da80: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20  .    while( i-- 
da90: 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20  ){.      buf[i] 
daa0: 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  = (v&0xFF);.    
dab0: 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
dac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
dad0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
dae0: 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
daf0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
db00: 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
db10: 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
db20: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
db30: 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a  Zero)?pMem->u.i:
db40: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
db50: 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  == sqlite3VdbeSe
db60: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
db70: 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
db80: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c  assert( pMem->n<
db90: 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e  =nBuf );.    len
dba0: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
dbb0: 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
dbc0: 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ->z, len);.    i
dbd0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
dbe0: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
dbf0: 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e     len += pMem->
dc00: 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  u.i;.      if( l
dc10: 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  en>nBuf ){.     
dc20: 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20     len = nBuf;. 
dc30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
dc40: 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e  set(&buf[pMem->n
dc50: 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e  ], 0, len-pMem->
dc60: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  n);.    }.    re
dc70: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
dc80: 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
dc90: 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
dca0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
dcb0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
dcc0: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
dcd0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
dce0: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
dcf0: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
dd00: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
dd10: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
dd20: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
dd30: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
dd40: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
dd50: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
dd60: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
dd70: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
dd80: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
dd90: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
dda0: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddc0: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
ddd0: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
dde0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de00: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
de10: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
de20: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
de30: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
de40: 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
de50: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
de60: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
de70: 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
de80: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
de90: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
dea0: 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
deb0: 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
dec0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
ded0: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
dee0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
def0: 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
df00: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
df10: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
df20: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
df30: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
df40: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
df50: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
df60: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
df70: 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
df80: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
df90: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
dfa0: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
dfb0: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
dfc0: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
dfd0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
dfe0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
dff0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
e000: 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
e010: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
e020: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
e030: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
e040: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
e050: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<16) | (buf[1]<
e060: 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20  <8) | buf[2];.  
e070: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e080: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e090: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
e0a0: 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
e0b0: 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
e0c0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
e0d0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75   pMem->u.i = (bu
e0e0: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
e0f0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
e100: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
e110: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
e120: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e130: 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
e140: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
e150: 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
e160: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
e170: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73      u64 x = (((s
e180: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
e190: 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
e1a0: 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28  .      u32 y = (
e1b0: 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[2]<<24) | (b
e1c0: 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[3]<<16) | (bu
e1d0: 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35  f[4]<<8) | buf[5
e1e0: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
e1f0: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
e200: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
e210: 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65  4*)&x;.      pMe
e220: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e230: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
e240: 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
e250: 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
e260: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
e270: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
e280: 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
e290: 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
e2a0: 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75    u64 x;.      u
e2b0: 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e  32 y;.#if !defin
e2c0: 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
e2d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e2e0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
e2f0: 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69  T).      /* Veri
e300: 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
e310: 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
e320: 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
e330: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
e340: 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
e350: 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
e360: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
e370: 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
e380: 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
e390: 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
e3a0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
e3b0: 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
e3c0: 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  .      ** endian
e3d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e3e0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
e3f0: 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
e400: 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
e410: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e420: 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
e430: 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  ;.      double r
e440: 32 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 73 77  2 = r1;.      sw
e450: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
e460: 61 74 28 72 32 29 3b 0a 20 20 20 20 20 20 61 73  at(r2);.      as
e470: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 32 29  sert( sizeof(r2)
e480: 3d 3d 73 69 7a 65 6f 66 28 74 31 29 20 26 26 20  ==sizeof(t1) && 
e490: 6d 65 6d 63 6d 70 28 26 72 32 2c 20 26 74 31 2c  memcmp(&r2, &t1,
e4a0: 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
e4b0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
e4c0: 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
e4d0: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
e4e0: 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
e4f0: 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
e500: 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
e510: 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
e520: 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
e530: 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
e540: 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
e550: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
e560: 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
e570: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
e580: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
e590: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e5a0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
e5b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
e5c0: 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
e5d0: 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
e5e0: 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
e5f0: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
e600: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
e610: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70  ));.        swap
e620: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
e630: 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20  (pMem->r);.     
e640: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e650: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
e660: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
e670: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  8;.    }.    cas
e680: 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
e690: 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
e6a0: 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
e6b0: 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  r 1 */.      pMe
e6c0: 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
e6d0: 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
e6e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e6f0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e700: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
e710: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
e720: 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61  int len = (seria
e730: 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
e740: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
e750: 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20  har *)buf;.     
e760: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a   pMem->n = len;.
e770: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c        pMem->xDel
e780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
e790: 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31  serial_type&0x01
e7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
e7b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
e7c0: 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  r | MEM_Ephem;. 
e7d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e7e0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e7f0: 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d  = MEM_Blob | MEM
e800: 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  _Ephem;.      }.
e810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e        return len
e820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e830: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e840: 20 54 68 65 20 68 65 61 64 65 72 20 6f 66 20 61   The header of a
e850: 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73   record consists
e860: 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20 76   of a sequence v
e870: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
e880: 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73  ntegers..** Thes
e890: 65 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 61  e integers are a
e8a0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d 61  lmost always sma
e8b0: 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f 64  ll and are encod
e8c0: 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62  ed as a single b
e8d0: 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  yte..** The foll
e8e0: 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65  owing macro take
e8f0: 73 20 61 64 76 61 6e 74 61 67 65 20 74 68 69 73  s advantage this
e900: 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64 65   fact to provide
e910: 20 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a 2a   a fast decode.*
e920: 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  * of the integer
e930: 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68 65  s in a record he
e940: 61 64 65 72 2e 20 20 49 74 20 69 73 20 66 61 73  ader.  It is fas
e950: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
e960: 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65  on case.** where
e970: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   the integer is 
e980: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20 20  a single byte.  
e990: 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73  It is a little s
e9a0: 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a 2a  lower when the.*
e9b0: 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74 77 6f  * integer is two
e9c0: 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e 20   or more bytes. 
e9d0: 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74 20   But overall it 
e9e0: 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  is faster..**.**
e9f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   The following e
ea00: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65  xpressions are e
ea10: 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a  quivalent:.**.**
ea20: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
ea30: 47 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c 20  GetVarint32( A, 
ea40: 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20  &B );.**.**     
ea50: 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20 41  x = GetVarint( A
ea60: 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65  , B );.**.*/.#de
ea70: 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28 41  fine GetVarint(A
ea80: 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29 29  ,B)  ((B = *(A))
ea90: 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71 6c  <=0x7f ? 1 : sql
eaa0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
eab0: 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  A, &B))../*.** T
eac0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
ead0: 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
eae0: 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
eaf0: 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66  x records specif
eb00: 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79  ied by .** {nKey
eb10: 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e  1, pKey1} and {n
eb20: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65  Key2, pKey2}, re
eb30: 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69  turning a negati
eb40: 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
eb50: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
eb60: 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
eb70: 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
eb80: 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
eb90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b  greater than {nK
eba0: 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f  ey2, pKey2}.  Bo
ebb0: 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  th Key1 and Key2
ebc0: 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74   must be byte st
ebd0: 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65  rings.** compose
ebe0: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
ebf0: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
ec00: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e   the VDBE..*/.in
ec10: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
ec20: 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  ordCompare(.  vo
ec30: 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20  id *userData,.  
ec40: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
ec50: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
ec60: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
ec70: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
ec80: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
ec90: 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a  Info = (KeyInfo*
eca0: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32  )userData;.  u32
ecb0: 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20   d1, d2;        
ecc0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
ecd0: 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
ece0: 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
ecf0: 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32    u32 idx1, idx2
ed00: 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  ;      /* Offset
ed10: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
ed20: 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
ed30: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
ed40: 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a  dr1, szHdr2;  /*
ed50: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ed60: 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
ed70: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
ed80: 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
ed90: 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
eda0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
edb0: 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
edc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
edd0: 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  y1;.  const unsi
ede0: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32  gned char *aKey2
edf0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
ee00: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b  ed char *)pKey2;
ee10: 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20  ..  Mem mem1;.  
ee20: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31  Mem mem2;.  mem1
ee30: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
ee40: 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
ee50: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
ee60: 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20 70 4b 65    mem2.enc = pKe
ee70: 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
ee80: 6d 32 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m2.db = pKeyInfo
ee90: 2d 3e 64 62 3b 0a 20 20 0a 20 20 69 64 78 31 20  ->db;.  .  idx1 
eea0: 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79  = GetVarint(aKey
eeb0: 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31  1, szHdr1);.  d1
eec0: 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 64 78   = szHdr1;.  idx
eed0: 32 20 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b  2 = GetVarint(aK
eee0: 65 79 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20  ey2, szHdr2);.  
eef0: 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e  d2 = szHdr2;.  n
ef00: 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
ef10: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
ef20: 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
ef30: 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b  & idx2<szHdr2 ){
ef40: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
ef50: 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73  type1;.    u32 s
ef60: 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20  erial_type2;..  
ef70: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
ef80: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
ef90: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
efa0: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
efb0: 20 20 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56      idx1 += GetV
efc0: 61 72 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78  arint( aKey1+idx
efd0: 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
efe0: 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e  );.    if( d1>=n
eff0: 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56  Key1 && sqlite3V
f000: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f010: 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30  (serial_type1)>0
f020: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64   ) break;.    id
f030: 78 32 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28  x2 += GetVarint(
f040: 20 61 4b 65 79 32 2b 69 64 78 32 2c 20 73 65 72   aKey2+idx2, ser
f050: 69 61 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20  ial_type2 );.   
f060: 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26   if( d2>=nKey2 &
f070: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
f080: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
f090: 6c 5f 74 79 70 65 32 29 3e 30 20 29 20 62 72 65  l_type2)>0 ) bre
f0a0: 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  ak;..    /* Extr
f0b0: 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
f0c0: 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
f0d0: 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
f0e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f0f0: 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
f100: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
f110: 6d 65 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d  mem1);.    d2 +=
f120: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
f130: 61 6c 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d  alGet(&aKey2[d2]
f140: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20  , serial_type2, 
f150: 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem2);..    /* 
f160: 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
f170: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
f180: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
f190: 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32  are(&mem1, &mem2
f1a0: 2c 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65  , i<nField ? pKe
f1b0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
f1c0: 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65  : 0);.    if( me
f1d0: 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  m1.flags & MEM_D
f1e0: 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  yn ) sqlite3Vdbe
f1f0: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
f200: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e  );.    if( mem2.
f210: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
f220: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
f230: 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a  Release(&mem2);.
f240: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
f250: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f260: 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
f270: 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ..  /* One of th
f280: 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
f290: 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c  f fields, but al
f2a0: 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
f2b0: 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20  to that point.  
f2c0: 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  ** were equal. I
f2d0: 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c  f the incrKey fl
f2e0: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
f2f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20   the second key 
f300: 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20  is.  ** treated 
f310: 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a  as larger..  */.
f320: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
f330: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
f340: 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20  >incrKey ){.    
f350: 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d    rc = -1;.    }
f360: 65 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79  else if( d1<nKey
f370: 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
f380: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
f390: 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20   d2<nKey2 ){.   
f3a0: 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
f3b0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b  }.  }else if( pK
f3c0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
f3d0: 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f  er && i<pKeyInfo
f3e0: 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20  ->nField.       
f3f0: 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49          && pKeyI
f400: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
f410: 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d  i] ){.    rc = -
f420: 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
f430: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
f440: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
f450: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f  n index entry co
f460: 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65  mposed using the
f470: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
f480: 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61  pcode..** The la
f490: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  st entry in this
f4a0: 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
f4b0: 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70  e an integer (sp
f4c0: 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e  ecifically.** an
f4d0: 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e   integer rowid).
f4e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
f4f0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
f500: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a  r of bytes in.**
f510: 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a   that integer..*
f520: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f530: 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e  eIdxRowidLen(con
f540: 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
f550: 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
f560: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f570: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
f580: 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
f590: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
f5a0: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20   the rowid */.. 
f5b0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
f5c0: 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72  t32(aKey, &szHdr
f5d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
f5e0: 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a  arint32(&aKey[sz
f5f0: 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77  Hdr-1], &typeRow
f600: 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  id);.  return sq
f610: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
f620: 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
f630: 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  );.}.  ../*.** p
f640: 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
f650: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
f660: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
f670: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
f680: 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
f690: 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
f6a0: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
f6b0: 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
f6c0: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
f6d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f6e0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
f6f0: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
f700: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
f710: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f720: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
f730: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
f740: 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
f750: 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
f760: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
f770: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
f780: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
f790: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
f7a0: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
f7b0: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
f7c0: 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
f7d0: 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
f7e0: 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
f7f0: 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
f800: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
f810: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
f820: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
f830: 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
f840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f850: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f860: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f870: 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
f880: 65 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  e(pCur, 0, nCell
f890: 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
f8a0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
f8b0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71  urn rc;.  }.  sq
f8c0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
f8d0: 28 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64  ((u8*)m.z, &szHd
f8e0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
f8f0: 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
f900: 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79  .z[szHdr-1], &ty
f910: 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52  peRowid);.  lenR
f920: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
f930: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
f940: 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71  typeRowid);.  sq
f950: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
f960: 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
f970: 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
f980: 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
f990: 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
f9a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
f9b0: 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
f9c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f9d0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
f9e0: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
f9f0: 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
fa00: 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
fa10: 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  nt to against.**
fa20: 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
fa30: 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67  in pKey (of leng
fa40: 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65  th nKey).  Write
fa50: 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
fa60: 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
fa70: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
fa80: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
fa90: 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
faa0: 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
fab0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65  greater than pKe
fac0: 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
fad0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
fae0: 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65  .**.** pKey is e
faf0: 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
fb00: 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
fb10: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
fb20: 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
fb30: 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
fb40: 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
fb50: 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
fb60: 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
fb70: 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
fb80: 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  s well..*/.int s
fb90: 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
fba0: 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f  Compare(.  Curso
fbb0: 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
fbc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
fbd0: 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
fbe0: 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
fbf0: 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20   nKey, const u8 
fc00: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
fc10: 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  key to compare *
fc20: 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
fc50: 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
fc60: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
fc70: 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
fc80: 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
fc90: 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
fca0: 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65  Cursor;.  int le
fcb0: 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b  nRowid;.  Mem m;
fcc0: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
fcd0: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
fce0: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
fcf0: 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
fd00: 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
fd10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fd20: 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  K;.  }.  rc = sq
fd30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
fd40: 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
fd50: 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
fd60: 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
fd70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
fd80: 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  c;.  }.  lenRowi
fd90: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  d = sqlite3VdbeI
fda0: 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29  dxRowidLen((u8*)
fdb0: 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73  m.z);.  *res = s
fdc0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
fdd0: 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79  Compare(pC->pKey
fde0: 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77  Info, m.n-lenRow
fdf0: 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70  id, m.z, nKey, p
fe00: 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Key);.  sqlite3V
fe10: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
fe20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fe30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fe40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
fe50: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
fe60: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
fe70: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
fe80: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
fe90: 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
fea0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
feb0: 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
fec0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
fed0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
fee0: 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
fef0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ff00: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
ff10: 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
ff20: 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
ff30: 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
ff40: 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
ff50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
ff60: 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
ff70: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
ff80: 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
ff90: 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
ffa0: 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
ffb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ffc0: 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
ffd0: 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
ffe0: 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
fff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
10000 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
10010 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
10020 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
10030 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
10040 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
10050 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
10060 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
10070 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
10080 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
10090 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
100a0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
100b0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
100c0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
100d0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
100e0 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
100f0 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
10100 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
10110 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
10120 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
10130 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
10140 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
10150 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
10160 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
10170 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
10180 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
10190 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
101a0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
101b0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
101c0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
101d0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
101e0 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
101f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
10200 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
10210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
10230 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10240 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
10250 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
10260 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
10270 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.