/ Hex Artifact Content
Login

Artifact c155bc8ef20772d481fbd6733ebdc5921fc725e0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03d0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03e0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
0400: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0410: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0420: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0430: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0440: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0450: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0460: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0470: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 64  ro(db, sizeof(Vd
0480: 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  be) );.  if( p==
0490: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
04a0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66  p->db = db;.  if
04b0: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
04c0: 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50     db->pVdbe->pP
04d0: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70  rev = p;.  }.  p
04e0: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56  ->pNext = db->pV
04f0: 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  dbe;.  p->pPrev 
0500: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65  = 0;.  db->pVdbe
0510: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = p;.  p->magic
0520: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
0530: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  IT;.  return p;.
0540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0550: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0560: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0570: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0580: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0590: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
05a0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
05b0: 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20   n){.  if( p==0 
05c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
05d0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05e0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
05f0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
0600: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a  ->db, z, n);.}..
0610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0620: 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20   SQL associated 
0630: 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64 20  with a prepared 
0640: 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e  statement.*/.con
0650: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0660: 56 64 62 65 47 65 74 53 71 6c 28 56 64 62 65 20  VdbeGetSql(Vdbe 
0670: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
0680: 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >zSql;.}../*.** 
0690: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
06a0: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
06b0: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
06c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
06d0: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
06e0: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
06f0: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
0700: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e  char *zTmp;.  in
0710: 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20  t nTmp;.  tmp = 
0720: 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42  *pA;.  *pA = *pB
0730: 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20  ;.  *pB = tmp;. 
0740: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78   pTmp = pA->pNex
0750: 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d  t;.  pA->pNext =
0760: 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42   pB->pNext;.  pB
0770: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a  ->pNext = pTmp;.
0780: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72    pTmp = pA->pPr
0790: 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20  ev;.  pA->pPrev 
07a0: 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pB->pPrev;.  p
07b0: 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b  B->pPrev = pTmp;
07c0: 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53  .  zTmp = pA->zS
07d0: 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d  ql;.  pA->zSql =
07e0: 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d   pB->zSql;.  pB-
07f0: 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20  >zSql = zTmp;.  
0800: 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b  nTmp = pA->nSql;
0810: 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42  .  pA->nSql = pB
0820: 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53  ->nSql;.  pB->nS
0830: 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69  ql = nTmp;.}..#i
0840: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0850: 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61  G./*.** Turn tra
0860: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a  cing on or off.*
0870: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0880: 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c  beTrace(Vdbe *p,
0890: 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20   FILE *trace){. 
08a0: 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63   p->trace = trac
08b0: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
08c0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08d0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
08e0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
08f0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
0900: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
0910: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0920: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0930: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0940: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0950: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0960: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 0a 2a  tain exactly N.*
0970: 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 56 64 62 65  * elements. Vdbe
0980: 2e 6e 4f 70 41 6c 6c 6f 63 20 69 73 20 73 65 74  .nOpAlloc is set
0990: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
09a0: 6e 65 77 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  new size of.** t
09b0: 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
09c0: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
09d0: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
09e0: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
09f0: 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64  the array,.** Vd
0a00: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0a10: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a20: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a30: 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e  is so that.** an
0a40: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
0a60: 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  be correctly dea
0a70: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
0a80: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a90: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
0ab0: 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  izeOpArray(Vdbe 
0ac0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  *p, int N){.  in
0ad0: 74 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d  t runMode = p->m
0ae0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
0af0: 5f 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d  _RUN;.  if( runM
0b00: 6f 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c  ode || p->nOpAll
0b10: 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  oc<N ){.    Vdbe
0b20: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  Op *pNew;.    in
0b30: 74 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30  t nNew = N + 100
0b40: 2a 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20  *(!runMode);.   
0b50: 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70   int oldSize = p
0b60: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20  ->nOpAlloc;.    
0b70: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
0b80: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e  ealloc(p->aOp, n
0b90: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0ba0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
0bb0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  .      p->nOpAll
0bc0: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
0bd0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0be0: 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f        if( nNew>o
0bf0: 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ldSize ){.      
0c00: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
0c10: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e  [oldSize], 0, (n
0c20: 4e 65 77 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a  New-oldSize)*siz
0c30: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 20 20  eof(Op));.      
0c40: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
0c50: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
0c60: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
0c70: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
0c80: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0c90: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0ca0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0cb0: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0cc0: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0cd0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0ce0: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
0cf0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
0d00: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
0d10: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
0d20: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
0d30: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
0d50: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
0d60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
0d70: 2a 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20 20  **    p1, p2    
0d80: 20 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20        First two 
0d90: 6f 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73  of the three pos
0da0: 73 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a  sible operands..
0db0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0dc0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0dd0: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0de0: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0df0: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0e00: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0e10: 33 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  3() function to 
0e20: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0e30: 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70   of the P3.** op
0e40: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0e50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56  lite3VdbeAddOp(V
0e60: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
0e70: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
0e80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
0e90: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
0ea0: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
0eb0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0ec0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0ed0: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
0ee0: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a  <=i ){.    resiz
0ef0: 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31 29  eOpArray(p, i+1)
0f00: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  ;.    if( p->db-
0f10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
0f20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0f30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
0f40: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
0f50: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
0f60: 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20  ->opcode = op;. 
0f70: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20   pOp->p1 = p1;. 
0f80: 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20   pOp->p2 = p2;. 
0f90: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
0fa0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
0fb0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0fc0: 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  xpired = 0;.#ifd
0fd0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0fe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64    if( sqlite3_vd
0ff0: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29  be_addop_trace )
1000: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
1010: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
1020: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  p[i]);.#endif.  
1030: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
1040: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1050: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1060: 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f 0a  he p3 value..*/.
1070: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f  int sqlite3VdbeO
1080: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
1090: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
10a0: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
10b0: 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29 7b  zP3,int p3type){
10c0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
10d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70  lite3VdbeAddOp(p
10e0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20  , op, p1, p2);. 
10f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1100: 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP3(p, addr, zP
1110: 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72 65  3, p3type);.  re
1120: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1130: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1140: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1150: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1160: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1170: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1180: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1190: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
11a0: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
11b0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
11c0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
11d0: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
11e0: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
11f0: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
1200: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1210: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1220: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1230: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1240: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1250: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1260: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1270: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1280: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1290: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
12a0: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
12b0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
12c0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
12d0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
12e0: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
12f0: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
1300: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1310: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1320: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1330: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1340: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1350: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1360: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1370: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1380: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1390: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
13a0: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
13b0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
13c0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13d0: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
13e0: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
13f0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1400: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1410: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1420: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
1430: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d  nLabelAlloc = p-
1440: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1450: 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62   10;.    p->aLab
1460: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1470: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1480: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
14c0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
14d0: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
14e0: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
14f0: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1500: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1510: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1520: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1530: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1540: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1550: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1560: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
1570: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
1580: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
1590: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
15a0: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
15b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
15c0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
15d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
15e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
15f0: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
1600: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1610: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1620: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
1640: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
1650: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
1660: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1670: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
1680: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1690: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
16a0: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
16b0: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
16c0: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
16d0: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
16e0: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
16f0: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
1700: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1710: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1720: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1730: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
1740: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
1750: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
1760: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
1770: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
1780: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
1790: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
17a0: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
17b0: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
17c0: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
17d0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
17e0: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
17f0: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
1800: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1810: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1820: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1830: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
1840: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
1850: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
1860: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
1870: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
1880: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
1890: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
18a0: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
18b0: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
18c0: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
18d0: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
18e0: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
18f0: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
1900: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1910: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1920: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1930: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
1940: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
1950: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
1960: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
1970: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
1980: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
1990: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
19a0: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
19b0: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
19c0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
19d0: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
19e0: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
19f0: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
1a00: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1a10: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1a20: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1a30: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
1a40: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
1a50: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
1a60: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
1a70: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
1a80: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
1a90: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1aa0: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1ab0: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1ac0: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1ad0: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1ae0: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1af0: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1b00: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1b10: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1b20: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1b30: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1b40: 55 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29  USH_MASK_1)<<16)
1b50: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1b60: 4b 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_2 + (((unsigne
1b70: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29  d)NOPUSH_MASK_3)
1b80: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1b90: 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e  H_MASK_4 + (((un
1ba0: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1bb0: 53 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_5)<<16),.    
1bc0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20  NOPUSH_MASK_6 + 
1bd0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1be0: 53 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c  SH_MASK_7)<<16),
1bf0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1c00: 5f 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _8 + (((unsigned
1c10: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c  )NOPUSH_MASK_9)<
1c20: 3c 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65  <16).  };.  asse
1c30: 72 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20  rt( op<32*5 );. 
1c40: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f   return (masks[o
1c50: 70 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26  p>>5] & (1<<(op&
1c60: 30 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e  0x1F)));.}..#ifn
1c70: 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
1c80: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1c90: 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20  NoPush(u8 op){. 
1ca0: 20 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f   return opcodeNo
1cb0: 50 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64  Push(op);.}.#end
1cc0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  if../*.** Loop t
1cd0: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
1ce0: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
1cf0: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
1d00: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45  e negative..** E
1d10: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
1d20: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
1d30: 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79  lve the label by
1d40: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a   setting the P2.
1d50: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  ** value to its 
1d60: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
1d70: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1d80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d90: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
1da0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
1db0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
1dc0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
1dd0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
1de0: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1df0: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
1e00: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
1e10: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
1e20: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
1e30: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
1e40: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
1e50: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
1e60: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
1e70: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
1e80: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
1e90: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  *.** The integer
1ea0: 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73   *pMaxStack is s
1eb0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1ec0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  m number of vdbe
1ed0: 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65   stack.** entrie
1ee0: 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e  s that static an
1ef0: 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74  alysis reveals t
1f00: 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68  his program migh
1f10: 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t need..**.** Th
1f20: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
1f30: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
1f40: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ng optimization:
1f50: 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a    It scans for.*
1f60: 2a 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69  * Halt instructi
1f70: 6f 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51  ons where P1==SQ
1f80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1f90: 6f 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20  or P2==OE_Abort 
1fa0: 6f 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73  or for.** IdxIns
1fb0: 65 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ert instructions
1fc0: 20 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49   where P2!=0.  I
1fd0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1fe0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e  ction is.** foun
1ff0: 64 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74  d, then every St
2000: 61 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74  atement instruct
2010: 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74  ion is changed t
2020: 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a  o a Noop.  In.**
2030: 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76   this way, we av
2040: 6f 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65  oid creating the
2050: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2060: 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73  al file unnecess
2070: 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  arily..*/.static
2080: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
2090: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
20a0: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
20b0: 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b  , int *pMaxStack
20c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
20d0: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a  t nMaxArgs = 0;.
20e0: 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20    int nMaxStack 
20f0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a  = p->nOp;.  Op *
2100: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
2110: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
2120: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
2130: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
2140: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
2150: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
2160: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
2170: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
2180: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
2190: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
21a0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
21b0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
21c0: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
21d0: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a  de==OP_AggStep .
21e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2200: 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f  .        || opco
2210: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23  de==OP_VUpdate.#
2220: 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2230: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
2240: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2250: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
2260: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
2270: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20  de==OP_Halt ){. 
2280: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
2290: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
22a0: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
22b0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
22c0: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
22d0: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
22e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22f0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2300: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
2310: 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42     hasStatementB
2320: 65 67 69 6e 20 3d 20 31 3b 0a 23 69 66 6e 64 65  egin = 1;.#ifnde
2330: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2340: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
2350: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2360: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2370: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2380: 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53  e ){.      doesS
2390: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
23a0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
23b0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
23c0: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
23d0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
23e0: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
23f0: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
2400: 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e 6f 70  sert( pOp[-2].op
2410: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2420: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2430: 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-2].p1;.      
2440: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2450: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2460: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2470: 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68  if( opcodeNoPush
2480: 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20  (opcode) ){.    
2490: 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20    nMaxStack--;. 
24a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
24b0: 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69  p->p2>=0 ) conti
24c0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
24d0: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
24e0: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70  Label );.    pOp
24f0: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31  ->p2 = aLabel[-1
2500: 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20  -pOp->p2];.  }. 
2510: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
2520: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
2530: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
2540: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
2550: 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78 53  axArgs;.  *pMaxS
2560: 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63 6b  tack = nMaxStack
2570: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65  ;..  /* If we ne
2580: 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73  ver rollback a s
2590: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
25a0: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65  tion, then state
25b0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
25c0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e  ctions are not n
25d0: 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67  eeded.  So chang
25e0: 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65  e every OP_State
25f0: 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ment.  ** opcode
2600: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2610: 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20  .  This avoid a 
2620: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2630: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2640: 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20  .  ** which can 
2650: 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20  be expensive on 
2660: 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a  some platforms..
2670: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74    */.  if( hasSt
2680: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20  atementBegin && 
2690: 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f  !doesStatementRo
26a0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
26b0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
26c0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
26d0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
26e0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
26f0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
2700: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   ){.        pOp-
2710: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
2720: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2730: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2740: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
2750: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2760: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
2770: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
2780: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2790: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
27a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
27b0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
27c0: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
27d0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
27e0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
27f0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
2800: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2810: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2820: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2830: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2840: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2860: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
2870: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
2880: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
2890: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
28a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
28b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
28c0: 4e 49 54 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f  NIT );.  resizeO
28d0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
28e0: 20 2b 20 6e 4f 70 29 3b 0a 20 20 69 66 28 20 70   + nOp);.  if( p
28f0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2900: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
2910: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
2920: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
2930: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
2940: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
2950: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
2960: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
2970: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
2980: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
2990: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
29a0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
29b0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
29c0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
29d0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
29e0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
29f0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
2a00: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
2a10: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
2a20: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
2a30: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
2a40: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
2a50: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
2a60: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
2a70: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
2a80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a90: 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  G.      if( sqli
2aa0: 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
2ab0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
2ac0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
2ad0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
2ae0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
2af0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2b00: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
2b10: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
2b20: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2b30: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2b40: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
2b50: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
2b60: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2b70: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2b80: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
2b90: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
2ba0: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
2bb0: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
2bc0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
2bd0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
2be0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
2bf0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
2c00: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
2c10: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
2c20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2c30: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP1(Vdbe *p, in
2c40: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2c50: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2c60: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2c70: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2c80: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2c90: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2ca0: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2cb0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2cc0: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
2cd0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2ce0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2cf0: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
2d00: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2d10: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
2d20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
2d30: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
2d40: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
2d50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d60: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
2d70: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2d80: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2d90: 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20  rt( val>=0 );.  
2da0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2db0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2dc0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2dd0: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
2de0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
2df0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2e00: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
2e10: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2e20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
2e30: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
2e40: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
2e50: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2e60: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
2e70: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2e80: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2e90: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
2ea0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2eb0: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
2ec0: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
2ed0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
2ee0: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
2ef0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
2f00: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
2f10: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
2f20: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
2f30: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
2f40: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
2f50: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
2f60: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
2f70: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
2f80: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75  meralFunction(Fu
2f90: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
2fa0: 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65  if( pDef && (pDe
2fb0: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
2fc0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
2fd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2fe0: 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a  free(pDef);.  }.
2ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
3000: 61 20 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65  a P3 value if ne
3010: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
3020: 69 63 20 76 6f 69 64 20 66 72 65 65 50 33 28 69  ic void freeP3(i
3030: 6e 74 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20  nt p3type, void 
3040: 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29  *p3){.  if( p3 )
3050: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 33  {.    switch( p3
3060: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
3070: 73 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P3_DYNAMIC:. 
3080: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59       case P3_KEY
3090: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
30a0: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
30b0: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
30c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b  qlite3_free(p3);
30d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
30e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
30f0: 73 65 20 50 33 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P3_MPRINTF: {
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 5f 66 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20  _free(p3);.     
3120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3130: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
3140: 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20  VDBEFUNC: {.    
3150: 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56      VdbeFunc *pV
3160: 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46  dbeFunc = (VdbeF
3170: 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20  unc *)p3;.      
3180: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
3190: 75 6e 63 74 69 6f 6e 28 70 56 64 62 65 46 75 6e  unction(pVdbeFun
31a0: 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  c->pFunc);.     
31b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
31c0: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
31d0: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
31e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31f0: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
3200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3210: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33   }.      case P3
3220: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
3230: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
3240: 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44  lFunction((FuncD
3250: 65 66 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ef*)p3);.       
3260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3270: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45        case P3_ME
3280: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M: {.        sql
3290: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
32a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33  qlite3_value*)p3
32b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32d0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68    }.}.../*.** Ch
32e0: 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73  ange N opcodes s
32f0: 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20  tarting at addr 
3300: 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f  to No-ops..*/.vo
3310: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3320: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
3330: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3340: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
3350: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
3360: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
3370: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
3380: 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20  while( N-- ){.  
3390: 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e      freeP3(pOp->
33a0: 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29  p3type, pOp->p3)
33b0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
33c0: 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  Op, 0, sizeof(pO
33d0: 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f  p[0]));.      pO
33e0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
33f0: 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b  oop;.      pOp++
3400: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
3410: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3420: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
3430: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3440: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3450: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3460: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
3470: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3480: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3490: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
34a0: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
34b0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
34c0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
34d0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
34e0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
34f0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
3500: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
3510: 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P3 operand is d
3520: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
3530: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
3540: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
3550: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
3560: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3570: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
3580: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
3590: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
35a0: 79 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74  ytes of zP3 up t
35b0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
35c0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
35d0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
35e0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
35f0: 74 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a  tes of zP3..**.*
3600: 2a 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e  * If n==P3_KEYIN
3610: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
3620: 20 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65   zP3 is a pointe
3630: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
3640: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
3650: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
3660: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
3670: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
3680: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3690: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
36a0: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
36b0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
36c0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
36d0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
36e0: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
36f0: 74 20 7a 50 33 20 70 6f 69 6e 74 73 20 74 6f 20  t zP3 points to 
3700: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
3710: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
3720: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
3730: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
3740: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3750: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
3760: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
3770: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
3780: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
3790: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
37a0: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
37b0: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
37c0: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
37d0: 6e 20 28 50 33 5f 53 54 41 54 49 43 2c 20 50 33  n (P3_STATIC, P3
37e0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
37f0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 33  ndicate that zP3
3800: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
3810: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
3820: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
3830: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
3840: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
3850: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
3860: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
3870: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
3880: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
3890: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
38a0: 65 6e 20 63 68 61 6e 67 65 20 50 33 20 6f 6e 20  en change P3 on 
38b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
38c0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
38d0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
38e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
38f0: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP3(Vdbe *p, int
3900: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
3910: 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP3, int n){.
3920: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73    Op *pOp;.  ass
3930: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
3940: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3950: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
3960: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  p==0 || p->aOp==
3970: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
3980: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
3990: 69 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49  if (n != P3_KEYI
39a0: 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65  NFO) {.      fre
39b0: 65 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  eP3(n, (void*)*(
39c0: 63 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20  char**)&zP3);.  
39d0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
39e0: 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30    }.  if( addr<0
39f0: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
3a00: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
3a10: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69  ->nOp - 1;.    i
3a20: 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75  f( addr<0 ) retu
3a30: 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20  rn;.  }.  pOp = 
3a40: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3a50: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3a60: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3a70: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3a80: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3a90: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
3aa0: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3ab0: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P3_NOTUSED;.  }
3ac0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b  else if( n==P3_K
3ad0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
3ae0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
3af0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
3b00: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
3b10: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
3b20: 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP3)->nField;. 
3b30: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3b40: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3b50: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3b60: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3b70: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3b80: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3b90: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
3ba0: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
3bb0: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
3bc0: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3bd0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3be0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3bf0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3c00: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3c10: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
3c20: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3c30: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3c40: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3c50: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3c60: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3c70: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
3c80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3c90: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3ca0: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
3cb0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3cc0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
3cd0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3ce0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3cf0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3d00: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
3d10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
3d20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3d30: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
3d40: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
3d50: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
3d60: 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59  se if( n==P3_KEY
3d70: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
3d80: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
3d90: 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f  har*)zP3;.    pO
3da0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b  p->p3type = P3_K
3db0: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3dc0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3dd0: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
3de0: 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  zP3;.    pOp->p3
3df0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3e00: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3e10: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33  ) n = strlen(zP3
3e20: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
3e30: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
3e40: 70 28 70 2d 3e 64 62 2c 20 7a 50 33 2c 20 6e 29  p(p->db, zP3, n)
3e50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3e60: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
3e70: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
3e80: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  DEBUG./*.** Repl
3e90: 61 63 65 20 74 68 65 20 50 33 20 66 69 65 6c 64  ace the P3 field
3ea0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
3eb0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
3ec0: 72 75 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ruction with.** 
3ed0: 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f  comment text..*/
3ee0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3ef0: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
3f00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
3f10: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
3f20: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73  a_list ap;.  ass
3f30: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
3f40: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
3f50: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
3f60: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
3f70: 4f 70 2d 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 70  Op-1].p3==0 || p
3f80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3f90: 65 64 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  ed );.  va_start
3fa0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
3fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3fc0: 67 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69  geP3(p, -1, sqli
3fd0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
3fe0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c  b, zFormat, ap),
3ff0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
4000: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
4010: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
4020: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
4030: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
4040: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
4050: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
4060: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4070: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4080: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4090: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
40a0: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
40b0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
40c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
40d0: 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  led );.  return 
40e0: 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ((addr>=0 && add
40f0: 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61  r<p->nOp)?(&p->a
4100: 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a  Op[addr]):0);.}.
4110: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4120: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
4130: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
4140: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
4150: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
4160: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
4170: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
4180: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4190: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
41a0: 72 69 62 65 73 20 74 68 65 20 50 33 20 70 61 72  ribes the P3 par
41b0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
41c0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
41d0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
41e0: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
41f0: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
4200: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
4210: 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63  layP3(Op *pOp, c
4220: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
4230: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
4240: 7a 50 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  zP3;.  assert( n
4250: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
4260: 69 74 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70  itch( pOp->p3typ
4270: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33  e ){.    case P3
4280: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
4290: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
42a0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
42b0: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
42c0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
42d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
42e0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
42f0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
4300: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4310: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4320: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4330: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4340: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4350: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4360: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4370: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
4380: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
4390: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
43a0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
43b0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
43c0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
43d0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
43e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
43f0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4410: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4420: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4430: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4440: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4450: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4460: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4470: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
4480: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4490: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
44a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
44b0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
44c0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
44d0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
44e0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
44f0: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
4500: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4510: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4520: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4530: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4550: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4560: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4570: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
4580: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
4590: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33  emp );.      zP3
45a0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
45b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
45c0: 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51   case P3_COLLSEQ
45d0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
45e0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
45f0: 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Seq*)pOp->p3;.  
4600: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4610: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4620: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
4630: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
4640: 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  e);.      zP3 = 
4650: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
4660: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4670: 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b  se P3_FUNCDEF: {
4680: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
4690: 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a  pDef = (FuncDef*
46a0: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
46b0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
46c0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
46d0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
46e0: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
46f0: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
4700: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4710: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
4720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4730: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
4740: 73 65 20 50 33 5f 56 54 41 42 3a 20 7b 0a 20 20  se P3_VTAB: {.  
4750: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
4760: 20 2a 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74   *pVtab = (sqlit
4770: 65 33 5f 76 74 61 62 2a 29 70 4f 70 2d 3e 70 33  e3_vtab*)pOp->p3
4780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4790: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
47a0: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
47b0: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
47c0: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
47d0: 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a     zP3 = zTemp;.
47e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
4800: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
4810: 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  P3 = pOp->p3;.  
4820: 20 20 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c      if( zP3==0 |
4830: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
4840: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
4850: 20 20 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20    zP3 = "";.    
4860: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4870: 61 73 73 65 72 74 28 20 7a 50 33 21 3d 30 20 29  assert( zP3!=0 )
4880: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b 0a  ;.  return zP3;.
4890: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  }.#endif...#if d
48a0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
48b0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
48c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
48d0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
48e0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
48f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4900: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
4910: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
4920: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
4930: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
4940: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
4950: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61  char *zP3;.  cha
4960: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74  r zPtr[50];.  st
4970: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4980: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
4990: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
49a0: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
49b0: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
49c0: 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73  out;.  zP3 = dis
49d0: 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72  playP3(pOp, zPtr
49e0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
49f0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
4a00: 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20   zFormat1,.     
4a10: 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f   pc, sqlite3Opco
4a20: 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63  deNames[pOp->opc
4a30: 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode], pOp->p1, p
4a40: 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20  Op->p2, zP3);.  
4a50: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
4a60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4a70: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
4a80: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
4a90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4aa0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4ab0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
4ac0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77    if( p ){.    w
4ad0: 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20  hile( N-->0 ){. 
4ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4af0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b  MemRelease(p++);
4b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
4b10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4b20: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
4b30: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
4b40: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
4b50: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
4b60: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
4b70: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
4b80: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
4b90: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
4ba0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
4bb0: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
4bc0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
4bd0: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
4be0: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
4bf0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
4c00: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
4c10: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
4c20: 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  N"..*/.int sqlit
4c30: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
4c40: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
4c50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
4c60: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  DBE */.){.  sqli
4c70: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4c80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4ca0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
4cb0: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70  plain );.  if( p
4cc0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
4cd0: 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e  GIC_RUN ) return
4ce0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
4cf0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
4d00: 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic==SQLITE_MAGI
4d10: 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  C_BUSY );.  asse
4d20: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
4d30: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
4d40: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20  QLITE_BUSY );.. 
4d50: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
4d60: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
4d70: 20 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d 69 63   not put dynamic
4d80: 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68   strings onto th
4d90: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b  e.  ** the stack
4da0: 2c 20 74 68 65 79 20 6d 61 79 20 62 65 63 6f 6d  , they may becom
4db0: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
4dc0: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
4dd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4de0: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
4df0: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
4e00: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
4e10: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
4e20: 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61 53 74 61  ->pTos==&p->aSta
4e30: 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20 72 65 6c  ck[4] ){.    rel
4e40: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
4e50: 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a  aStack, 5);.  }.
4e60: 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20    p->resOnStack 
4e70: 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  = 0;..  do{.    
4e80: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
4e90: 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20  while( i<p->nOp 
4ea0: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
4eb0: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
4ec0: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
4ed0: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
4ee0: 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  nOp ){.    p->rc
4ef0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4f00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
4f10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
4f20: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
4f30: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
4f40: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
4f50: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
4f60: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4f70: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
4f80: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
4f90: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
4fa0: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
4fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
4fc0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
4fd0: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
4fe0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
4ff0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5000: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
5010: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5020: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
5030: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5060: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
5070: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
5080: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5090: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
50a0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
50b0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
50c0: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
50d0: 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64  Names[pOp->opcod
50e0: 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e];  /* Opcode *
50f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  /.    assert( pM
5100: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
5110: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e  pMem->n = strlen
5120: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70  (pMem->z);.    p
5130: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5140: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
5150: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
5160: 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  UTF8;.    pMem++
5170: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
5180: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
5190: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
51a0: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
51d0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
51e0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
51f0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
5200: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5210: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
5220: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
5250: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5260: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5270: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5280: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5290: 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d  _Ephem|MEM_Str|M
52a0: 45 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20 50 33  EM_Term;   /* P3
52b0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   */.    pMem->z 
52c0: 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c  = displayP3(pOp,
52d0: 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73   pMem->zShort, s
52e0: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f  izeof(pMem->zSho
52f0: 72 74 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rt));.    assert
5300: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
5310: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
5320: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
5330: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5340: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
5350: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
5360: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
5370: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
5380: 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 2*(p->explain
5390: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  -1);.    p->pTos
53a0: 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e   = pMem;.    p->
53b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
53c0: 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63      p->resOnStac
53d0: 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
53e0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
53f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
5400: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5410: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
5420: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5430: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
5440: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
5450: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
5460: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
5470: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
5480: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
5490: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
54a0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
54b0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
54c0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
54d0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
54e0: 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20  p[nOp-1];.  if( 
54f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
5500: 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21  Noop && pOp->p3!
5510: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
5520: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
5530: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  3;.    while( is
5540: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29  space(*(u8*)z) )
5550: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
5560: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
5570: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
5580: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5590: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
55a0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
55b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
55c0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
55d0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
55e0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
55f0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
5600: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
5610: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
5620: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
5630: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
5640: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
5650: 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29 20 72  _io_trace==0 ) r
5660: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
5670: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
5680: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70  Op = &p->aOp[nOp
5690: 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  -1];.  if( pOp->
56a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20  opcode==OP_Noop 
56b0: 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b  && pOp->p3!=0 ){
56c0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
56d0: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
56e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
56f0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
5700: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
5710: 33 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  3);.    for(i=0;
5720: 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e   isspace((unsign
5730: 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b 20 69  ed char)z[i]); i
5740: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
5750: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
5760: 20 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65       if( isspace
5770: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
5780: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
5790: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
57a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
57b0: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
57c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
57d0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
57e0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
57f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
5800: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
5810: 33 5f 69 6f 5f 74 72 61 63 65 28 22 53 51 4c 20  3_io_trace("SQL 
5820: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
5830: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
5840: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
5850: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
5860: 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  OTRACE */.../*.*
5870: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
5880: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
5890: 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73  execution.  This
58a0: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
58b0: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
58c0: 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61  cating stack spa
58d0: 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ce and initializ
58e0: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
58f0: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
5900: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
5910: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
5920: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
5930: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
5940: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
5950: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
5960: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
5970: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
5980: 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42   a VDBE from VDB
5990: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a  E_MAGIC_INIT to.
59a0: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  ** VDBE_MAGIC_RU
59b0: 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  N..*/.void sqlit
59c0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
59d0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
5a00: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
5a30: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
5a40: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
5a50: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
5a80: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
5a90: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
5aa0: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
5ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5ac0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
5ad0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
5ae0: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5b00: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
5b10: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
5b20: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
5b30: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
5b40: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
5b50: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
5b60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5b70: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5b80: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
5b90: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
5ba0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
5bb0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
5bc0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
5bd0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
5be0: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
5bf0: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
5c00: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
5c10: 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63  This.   * is bec
5c20: 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
5c30: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29   resizeOpArray()
5c40: 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e   below may shrin
5c50: 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f  k the.   * p->aO
5c60: 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76  p[] array to sav
5c70: 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c  e memory if call
5c80: 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f  ed when in VDBE_
5c90: 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20  MAGIC_RUN .   * 
5ca0: 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70  state..   */.  p
5cb0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
5cc0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20  AGIC_RUN;..  /* 
5cd0: 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  No instruction e
5ce0: 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20  ver pushes more 
5cf0: 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c  than a single el
5d00: 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20  ement onto the. 
5d10: 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20   ** stack.  And 
5d20: 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20  the stack never 
5d30: 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73  grows on success
5d40: 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f  ive executions o
5d50: 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  f the.  ** same 
5d60: 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f  loop.  So the to
5d70: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
5d80: 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e  structions is an
5d90: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a   upper bound.  *
5da0: 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  * on the maximum
5db0: 20 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71   stack depth req
5dc0: 75 69 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c  uired.  (Added l
5dd0: 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a  ater:)  The.  **
5de0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
5df0: 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73  () call computes
5e00: 20 61 20 74 69 67 68 74 65 72 20 75 70 70 65 72   a tighter upper
5e10: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20   bound on the.  
5e20: 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20  ** stack size.. 
5e30: 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   **.  ** Allocat
5e40: 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63  ion all the stac
5e50: 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20  k space we will 
5e60: 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a  ever need..  */.
5e70: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d    if( p->aStack=
5e80: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  =0 ){.    int nA
5e90: 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  rg;       /* Max
5ea0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
5eb0: 72 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20  rgs passed to a 
5ec0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  user function. *
5ed0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b  /.    int nStack
5ee0: 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  ;     /* Maximum
5ef0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b   number of stack
5f00: 20 65 6e 74 72 69 65 73 20 72 65 71 75 69 72 65   entries require
5f10: 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65  d */.    resolve
5f20: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
5f30: 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20  g, &nStack);.   
5f40: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
5f50: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61  , p->nOp);.    a
5f60: 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29  ssert( nVar>=0 )
5f70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53  ;.    assert( nS
5f80: 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  tack<p->nOp );. 
5f90: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
5fa0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 61 63 6b   ){.      nStack
5fb0: 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20   = 10;.    }.   
5fc0: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
5fd0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
5fe0: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 53 74  (db,.        nSt
5ff0: 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53  ack*sizeof(p->aS
6000: 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61  tack[0])    /* a
6010: 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b  Stack */.      +
6020: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
6030: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
6040: 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20  /* apArg */.    
6050: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6060: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6070: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
6080: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
6090: 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20  f(char*)        
60a0: 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f       /* azVar */
60b0: 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69  .      + nMem*si
60c0: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
60d0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20          /* aMem 
60e0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73  */.      + nCurs
60f0: 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72  or*sizeof(Cursor
6100: 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43  *)        /* apC
6110: 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20  sr */.    );.   
6120: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
6130: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
6140: 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53  p->aMem = &p->aS
6150: 74 61 63 6b 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20  tack[nStack];.  
6160: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
6170: 65 6d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  em;.      p->aVa
6180: 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65  r = &p->aMem[nMe
6190: 6d 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61  m];.      p->nVa
61a0: 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20  r = nVar;.      
61b0: 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20  p->okVar = 0;.  
61c0: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28      p->apArg = (
61d0: 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e  Mem**)&p->aVar[n
61e0: 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Var];.      p->a
61f0: 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26  zVar = (char**)&
6200: 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a  p->apArg[nArg];.
6210: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d        p->apCsr =
6220: 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61   (Cursor**)&p->a
6230: 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  zVar[nVar];.    
6240: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
6250: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f  Cursor;.      fo
6260: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
6270: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
6280: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
6290: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
62a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
62b0: 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d  r(n=0; n<p->nMem
62c0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; n++){.    p->a
62d0: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
62e0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 20 20  EM_Null;.  }..  
62f0: 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53  p->pTos = &p->aS
6300: 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70  tack[-1];.  p->p
6310: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
6320: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
6330: 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b  ->uniqueCnt = 0;
6340: 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74  .  p->returnDept
6350: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f  h = 0;.  p->erro
6360: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
6370: 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63  rt;.  p->popStac
6380: 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70  k =  0;.  p->exp
6390: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
63a0: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
63b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
63c0: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
63d0: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
63e0: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
63f0: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
6400: 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53  55;.  p->openedS
6410: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69  tatement = 0;.#i
6420: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
6430: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
6440: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6450: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
6460: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
6470: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
6480: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
6490: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
64a0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
64b0: 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20  se a cursor and 
64c0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
64d0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
64e0: 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a  ursor happens.**
64f0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
6500: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
6510: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
6520: 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20   Cursor *pCx){. 
6530: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
6540: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6550: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
6560: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
6570: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
6580: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
6590: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
65a0: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
65b0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
65c0: 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  >pBt);.  }.#ifnd
65d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
65e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
65f0: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
6600: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
6610: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
6620: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
6630: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
6640: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
6650: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
6660: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
6670: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
6680: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  thod = 1;.    sq
6690: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70  lite3SafetyOff(p
66a0: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75  ->db);.    pModu
66b0: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
66c0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
66d0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e  ite3SafetyOn(p->
66e0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  db);.    p->inVt
66f0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
6700: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
6710: 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61  e3_free(pCx->pDa
6720: 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta);.  sqlite3_f
6730: 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b  ree(pCx->aType);
6740: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6750: 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pCx);.}../*.** C
6760: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
6770: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6780: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
6790: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
67a0: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  i;.  if( p->apCs
67b0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
67c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
67d0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
67e0: 20 20 69 66 28 20 21 70 2d 3e 69 6e 56 74 61 62    if( !p->inVtab
67f0: 4d 65 74 68 6f 64 20 7c 7c 20 28 70 2d 3e 61 70  Method || (p->ap
6800: 43 73 72 5b 69 5d 20 26 26 20 21 70 2d 3e 61 70  Csr[i] && !p->ap
6810: 43 73 72 5b 69 5d 2d 3e 70 56 74 61 62 43 75 72  Csr[i]->pVtabCur
6820: 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  sor) ){.      sq
6830: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
6840: 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b  sor(p, p->apCsr[
6850: 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  i]);.      p->ap
6860: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
6870: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
6880: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
6890: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a  fter execution..
68a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
68b0: 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ne will automati
68c0: 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20  cally close any 
68d0: 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20  cursors, lists, 
68e0: 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72  and/or.** sorter
68f0: 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74  s that were left
6900: 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20   open.  It also 
6910: 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75  deletes the valu
6920: 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c  es of.** variabl
6930: 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d  es in the aVar[]
6940: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
6950: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
6960: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
6970: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  ;.  if( p->aStac
6980: 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  k ){.    release
6990: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61  MemArray(p->aSta
69a0: 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73  ck, 1 + (p->pTos
69b0: 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a   - p->aStack));.
69c0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70      p->pTos = &p
69d0: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20  ->aStack[-1];.  
69e0: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
69f0: 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73  ors(p);.  releas
6a00: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
6a10: 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73  m, p->nMem);.  s
6a20: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
6a30: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
6a40: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
6a50: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
6a60: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
6a70: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
6a80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6a90: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
6aa0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
6ab0: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
6ac0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6ad0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
6ae0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
6af0: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
6b00: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
6b10: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
6b20: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
6b30: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
6b40: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
6b50: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
6b60: 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b  .  p->resOnStack
6b70: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
6b80: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
6b90: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
6ba0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
6bb0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
6bc0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
6bd0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
6be0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
6bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
6c00: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
6c10: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
6c20: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
6c30: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
6c40: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
6c50: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
6c60: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
6c70: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
6c80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6c90: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
6ca0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
6cb0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
6cc0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
6cd0: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
6ce0: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
6cf0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
6d00: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
6d10: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f  ite3_free(p->aCo
6d20: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
6d30: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
6d40: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
6d50: 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e  umn = nResColumn
6d60: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
6d70: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
6d80: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
6d90: 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73 69  ocZero(p->db, si
6da0: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
6db0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
6dc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6dd0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
6de0: 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61 6d 65 2b  {.    (pColName+
6df0: 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  +)->flags = MEM_
6e00: 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Null;.  }.}../*.
6e10: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
6e20: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
6e30: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
6e40: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
6e50: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
6e60: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
6e70: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
6e80: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
6e90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
6ea0: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
6eb0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
6ec0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
6ed0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ols()..**.** If 
6ee0: 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74  N==P3_STATIC  it
6ef0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d   means that zNam
6f00: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
6f10: 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61  o a constant sta
6f20: 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e  tic.** string an
6f30: 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  d we can just co
6f40: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20  py the pointer. 
6f50: 49 66 20 69 74 20 69 73 20 50 33 5f 44 59 4e 41  If it is P3_DYNA
6f60: 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  MIC, then .** th
6f70: 65 20 73 74 72 69 6e 67 20 69 73 20 66 72 65 65  e string is free
6f80: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
6f90: 66 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  free() when the 
6fa0: 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65 64  vdbe is finished
6fb0: 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68   with.** it. Oth
6fc0: 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20  erwise, N bytes 
6fd0: 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70  of zName are cop
6fe0: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
6ff0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7000: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
7010: 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e  dx, int var, con
7020: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
7030: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63  int N){.  int rc
7040: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
7050: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
7060: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
7070: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
7080: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
7090: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
70a0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
70b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
70c0: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
70d0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
70e0: 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
70f0: 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e  Name[idx+var*p->
7100: 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  nResColumn]);.  
7110: 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49  if( N==P3_DYNAMI
7120: 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49  C || N==P3_STATI
7130: 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  C ){.    rc = sq
7140: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
7150: 74 72 28 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20  tr(p->db, .     
7160: 20 20 20 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61     pColName, zNa
7170: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
7180: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
7190: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
71a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
71b0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 2d 3e 64  beMemSetStr(p->d
71c0: 62 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  b, .        pCol
71d0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20  Name, zName, N, 
71e0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
71f0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
7200: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
7210: 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33  LITE_OK && N==P3
7220: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
7230: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
7240: 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  = (pColName->fla
7250: 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29  gs&(~MEM_Static)
7260: 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70  )|MEM_Dyn;.    p
7270: 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20  ColName->xDel = 
7280: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7290: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
72a0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
72b0: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
72c0: 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
72d0: 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
72e0: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
72f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7300: 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
7310: 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
7320: 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
7330: 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
7340: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
7350: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
7360: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
7370: 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
7380: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
7390: 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
73a0: 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
73b0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
73c0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
73d0: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
73e0: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
73f0: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
7400: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7410: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
7420: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
7430: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
7440: 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  ;..  /* Before d
7450: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
7460: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
7470: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
7480: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
7490: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
74a0: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
74b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
74c0: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
74d0: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
74e0: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
74f0: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
7500: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
7510: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
7520: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
7530: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
7540: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
7550: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
7560: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
7570: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
7580: 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20 69  ync(db, rc);.  i
7590: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
75a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
75b0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
75c0: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
75d0: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
75e0: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
75f0: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
7600: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
7610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7620: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
7630: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
7640: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
7650: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
7660: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
7670: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
7680: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
7690: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
76a0: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
76b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
76c0: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
76d0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
76e0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
76f0: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
7700: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
7710: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7720: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
7730: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7740: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
7750: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
7760: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
7770: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
7780: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
7790: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
77a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
77b0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
77c0: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
77d0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
77e0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
77f0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
7800: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
7810: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
7820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
7830: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
7840: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
7850: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
7860: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
7870: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
7880: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  db);.    if( rc 
7890: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
78a0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
78b0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
78c0: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
78d0: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
78e0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
78f0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
7900: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
7910: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
7920: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
7930: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
7940: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
7950: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
7960: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
7970: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
7980: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
7990: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
79a0: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
79b0: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
79c0: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
79d0: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
79e0: 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ry:.  In that ca
79f0: 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f  se we do.  ** no
7a00: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
7a10: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
7a20: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
7a30: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
7a40: 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a  .  ** too..  */.
7a50: 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28    if( 0==strlen(
7a60: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
7a70: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
7a80: 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61  0].pBt)) || nTra
7a90: 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  ns<=1 ){.    for
7aa0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
7ab0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
7ac0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
7ad0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
7ae0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
7af0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
7b00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7b10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
7b20: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
7b30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
7b40: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
7b50: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
7b60: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
7b70: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
7b80: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
7b90: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
7ba0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
7bb0: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
7bc0: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
7bd0: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
7be0: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
7bf0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
7c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
7c10: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
7c20: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
7c30: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
7c40: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
7c50: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
7c60: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
7c70: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
7c80: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
7c90: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
7ca0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
7cb0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
7cc0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
7cd0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
7ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
7cf0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
7d00: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
7d10: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
7d20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7d30: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
7d40: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
7d50: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
7d60: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
7d70: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
7d80: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
7d90: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
7da0: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
7db0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
7dc0: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
7dd0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7de0: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
7df0: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
7e00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7e10: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
7e20: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
7e30: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
7e40: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
7e50: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
7e60: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
7e70: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
7e80: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
7e90: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
7ea0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
7eb0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
7ec0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
7ed0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
7ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
7ef0: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
7f00: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
7f10: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65   0;..    /* Sele
7f20: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
7f30: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
7f40: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
7f50: 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20  u32 random;.    
7f60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7f70: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
7f80: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
7f90: 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c  (sizeof(random),
7fa0: 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20   &random);.     
7fb0: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
7fc0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
7fd0: 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e  s-mj%08X", zMain
7fe0: 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37  File, random&0x7
7ff0: 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
8000: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a  if( !zMaster ){.
8010: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
8020: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8030: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
8040: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
8050: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8060: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
8070: 49 53 54 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ISTS) );..    /*
8080: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
8090: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
80a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
80b0: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
80c0: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
80d0: 72 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49  r, .        SQLI
80e0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
80f0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
8100: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 53 51  EATE|.        SQ
8110: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
8120: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
8130: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20  MASTER_JOURNAL. 
8140: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
8150: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8160: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8170: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8180: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8190: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
81a0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
81b0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
81c0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
81d0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
81e0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
81f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
8200: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8210: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
8220: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
8230: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8240: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
8250: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
8260: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
8270: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
8280: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
8290: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
82a0: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
82b0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
82c0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
82d0: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
82e0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
82f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8300: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
8310: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8320: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8330: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
8340: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
8350: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
8360: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
8370: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
8380: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
8390: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
83a0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
83b0: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
83c0: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
83d0: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
83e0: 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30   if( zFile[0]==0
83f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
8400: 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a   Ignore :memory:
8410: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
8420: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
8430: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
8440: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
8450: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
8460: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
8470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8480: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8490: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
84a0: 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46  zFile, strlen(zF
84b0: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
84c0: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
84d0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  += strlen(zFile)
84e0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
84f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8500: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8510: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
8520: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
8530: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
8540: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
8550: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
8560: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
8570: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
8580: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
8590: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
85a0: 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   }...    /* Sync
85b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
85c0: 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f 72 65  nal file. Before
85d0: 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f 70 65   doing this, ope
85e0: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  n the directory.
85f0: 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65      ** the maste
8600: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
8610: 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20 74 68  s store in so th
8620: 61 74 20 69 74 20 67 65 74 73 20 73 79 6e 63 65  at it gets synce
8630: 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  d too..    */.  
8640: 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    zMainFile = sq
8650: 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
8660: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
8670: 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e  pBt);.    if( (n
8680: 65 65 64 53 79 6e 63 20 26 26 20 28 72 63 3d 73  eedSync && (rc=s
8690: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
86a0: 73 74 65 72 2c 30 29 29 21 3d 53 51 4c 49 54 45  ster,0))!=SQLITE
86b0: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71  _OK) ){.      sq
86c0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
86d0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
86e0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
86f0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8700: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8710: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8720: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8740: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
8750: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
8760: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
8770: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
8780: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
8790: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
87a0: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
87b0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
87c0: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
87d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
87e0: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
87f0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8800: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
8810: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
8820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
8830: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
8840: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
8850: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
8860: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
8870: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
8880: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
8890: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
88a0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
88b0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
88c0: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
88d0: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
88e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
88f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
8900: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
8910: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
8920: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
8930: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
8940: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8950: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
8960: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
8970: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
8980: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
8990: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
89a0: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
89b0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
89c0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
89d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
89e0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
89f0: 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
8a00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8a10: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8a20: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
8a30: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8a40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8a50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
8a60: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
8a70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
8a80: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
8a90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8aa0: 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
8ab0: 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
8ac0: 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
8ad0: 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
8ae0: 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
8af0: 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
8b00: 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
8b10: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
8b20: 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
8b30: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
8b40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
8b50: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
8b60: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
8b70: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
8b80: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
8b90: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
8ba0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8bb0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
8bc0: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
8bd0: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
8be0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
8bf0: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
8c00: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
8c10: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
8c20: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
8c30: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
8c40: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
8c50: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
8c60: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
8c70: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
8c80: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
8c90: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
8ca0: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
8cb0: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
8cc0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
8cd0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
8ce0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
8cf0: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
8d00: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
8d10: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
8d20: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
8d30: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
8d40: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
8d50: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
8d60: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
8d70: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
8d80: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
8d90: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
8da0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8db0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
8dc0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
8dd0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
8de0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
8df0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
8e00: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
8e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e20: 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
8e30: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
8e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
8e50: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
8e60: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
8e70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
8e80: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
8e90: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
8ea0: 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e  te3.activeVdbeCn
8eb0: 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  t count variable
8ec0: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
8ed0: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
8ee0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
8ef0: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
8f00: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
8f10: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
8f20: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
8f30: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
8f40: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
8f50: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
8f60: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
8f70: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
8f80: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
8f90: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
8fa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
8fb0: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
8fc0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
8fd0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
8fe0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
8ff0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
9000: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
9010: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
9020: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
9030: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
9040: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
9050: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
9060: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
9070: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
9080: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
9090: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
90a0: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
90b0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
90c0: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
90d0: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
90e0: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
90f0: 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72 79 20  *.** Find every 
9100: 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65 72 20  active VM other 
9110: 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64 20 63  than pVdbe and c
9120: 68 61 6e 67 65 20 69 74 73 20 73 74 61 74 75 73  hange its status
9130: 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64 2e 20   to.** aborted. 
9140: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
9150: 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73 65 73  en one VM causes
9160: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75 65 20   a rollback due 
9170: 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46  to an.** ON CONF
9180: 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20 63 6c  LICT ROLLBACK cl
9190: 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d 70 6c  ause (for exampl
91a0: 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72 20 56  e).  The other V
91b0: 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61 62  Ms must be.** ab
91c0: 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  orted so that th
91d0: 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 64  ey do not have d
91e0: 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74 20 66  ata rolled out f
91f0: 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68 0a 2a  rom underneath.*
9200: 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67 20 74  * them leading t
9210: 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2f  o a segfault..*/
9220: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 62 6f  .void sqlite3Abo
9230: 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62  rtOtherActiveVdb
9240: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
9250: 56 64 62 65 20 2a 70 45 78 63 65 70 74 29 7b 0a  Vdbe *pExcept){.
9260: 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72 3b 0a    Vdbe *pOther;.
9270: 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 64 62 2d    for(pOther=db-
9280: 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72 3b 20  >pVdbe; pOther; 
9290: 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d 3e 70  pOther=pOther->p
92a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
92b0: 4f 74 68 65 72 3d 3d 70 45 78 63 65 70 74 20 29  Other==pExcept )
92c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
92d0: 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67 69 63  f( pOther->magic
92e0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
92f0: 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63 3c 30   || pOther->pc<0
9300: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9310: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
9320: 43 6e 74 28 64 62 29 3b 0a 20 20 20 20 63 6c 6f  Cnt(db);.    clo
9330: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 4f 74  seAllCursors(pOt
9340: 68 65 72 29 3b 0a 20 20 20 20 63 68 65 63 6b 41  her);.    checkA
9350: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
9360: 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 61 62  ;.    pOther->ab
9370: 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  orted = 1;.  }.}
9380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9390: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
93a0: 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
93b0: 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
93c0: 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
93d0: 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
93e0: 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
93f0: 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
9400: 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
9410: 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
9420: 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
9430: 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
9440: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
9450: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
9460: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
9470: 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
9480: 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
9490: 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
94a0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
94b0: 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LT..**.** Return
94c0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
94d0: 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
94e0: 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
94f0: 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
9500: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
9510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
9520: 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
9530: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
9540: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
9550: 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
9560: 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
9570: 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
9580: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
9590: 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
95a0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
95b0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  = p->db;.  int i
95c0: 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  ;.  int (*xFunc)
95d0: 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30  (Btree *pBt) = 0
95e0: 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ;  /* Function t
95f0: 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62  o call on each b
9600: 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  tree backend */.
9610: 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
9620: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
9630: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
9640: 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  if SQLITE_NOMEM 
9650: 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f  or IOERR */..  /
9660: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9670: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
9680: 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
9690: 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
96a0: 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
96b0: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
96c0: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
96d0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
96e0: 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
96f0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
9700: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
9710: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 65  . .  **.  ** Spe
9720: 63 69 61 6c 20 65 72 72 6f 72 73 3a 0a 20 20 2a  cial errors:.  *
9730: 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20 61 6e  *.  **     If an
9740: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 65 72   SQLITE_NOMEM er
9750: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
9760: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  in a statement t
9770: 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a 20 20  hat writes to.  
9780: 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74 61 62  **     the datab
9790: 61 73 65 2c 20 74 68 65 6e 20 65 69 74 68 65 72  ase, then either
97a0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
97b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
97c0: 20 62 65 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   be rolled.  ** 
97d0: 20 20 20 20 62 61 63 6b 20 74 6f 20 65 6e 73 75      back to ensu
97e0: 72 65 20 74 68 65 20 74 72 65 65 2d 73 74 72 75  re the tree-stru
97f0: 63 74 75 72 65 73 20 61 72 65 20 69 6e 20 61 20  ctures are in a 
9800: 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
9810: 2e 20 41 0a 20 20 2a 2a 20 20 20 20 20 73 74 61  . A.  **     sta
9820: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
9830: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
9840: 6b 20 69 66 20 6f 6e 65 20 69 73 20 6f 70 65 6e  k if one is open
9850: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 0a  , otherwise the.
9860: 20 20 2a 2a 20 20 20 20 20 65 6e 74 69 72 65 20    **     entire 
9870: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
9880: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
9890: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49  .  **.  **     I
98a0: 66 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  f an SQLITE_IOER
98b0: 52 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  R error has occu
98c0: 72 65 64 20 69 6e 20 61 20 73 74 61 74 65 6d 65  red in a stateme
98d0: 6e 74 20 74 68 61 74 20 77 72 69 74 65 73 20 74  nt that writes t
98e0: 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 64  o.  **     the d
98f0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68  atabase, then th
9900: 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
9910: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
9920: 6c 65 64 20 62 61 63 6b 2e 20 54 68 65 0a 20 20  led back. The.  
9930: 2a 2a 20 20 20 20 20 49 2f 4f 20 65 72 72 6f 72  **     I/O error
9940: 20 6d 61 79 20 68 61 76 65 20 63 61 75 73 65 64   may have caused
9950: 20 67 61 72 62 61 67 65 20 74 6f 20 62 65 20 77   garbage to be w
9960: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
9970: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 20 20 20 20  urnal .  **     
9980: 66 69 6c 65 2e 20 57 65 72 65 20 74 68 65 20 74  file. Were the t
9990: 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
99a0: 6e 74 69 6e 75 65 20 61 6e 64 20 65 76 65 6e 74  ntinue and event
99b0: 75 61 6c 6c 79 20 62 65 20 72 6f 6c 6c 65 64 20  ually be rolled 
99c0: 0a 20 20 2a 2a 20 20 20 20 20 62 61 63 6b 20 74  .  **     back t
99d0: 68 61 74 20 67 61 72 62 61 67 65 20 6d 69 67 68  hat garbage migh
99e0: 74 20 65 6e 64 20 75 70 20 69 6e 20 74 68 65 20  t end up in the 
99f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
9a00: 20 2a 2a 20 20 20 20 20 0a 20 20 2a 2a 20 20 20   **     .  **   
9a10: 20 20 49 6e 20 62 6f 74 68 20 6f 66 20 74 68 65    In both of the
9a20: 20 61 62 6f 76 65 20 63 61 73 65 73 2c 20 74 68   above cases, th
9a30: 65 20 56 64 62 65 2e 65 72 72 6f 72 41 63 74 69  e Vdbe.errorActi
9a40: 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 0a  on variable is .
9a50: 20 20 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65 64    **     ignored
9a60: 2e 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  . If the sqlite3
9a70: 2e 61 75 74 6f 43 6f 6d 6d 69 74 20 66 6c 61 67  .autoCommit flag
9a80: 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 20   is false and a 
9a90: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
9aa0: 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20 62       is rolled b
9ab0: 61 63 6b 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ack, it will be 
9ac0: 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 20 20 2a  set to true..  *
9ad0: 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 20 65 72 72  *.  ** Other err
9ae0: 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ors:.  **.  ** N
9af0: 6f 20 65 72 72 6f 72 3a 0a 20 20 2a 2a 0a 20 20  o error:.  **.  
9b00: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
9b10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9b20: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
9b30: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9b40: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
9b50: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
9b60: 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  .    /* Already 
9b70: 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67  halted.  Nothing
9b80: 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61   to do. */.    a
9b90: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9ba0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
9bb0: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
9bc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9bd0: 41 42 4c 45 0a 20 20 20 20 63 6c 6f 73 65 41 6c  ABLE.    closeAl
9be0: 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 23 65 6e  lCursors(p);.#en
9bf0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
9c00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
9c10: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
9c20: 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  p);.  checkActiv
9c30: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
9c40: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
9c50: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
9c60: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
9c70: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
9c80: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
9c90: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
9ca0: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
9cb0: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
9cc0: 72 63 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 68 65  rc */.    /* Che
9cd0: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
9ce0: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
9cf0: 20 2d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20   - SQLITE_NOMEM 
9d00: 6f 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  or SQLITE_IOERR 
9d10: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
9d20: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
9d30: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
9d40: 28 0a 20 20 20 20 20 20 20 20 28 6d 72 63 3d 3d  (.        (mrc==
9d50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
9d60: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
9d70: 52 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  R || mrc==SQLITE
9d80: 5f 49 4e 54 45 52 52 55 50 54 29 3f 31 3a 30 29  _INTERRUPT)?1:0)
9d90: 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
9da0: 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
9db0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
9dc0: 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  oes static analy
9dd0: 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  sis of the query
9de0: 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66   to see which of
9df0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f   the.      ** fo
9e00: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61  llowing three ca
9e10: 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c  tegories it fall
9e20: 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a  s into:.      **
9e30: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65  .      **     Re
9e40: 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a  ad-only.      **
9e50: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20       Query with 
9e60: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9e70: 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  l.      **     Q
9e80: 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61  uery without sta
9e90: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  tement journal. 
9ea0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9eb0: 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d   We could do som
9ec0: 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67  ething more eleg
9ed0: 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74  ant than this st
9ee0: 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69  atic analysis (i
9ef0: 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f  .e..      ** sto
9f00: 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71  re the type of q
9f10: 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20  uery as part of 
9f20: 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20  the compliation 
9f30: 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20  phase), but .   
9f40: 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d     ** handling m
9f50: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
9f60: 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c  ilure is a fairl
9f70: 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63  y obscure edge c
9f80: 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a  ase so .      **
9f90: 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c   this is probabl
9fa0: 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20  y easier. Todo: 
9fb0: 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f  Might be an oppo
9fc0: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63  rtunity to reduc
9fd0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  e .      ** code
9fe0: 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61   size a very sma
9ff0: 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68  ll amount though
a000: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
a010: 20 20 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c     int isReadOnl
a020: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  y = 1;.      int
a030: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30   isStatement = 0
a040: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
a050: 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d  ->aOp || p->nOp=
a060: 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  =0);.      for(i
a070: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
a080: 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69  +){ .        swi
a090: 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  tch( p->aOp[i].o
a0a0: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
a0b0: 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73     case OP_Trans
a0c0: 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  action:.        
a0d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
a0e0: 20 62 69 74 20 73 74 72 61 6e 67 65 2e 20 49 66   bit strange. If
a0f0: 20 77 65 20 68 69 74 20 61 20 6d 61 6c 6c 6f 63   we hit a malloc
a100: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 61  () or IO error a
a110: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nd.            *
a120: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
a130: 64 69 64 20 6e 6f 74 20 6f 70 65 6e 20 61 20 73  did not open a s
a140: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
a150: 74 69 6f 6e 2c 20 77 65 20 77 69 6c 6c 0a 20 20  tion, we will.  
a160: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c            ** rol
a170: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
a180: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
a190: 20 61 62 6f 72 74 20 61 6c 6c 20 6f 74 68 65 72   abort all other
a1a0: 20 61 63 74 69 76 65 0a 20 20 20 20 20 20 20 20   active.        
a1b0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
a1c0: 73 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  s. Or, if this i
a1d0: 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  s an SQLITE_INTE
a1e0: 52 52 55 50 54 20 65 72 72 6f 72 2c 20 77 65 0a  RRUPT error, we.
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
a200: 69 6c 6c 20 6f 6e 6c 79 20 72 6f 6c 6c 62 61 63  ill only rollbac
a210: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 72 75  k if the interru
a220: 70 74 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  pted statement w
a230: 61 73 20 61 20 77 72 69 74 65 2e 0a 20 20 20 20  as a write..    
a240: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
a250: 20 20 20 20 20 20 20 2a 2a 20 49 74 20 63 6f 75         ** It cou
a260: 6c 64 20 62 65 20 61 72 67 75 65 64 20 74 68 61  ld be argued tha
a270: 74 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74 61 74  t read-only stat
a280: 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 6e 65  ements should ne
a290: 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ver.            
a2a0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 74  ** rollback anyt
a2b0: 68 69 6e 67 2e 20 42 75 74 20 63 61 72 65 66 75  hing. But carefu
a2c0: 6c 20 61 6e 61 6c 79 73 69 73 20 69 73 20 72 65  l analysis is re
a2d0: 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 20 20  quired before.  
a2e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 6b            ** mak
a2f0: 69 6e 67 20 74 68 69 73 20 63 68 61 6e 67 65 0a  ing this change.
a300: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
a310: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
a320: 2d 3e 61 4f 70 5b 69 5d 2e 70 32 20 7c 7c 20 6d  ->aOp[i].p2 || m
a330: 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
a340: 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
a350: 20 20 20 20 20 20 69 73 52 65 61 64 4f 6e 6c 79        isReadOnly
a360: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a370: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a390: 20 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65   case OP_Stateme
a3a0: 6e 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt:.            
a3b0: 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b  isStatement = 1;
a3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a3d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a3e0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
a3f0: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
a400: 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65  as read-only, we
a410: 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c   need do no roll
a420: 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68  back at all. Oth
a430: 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
a440: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
a450: 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
a460: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
a470: 20 20 20 69 66 28 20 21 69 73 52 65 61 64 4f 6e     if( !isReadOn
a480: 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ly ){.        if
a490: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a4a0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26  IOERR_BLOCKED &&
a4b0: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
a4c0: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
a4d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
a4e0: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
a4f0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
a500: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
a510: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 70 2d     } else if( p-
a520: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
a530: 4d 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74  M && isStatement
a540: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
a550: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
a560: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
a570: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a580: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
a590: 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
a5a0: 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
a5b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
a5c0: 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
a5d0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
a5e0: 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
a5f0: 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
a600: 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
a610: 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
a620: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a630: 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68   sqlite3AbortOth
a640: 65 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62  erActiveVdbes(db
a650: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , p);.          
a660: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a670: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
a680: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
a690: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
a6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a6b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
a6c0: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
a6d0: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
a6e0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
a6f0: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
a700: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
a710: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
a720: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
a730: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
a740: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
a750: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
a760: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
a770: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
a780: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
a790: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
a7a0: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
a7b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
a7c0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
a7d0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
a7e0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
a7f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
a800: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
a810: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
a820: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
a830: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
a840: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
a850: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
a860: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
a870: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
a880: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
a890: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
a8a0: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
a8b0: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
a8c0: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
a8d0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
a8e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
a8f0: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
a900: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  t(db);.        i
a910: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
a920: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
a930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
a940: 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
a950: 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
a960: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
a970: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
a980: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
a990: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
a9a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a9b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
a9c0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
a9d0: 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
a9e0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
a9f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aa00: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
aa10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
aa20: 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29 7b  se if( !xFunc ){
aa30: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
aa40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
aa50: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
aa60: 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
aa70: 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64 53    if( p->openedS
aa80: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
aa90: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
aaa0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
aab0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 20  Stmt;.        } 
aac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
aad0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
aae0: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
aaf0: 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c       xFunc = sql
ab00: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
ab10: 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c  kStmt;.      }el
ab20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ab30: 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74  te3AbortOtherAct
ab40: 69 76 65 56 64 62 65 73 28 64 62 2c 20 70 29 3b  iveVdbes(db, p);
ab50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ab60: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
ab70: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
ab80: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
ab90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
aba0: 20 20 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 73    /* If xFunc is
abb0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
abc0: 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c  it is one of sql
abd0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
abe0: 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20 2a 2a 20  kStmt or.    ** 
abf0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
ac00: 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20  itStmt. Call it 
ac10: 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 62 61 63  once on each bac
ac20: 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  kend. If an erro
ac30: 72 20 6f 63 63 75 72 73 0a 20 20 20 20 2a 2a 20  r occurs.    ** 
ac40: 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
ac50: 6f 64 65 20 69 73 20 73 74 69 6c 6c 20 53 51 4c  ode is still SQL
ac60: 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20  ITE_OK, set the 
ac70: 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74  return code to t
ac80: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 65 72  he new.    ** er
ac90: 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  ror value..    *
aca0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 78 46  /.    assert(!xF
acb0: 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20 78 46 75  unc ||.      xFu
acc0: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
acd0: 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20  CommitStmt ||.  
ace0: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
acf0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
ad00: 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 66  tmt.    );.    f
ad10: 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20 26 26  or(i=0; xFunc &&
ad20: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ad30: 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  { .      int rc;
ad40: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
ad50: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
ad60: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
ad70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
ad80: 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20  = xFunc(pBt);.  
ad90: 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20        if( rc && 
ada0: 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  (p->rc==SQLITE_O
adb0: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
adc0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29  TE_CONSTRAINT) )
add0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
ade0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
adf0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
ae00: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
ae10: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
ae20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
ae30: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
ae40: 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
ae50: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
ae60: 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  d the statement 
ae70: 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a  was committed, .
ae80: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63      ** set the c
ae90: 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a  hange counter. .
aea0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
aeb0: 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26  ->changeCntOn &&
aec0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
aed0: 20 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c     if( !xFunc ||
aee0: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
aef0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29  treeCommitStmt )
af00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
af10: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
af20: 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
af30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
af40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af50: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
af60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
af70: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
af80: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
af90: 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f  * Rollback or co
afa0: 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20  mmit any schema 
afb0: 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63  changes that occ
afc0: 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  urred. */.    if
afd0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
afe0: 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26  OK && db->flags&
aff0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
b000: 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  nges ){.      sq
b010: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
b020: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
b030: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
b040: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20   = (db->flags | 
b050: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
b060: 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nges);.    }.  }
b070: 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
b080: 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
b090: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
b0a0: 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
b0b0: 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
b0c0: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
b0d0: 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
b0e0: 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Cnt--;.  }.  p->
b0f0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
b100: 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
b110: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
b120: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
b130: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b140: 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
b150: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
b160: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
b170: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
b180: 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
b190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
b1a0: 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
b1b0: 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
b1c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b1d0: 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
b1e0: 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
b1f0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b200: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
b210: 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
b220: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
b230: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
b240: 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
b250: 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
b260: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
b270: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
b280: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
b290: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
b2a0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b2b0: 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
b2c0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
b2d0: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
b2e0: 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
b2f0: 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
b300: 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
b310: 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
b320: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
b330: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
b340: 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
b350: 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
b360: 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
b370: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
b380: 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
b390: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
b3a0: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
b3b0: 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
b3c0: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
b3d0: 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
b3e0: 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
b3f0: 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
b400: 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
b410: 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
b420: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
b430: 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
b440: 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
b450: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
b460: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
b470: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  ;.  sqlite3VdbeH
b480: 61 6c 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  alt(p);.  sqlite
b490: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
b4a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
b4b0: 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
b4c0: 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
b4d0: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
b4e0: 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
b4f0: 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
b500: 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
b510: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
b520: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
b530: 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
b540: 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
b550: 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
b560: 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
b570: 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
b580: 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
b590: 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
b5a0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
b5b0: 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
b5c0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
b5d0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
b5e0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
b5f0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
b600: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
b610: 53 74 72 28 64 62 2c 64 62 2d 3e 70 45 72 72 2c  Str(db,db->pErr,
b620: 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51  -1,p->zErrMsg,SQ
b630: 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69 74 65  LITE_UTF8,sqlite
b640: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 64  3_free);.      d
b650: 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
b660: 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  rc;.      p->zEr
b670: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
b680: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
b690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
b6a0: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
b6b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b6c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b6d0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
b6e0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
b6f0: 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
b700: 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
b710: 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
b720: 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
b730: 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
b740: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
b750: 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
b760: 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
b770: 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
b780: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
b790: 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
b7a0: 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
b7b0: 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
b7c0: 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
b7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
b7e0: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
b7f0: 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c, 0);.  }..  /*
b800: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
b810: 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
b820: 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
b830: 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
b840: 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
b850: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
b860: 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
b870: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
b880: 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70  Tos<&p->aStack[p
b890: 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20  ->pc<0?0:p->pc] 
b8a0: 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29 3b  || !p->aStack );
b8b0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
b8c0: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
b8d0: 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
b8e0: 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
b8f0: 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
b900: 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
b910: 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
b920: 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
b930: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
b940: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
b950: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
b960: 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
b970: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
b980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
b990: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
b9a0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
b9b0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
b9c0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
b9d0: 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
b9e0: 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
b9f0: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
ba00: 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
ba10: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
ba20: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
ba30: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
ba40: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
ba50: 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
ba60: 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
ba70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ba80: 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
ba90: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
baa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
bab0: 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
bac0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
bad0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
bae0: 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f  C_INIT;.  p->abo
baf0: 72 74 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  rted = 0;.  retu
bb00: 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
bb10: 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
bb20: 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
bb30: 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
bb40: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
bb50: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
bb60: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
bb70: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
bb80: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
bb90: 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
bba0: 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
bbb0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
bbc0: 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
bbd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bbe0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
bbf0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
bc00: 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
bc10: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
bc20: 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
bc30: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
bc40: 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
bc50: 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
bc60: 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
bc70: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69  else if( p->magi
bc80: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
bc90: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
bca0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
bcb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
bcc0: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
bcd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bce0: 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
bcf0: 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
bd00: 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
bd10: 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
bd20: 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
bd30: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
bd40: 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
bd50: 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
bd60: 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
bd70: 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
bd80: 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
bd90: 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
bda0: 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
bdb0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
bdc0: 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
bdd0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
bde0: 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
bdf0: 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
be00: 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
be10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
be20: 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
be30: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
be40: 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
be50: 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
be60: 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
be70: 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31  >31 || !(mask&(1
be80: 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
be90: 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
bea0: 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
beb0: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
bec0: 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
bed0: 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
bee0: 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
bef0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
bf00: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
bf10: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
bf20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bf30: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
bf40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
bf50: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
bf60: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20    Cleanup(p);.  
bf70: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
bf80: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
bf90: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
bfa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
bfb0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
bfc0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
bfd0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
bfe0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
bff0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
c000: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
c010: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
c020: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
c030: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
c040: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
c050: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e    Op *pOp = &p->
c060: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72  aOp[i];.      fr
c070: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
c080: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  , pOp->p3);.    
c090: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
c0a0: 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a  ee(p->aOp);.  }.
c0b0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
c0c0: 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
c0d0: 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ar);.  sqlite3_f
c0e0: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
c0f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c100: 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c  ->aStack);.  rel
c110: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
c120: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
c130: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
c140: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  N);.  sqlite3_fr
c150: 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  ee(p->aColName);
c160: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c170: 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d  p->zSql);.  p->m
c180: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
c190: 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65  C_DEAD;.  sqlite
c1a0: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
c1b0: 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
c1c0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
c1d0: 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
c1e0: 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
c1f0: 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
c200: 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e   now.  Return an
c210: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
c220: 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65   no MoveTo is pe
c230: 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72  nding, this.** r
c240: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68  outine does noth
c250: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ing and returns 
c260: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
c270: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
c280: 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72  sorMoveto(Cursor
c290: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
c2a0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
c2b0: 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
c2c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c2d0: 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
c2e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
c2f0: 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
c300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c310: 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
c320: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
c330: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f  Moveto(p->pCurso
c340: 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
c350: 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b  arget, 0, &res);
c360: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
c370: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d  turn rc;.    *p-
c380: 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20  >pIncrKey = 0;. 
c390: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
c3a0: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
c3b0: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
c3c0: 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
c3d0: 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69   = res==0;.    i
c3e0: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
c3f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c400: 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73  reeNext(p->pCurs
c410: 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
c420: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
c430: 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65   rc;.    }.#ifde
c440: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
c450: 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
c460: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
c470: 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
c480: 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
c490: 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
c4a0: 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
c4b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
c4c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
c4d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
c4e0: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
c4f0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
c500: 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
c510: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
c520: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
c530: 62 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a  beSerialRead().*
c540: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
c550: 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
c560: 74 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69  te3VdbeSerialWri
c570: 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  te().**.** encap
c580: 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
c590: 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
c5a0: 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
c5b0: 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
c5c0: 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
c5d0: 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
c5e0: 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
c5f0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
c600: 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
c610: 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
c620: 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
c630: 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
c640: 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
c650: 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
c660: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
c670: 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
c680: 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
c690: 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
c6a0: 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
c6b0: 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
c6c0: 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
c6d0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
c6e0: 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
c6f0: 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
c700: 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
c710: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
c720: 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
c730: 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
c740: 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
c750: 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
c760: 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
c770: 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
c780: 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
c790: 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
c7a0: 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a  ob seperately..*
c7b0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
c7c0: 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
c7d0: 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
c7e0: 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
c7f0: 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
c800: 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
c810: 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
c820: 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
c830: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
c840: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
c850: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
c860: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
c890: 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
c8c0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
c8d0: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
c900: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
c910: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
c920: 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
c930: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
c940: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
c970: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
c980: 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
c9a0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
c9b0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
c9c0: 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
c9d0: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
c9e0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c9f0: 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
ca20: 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
ca30: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
ca40: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
ca50: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
ca60: 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
ca90: 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
caa0: 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
cab0: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
cae0: 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
caf0: 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
cb00: 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
cb10: 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
cb20: 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
cb30: 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
cb40: 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
cb50: 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
cb60: 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
cb70: 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
cb80: 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
cb90: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
cba0: 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
cbb0: 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
cbc0: 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
cbd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
cbe0: 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
cbf0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
cc00: 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
cc10: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
cc20: 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
cc30: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
cc40: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
cc50: 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e  Mem->flags;.  in
cc60: 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  t n;..  if( flag
cc70: 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
cc80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cc90: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
cca0: 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
ccb0: 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
ccc0: 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
ccd0: 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
cce0: 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
ccf0: 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
cd00: 78 30 30 30 30 31 30 30 30 29 3c 3c 33 32 29 2d  x00001000)<<32)-
cd10: 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
cd20: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
cd30: 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c  4 u;.    if( fil
cd40: 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28  e_format>=4 && (
cd50: 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20  i&1)==i ){.     
cd60: 20 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20   return 8+i;.   
cd70: 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f   }.    u = i<0 ?
cd80: 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28   -i : i;.    if(
cd90: 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e   u<=127 ) return
cda0: 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33   1;.    if( u<=3
cdb0: 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
cdc0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
cdd0: 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
cde0: 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
cdf0: 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
ce00: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
ce10: 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
ce20: 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
ce30: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
ce40: 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
ce50: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
ce60: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 28   assert( flags&(
ce70: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
ce80: 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d  ) );.  n = pMem-
ce90: 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
cea0: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
ceb0: 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69    n += pMem->u.i
cec0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ced0: 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  n>=0 );.  return
cee0: 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
cef0: 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
cf00: 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  =0));.}../*.** R
cf10: 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
cf20: 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
cf30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
cf40: 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
cf50: 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-type..*/.int s
cf60: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
cf70: 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
cf80: 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
cf90: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
cfa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
cfb0: 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
cfc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
cfd0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
cfe0: 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  Size[] = { 0, 1,
cff0: 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20   2, 3, 4, 6, 8, 
d000: 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  8, 0, 0, 0, 0 };
d010: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a  .    return aSiz
d020: 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  e[serial_type];.
d030: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
d040: 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
d050: 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
d060: 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
d070: 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
d080: 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
d090: 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
d0a0: 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
d0b0: 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
d0c0: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
d0d0: 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
d0e0: 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
d0f0: 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
d100: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
d110: 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
d120: 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
d130: 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
d140: 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
d150: 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
d160: 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
d170: 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
d180: 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
d190: 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
d1a0: 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
d1b0: 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
d1c0: 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
d1d0: 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
d1e0: 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
d1f0: 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
d200: 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
d210: 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
d220: 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
d230: 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
d240: 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
d250: 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
d260: 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
d270: 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
d280: 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
d290: 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
d2a0: 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
d2b0: 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
d2c0: 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
d2d0: 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
d2e0: 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
d2f0: 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
d300: 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
d310: 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
d320: 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
d330: 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
d340: 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
d350: 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
d360: 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
d370: 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
d380: 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
d390: 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
d3a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
d3b0: 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
d3c0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
d3d0: 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
d3e0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
d3f0: 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
d400: 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
d410: 63 20 64 6f 75 62 6c 65 20 66 6c 6f 61 74 53 77  c double floatSw
d420: 61 70 28 64 6f 75 62 6c 65 20 69 6e 29 7b 0a 20  ap(double in){. 
d430: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 64 6f 75   union {.    dou
d440: 62 6c 65 20 72 3b 0a 20 20 20 20 75 33 32 20 69  ble r;.    u32 i
d450: 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
d460: 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
d470: 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
d480: 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
d490: 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
d4a0: 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
d4b0: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
d4c0: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
d4d0: 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
d4e0: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
d4f0: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
d500: 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
d510: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
d520: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
d530: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
d540: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
d550: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
d560: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
d570: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
d580: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
d590: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
d5a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
d5b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
d5c0: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
d5d0: 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
d5e0: 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
d5f0: 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
d600: 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
d610: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
d620: 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
d630: 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
d640: 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
d650: 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
d660: 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
d670: 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
d680: 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
d690: 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
d6a0: 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
d6b0: 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
d6c0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
d6d0: 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
d6e0: 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
d6f0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
d700: 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
d710: 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
d720: 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
d730: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
d740: 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
d750: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
d760: 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
d770: 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
d780: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
d790: 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
d7a0: 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
d7b0: 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
d7c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
d7d0: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
d7e0: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
d7f0: 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
d800: 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
d810: 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
d820: 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
d830: 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
d840: 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
d850: 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
d860: 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
d870: 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  []..*/ .int sqli
d880: 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
d890: 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
d8a0: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
d8b0: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
d8c0: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
d8d0: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
d8e0: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
d8f0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
d900: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
d910: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
d920: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
d930: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
d940: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
d950: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
d960: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
d970: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
d980: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
d990: 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
d9a0: 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 73  m->r) );.      s
d9b0: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
d9c0: 6f 61 74 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  oat(pMem->r);.  
d9d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26      memcpy(&v, &
d9e0: 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28  pMem->r, sizeof(
d9f0: 76 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  v));.    }else{.
da00: 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
da10: 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
da20: 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
da30: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
da40: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
da50: 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
da60: 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  =nBuf );.    whi
da70: 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
da80: 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46   buf[i] = (v&0xF
da90: 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
daa0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
dab0: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
dac0: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
dad0: 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
dae0: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
daf0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
db00: 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
db10: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
db20: 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20  em->u.i:0).     
db30: 20 20 20 20 20 20 20 20 3d 3d 20 73 71 6c 69 74          == sqlit
db40: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
db50: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
db60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
db70: 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b  pMem->n<=nBuf );
db80: 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
db90: 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
dba0: 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
dbb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  );.    if( pMem-
dbc0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
dbd0: 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b  o ){.      len +
dbe0: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
dbf0: 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20     if( len>nBuf 
dc00: 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
dc10: 20 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20   nBuf;.      }. 
dc20: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66       memset(&buf
dc30: 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65  [pMem->n], 0, le
dc40: 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  n-pMem->n);.    
dc50: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
dc60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
dc70: 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
dc80: 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
dc90: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73   0;.}../*.** Des
dca0: 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
dcb0: 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
dcc0: 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
dcd0: 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
dce0: 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
dcf0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
dd00: 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
dd10: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
dd20: 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73   read..*/ .int s
dd30: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
dd40: 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
dd50: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
dd60: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
dd70: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
dd80: 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
dd90: 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
dda0: 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
ddb0: 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
ddc0: 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
ddd0: 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
dde0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
ddf0: 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
de00: 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
de10: 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
de20: 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
de30: 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
de40: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
de50: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
de60: 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
de70: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
de80: 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
de90: 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20    /* NULL */.   
dea0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
deb0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
dec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ded0: 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
dee0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
def0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
df00: 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65  em->u.i = (signe
df10: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20  d char)buf[0];. 
df20: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
df30: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
df40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
df50: 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
df60: 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
df70: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
df80: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
df90: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
dfa0: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
dfb0: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
dfc0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
dfd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
dfe0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
dff0: 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
e000: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
e010: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e020: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
e030: 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
e040: 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
e050: 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
e060: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e070: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
e080: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
e090: 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
e0a0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
e0b0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
e0c0: 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34  .i = (buf[0]<<24
e0d0: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
e0e0: 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
e0f0: 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
e100: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e110: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e120: 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
e130: 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
e140: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
e150: 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  er */.      u64 
e160: 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  x = (((signed ch
e170: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
e180: 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75   buf[1];.      u
e190: 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c  32 y = (buf[2]<<
e1a0: 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31  24) | (buf[3]<<1
e1b0: 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29  6) | (buf[4]<<8)
e1c0: 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20   | buf[5];.     
e1d0: 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
e1e0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
e1f0: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
e200: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e210: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e220: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
e230: 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
e240: 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
e250: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
e260: 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
e270: 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
e280: 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b   */.      u64 x;
e290: 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69  .      u32 y;.#i
e2a0: 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
e2b0: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
e2c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
e2d0: 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
e2e0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
e2f0: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
e300: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
e310: 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
e320: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72        ** byte or
e330: 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
e340: 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
e350: 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
e360: 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  T is.      ** de
e370: 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
e380: 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
e390: 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
e3a0: 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a  re mixed.      *
e3b0: 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20  * endian..      
e3c0: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
e3d0: 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
e3e0: 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
e3f0: 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74  <<32;.      stat
e400: 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
e410: 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  r1 = 1.0;.      
e420: 64 6f 75 62 6c 65 20 72 32 20 3d 20 72 31 3b 0a  double r2 = r1;.
e430: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
e440: 6e 64 69 61 6e 46 6c 6f 61 74 28 72 32 29 3b 0a  ndianFloat(r2);.
e450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
e460: 7a 65 6f 66 28 72 32 29 3d 3d 73 69 7a 65 6f 66  zeof(r2)==sizeof
e470: 28 74 31 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t1) && memcmp(&
e480: 72 32 2c 20 26 74 31 2c 20 73 69 7a 65 6f 66 28  r2, &t1, sizeof(
e490: 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
e4a0: 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
e4b0: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
e4c0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
e4d0: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
e4e0: 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
e4f0: 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
e500: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
e510: 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
e520: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
e530: 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
e540: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
e550: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
e560: 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
e570: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
e580: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e590: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
e5b0: 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
e5c0: 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20  eof(pMem->r)==8 
e5d0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
e5e0: 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20  y(&pMem->r, &x, 
e5f0: 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
e600: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
e610: 69 61 6e 46 6c 6f 61 74 28 70 4d 65 6d 2d 3e 72  ianFloat(pMem->r
e620: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
e630: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61  >flags = MEM_Rea
e640: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
e650: 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
e660: 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
e670: 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
e680: 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
e690: 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
e6a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e6b0: 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
e6c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e6d0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e6e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
e6f0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
e700: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20  {.      int len 
e710: 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
e720: 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
e730: 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
e740: 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
e750: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
e760: 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
e770: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
e780: 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
e790: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e7a0: 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
e7b0: 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
e7c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
e7d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
e7e0: 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
e7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
e800: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
e810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
e820: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61  }../*.** The hea
e830: 64 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20  der of a record 
e840: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65  consists of a se
e850: 71 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d  quence variable-
e860: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e  length integers.
e870: 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65  .** These intege
e880: 72 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c  rs are almost al
e890: 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61  ways small and a
e8a0: 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20  re encoded as a 
e8b0: 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20  single byte..** 
e8c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
e8d0: 63 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74  cro takes advant
e8e0: 61 67 65 20 74 68 69 73 20 66 61 63 74 20 74 6f  age this fact to
e8f0: 20 70 72 6f 76 69 64 65 20 61 20 66 61 73 74 20   provide a fast 
e900: 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65  decode.** of the
e910: 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72   integers in a r
e920: 65 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49  ecord header.  I
e930: 74 20 69 73 20 66 61 73 74 65 72 20 66 6f 72 20  t is faster for 
e940: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a  the common case.
e950: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e 74  ** where the int
e960: 65 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65  eger is a single
e970: 20 62 79 74 65 2e 20 20 49 74 20 69 73 20 61 20   byte.  It is a 
e980: 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68  little slower wh
e990: 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65  en the.** intege
e9a0: 72 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  r is two or more
e9b0: 20 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65   bytes.  But ove
e9c0: 72 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65  rall it is faste
e9d0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  r..**.** The fol
e9e0: 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
e9f0: 6e 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ns are equivalen
ea00: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d  t:.**.**     x =
ea10: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
ea20: 74 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a  t32( A, &B );.**
ea30: 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56  .**     x = GetV
ea40: 61 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a  arint( A, B );.*
ea50: 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74  *.*/.#define Get
ea60: 56 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42  Varint(A,B)  ((B
ea70: 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f   = *(A))<=0x7f ?
ea80: 20 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56   1 : sqlite3GetV
ea90: 61 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a  arint32(A, &B)).
eaa0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
eab0: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
eac0: 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
ead0: 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
eae0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0a  s specified by .
eaf0: 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  ** {nKey1, pKey1
eb00: 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b  } and {nKey2, pK
eb10: 65 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20  ey2}, returning 
eb20: 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
eb30: 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
eb40: 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79  integer if {nKey
eb50: 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73  1, pKey1} is les
eb60: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
eb70: 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
eb80: 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65  than {nKey2, pKe
eb90: 79 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20  y2}.  Both Key1 
eba0: 61 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65  and Key2 must be
ebb0: 20 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a   byte strings.**
ebc0: 20 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65   composed by the
ebd0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
ebe0: 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
ebf0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
ec00: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
ec10: 72 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72  re(.  void *user
ec20: 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Data,.  int nKey
ec30: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
ec40: 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65  Key1, .  int nKe
ec50: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
ec60: 70 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e  pKey2.){.  KeyIn
ec70: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28  fo *pKeyInfo = (
ec80: 4b 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74  KeyInfo*)userDat
ec90: 61 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b  a;.  u32 d1, d2;
eca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ecb0: 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
ecc0: 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
ecd0: 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
ece0: 78 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f  x1, idx2;      /
ecf0: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
ed00: 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
ed10: 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
ed20: 20 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48   u32 szHdr1, szH
ed30: 64 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  dr2;  /* Number 
ed40: 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
ed50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
ed60: 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  0;.  int nField;
ed70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
ed80: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
ed90: 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
eda0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
edb0: 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f  ar *)pKey1;.  co
edc0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
edd0: 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73  r *aKey2 = (cons
ede0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
edf0: 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20  *)pKey2;..  Mem 
ee00: 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32  mem1;.  Mem mem2
ee10: 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
ee20: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
ee30: 6d 65 6d 32 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem2.enc = pKeyI
ee40: 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 0a 20 20 69  nfo->enc;.  .  i
ee50: 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e 74 28  dx1 = GetVarint(
ee60: 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
ee70: 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
ee80: 20 69 64 78 32 20 3d 20 47 65 74 56 61 72 69 6e   idx2 = GetVarin
ee90: 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72 32 29  t(aKey2, szHdr2)
eea0: 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72 32 3b  ;.  d2 = szHdr2;
eeb0: 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
eec0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
eed0: 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
eee0: 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48 64 72  r1 && idx2<szHdr
eef0: 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  2 ){.    u32 ser
ef00: 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75  ial_type1;.    u
ef10: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b  32 serial_type2;
ef20: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
ef30: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
ef40: 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
ef50: 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
ef60: 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
ef70: 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 31  GetVarint( aKey1
ef80: 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
ef90: 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe1 );.    if( d
efa0: 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69  1>=nKey1 && sqli
efb0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
efc0: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
efd0: 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  1)>0 ) break;.  
efe0: 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56 61 72    idx2 += GetVar
eff0: 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78 32 2c  int( aKey2+idx2,
f000: 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29 3b   serial_type2 );
f010: 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65  .    if( d2>=nKe
f020: 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y2 && sqlite3Vdb
f030: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
f040: 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29  erial_type2)>0 )
f050: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
f060: 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
f070: 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
f080: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
f090: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
f0a0: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
f0b0: 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
f0c0: 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 64  1, &mem1);.    d
f0d0: 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  2 += sqlite3Vdbe
f0e0: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 32  SerialGet(&aKey2
f0f0: 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d2], serial_typ
f100: 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20  e2, &mem2);..   
f110: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
f120: 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
f130: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
f140: 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
f150: 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20 3f  mem2, i<nField ?
f160: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
f170: 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
f180: 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d  ( mem1.flags & M
f190: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
f1a0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
f1b0: 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20 6d  mem1);.    if( m
f1c0: 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em2.flags & MEM_
f1d0: 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  Dyn ) sqlite3Vdb
f1e0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
f1f0: 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  2);.    if( rc!=
f200: 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
f210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
f220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f  .  }..  /* One o
f230: 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
f240: 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62 75  ut of fields, bu
f250: 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  t all the fields
f260: 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
f270: 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75 61  t.  ** were equa
f280: 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b 65  l. If the incrKe
f290: 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  y flag is true, 
f2a0: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  then the second 
f2b0: 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65 61  key is.  ** trea
f2c0: 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a 20  ted as larger.. 
f2d0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20   */.  if( rc==0 
f2e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  ){.    if( pKeyI
f2f0: 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a  nfo->incrKey ){.
f300: 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
f310: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 31 3c     }else if( d1<
f320: 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 72  nKey1 ){.      r
f330: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
f340: 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b   if( d2<nKey2 ){
f350: 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
f360: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
f370: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
f380: 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
f390: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20  Info->nField.   
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
f3b0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
f3c0: 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
f3d0: 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
f3e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f3f0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
f400: 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  is an index entr
f410: 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67  y composed using
f420: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
f430: 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68  rd opcode..** Th
f440: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
f450: 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75  this record shou
f460: 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
f470: 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a   (specifically.*
f480: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77  * an integer row
f490: 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  id).  This routi
f4a0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
f4b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
f4c0: 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65  n.** that intege
f4d0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
f4e0: 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
f4f0: 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29  (const u8 *aKey)
f500: 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  {.  u32 szHdr;  
f510: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f520: 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
f530: 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
f540: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
f550: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
f560: 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  /..  sqlite3GetV
f570: 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 26 73  arint32(aKey, &s
f580: 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  zHdr);.  sqlite3
f590: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  GetVarint32(&aKe
f5a0: 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70  y[szHdr-1], &typ
f5b0: 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  eRowid);.  retur
f5c0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  n sqlite3VdbeSer
f5d0: 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
f5e0: 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a  owid);.}.  ../*.
f5f0: 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
f600: 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
f610: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
f620: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
f630: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
f640: 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
f650: 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
f660: 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
f670: 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
f680: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
f690: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
f6a0: 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
f6b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
f6c0: 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
f6d0: 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
f6e0: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
f6f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
f700: 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
f710: 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
f720: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
f730: 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
f740: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
f750: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
f760: 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
f770: 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
f780: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
f790: 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
f7a0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
f7b0: 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
f7c0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
f7d0: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
f7e0: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
f7f0: 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
f800: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f810: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f820: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
f830: 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
f840: 65 65 28 64 62 2c 20 70 43 75 72 2c 20 30 2c 20  ee(db, pCur, 0, 
f850: 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
f860: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
f870: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
f880: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
f890: 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
f8a0: 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74  &szHdr);.  sqlit
f8b0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
f8c0: 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
f8d0: 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  , &typeRowid);. 
f8e0: 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
f8f0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
f900: 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
f910: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
f920: 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
f930: 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
f940: 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
f950: 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
f960: 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
f970: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
f980: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f990: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  OK;.}../*.** Com
f9a0: 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
f9b0: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
f9c0: 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
f9d0: 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e  s point to again
f9e0: 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
f9f0: 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66  ring in pKey (of
fa00: 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20   length nKey).  
fa10: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
fa20: 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
fa30: 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
fa40: 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
fa50: 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
fa60: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
fa70: 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
fa80: 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20  n pKey.  Return 
fa90: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
faa0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79  cess..**.** pKey
fab0: 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
fac0: 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
fad0: 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
fae0: 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
faf0: 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
fb00: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
fb10: 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
fb20: 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
fb30: 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
fb40: 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  red as well..*/.
fb50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
fb60: 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
fb70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 43  sqlite3 *db,.  C
fb80: 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
fb90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fba0: 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
fbb0: 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
fbc0: 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74   int nKey, const
fbd0: 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20   u8 *pKey,   /* 
fbe0: 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61  The key to compa
fbf0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  re */.  int *res
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
fc20: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
fc30: 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
fc40: 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
fc50: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
fc60: 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
fc70: 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e  C->pCursor;.  in
fc80: 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65  t lenRowid;.  Me
fc90: 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  m m;..  sqlite3B
fca0: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
fcb0: 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
fcc0: 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
fcd0: 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
fce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fcf0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
fd00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
fd10: 46 72 6f 6d 42 74 72 65 65 28 64 62 2c 20 70 43  FromBtree(db, pC
fd20: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43  ->pCursor, 0, nC
fd30: 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
fd40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
fd50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
fd60: 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
fd70: 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
fd80: 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20  en((u8*)m.z);.  
fd90: 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
fda0: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
fdb0: 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e  pC->pKeyInfo, m.
fdc0: 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c  n-lenRowid, m.z,
fdd0: 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
fde0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
fdf0: 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
fe00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fe10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
fe20: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
fe30: 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
fe40: 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
fe50: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
fe60: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
fe70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
fe80: 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
fe90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
fea0: 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
feb0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
fec0: 6e 67 65 29 7b 0a 20 20 64 62 2d 3e 6e 43 68 61  nge){.  db->nCha
fed0: 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
fee0: 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
fef0: 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
ff00: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
ff10: 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
ff20: 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
ff30: 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
ff40: 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
ff50: 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
ff60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ff70: 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
ff80: 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
ff90: 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
ffa0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
ffb0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ffc0: 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
ffd0: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
ffe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
fff0: 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
10000 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
10010 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
10020 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
10030 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
10040 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
10050 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
10060 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
10070 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
10080 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
10090 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
100a0 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
100b0 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
100c0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
100d0 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
100e0 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
100f0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
10100 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
10110 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
10120 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
10130 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
10140 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
10150 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
10160 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
10170 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
10180 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
10190 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
101a0 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
101b0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
101c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
101d0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
101e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
101f0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
10200 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
10210 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
10220 6e 20 76 2d 3e 64 62 3b 0a 7d 0a                 n v->db;.}.