/ Hex Artifact Content
Login

Artifact 93724b681d2ff57f4dfca9e5a08fab7b6126d15d:


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 2a 2f 0a 20 20 20  nal file. */.   
85d0: 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   zMainFile = sql
85e0: 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e  ite3BtreeGetDirn
85f0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
8600: 42 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 65  Bt);.    if( (ne
8610: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
8620: 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e  (rc=sqlite3OsSyn
8630: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
8640: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 21  E_SYNC_NORMAL))!
8650: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
8660: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8670: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
8680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8690: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
86a0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
86b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
86c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
86d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
86e0: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
86f0: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
8700: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
8710: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
8720: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
8730: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
8740: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
8750: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
8760: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
8770: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
8780: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
8790: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
87a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
87b0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
87c0: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
87d0: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
87e0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
87f0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
8800: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
8810: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
8820: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
8830: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
8840: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
8850: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
8860: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
8870: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
8880: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
8890: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
88a0: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
88b0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
88c0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
88d0: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
88e0: 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  occured..    */.
88f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
8900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
8910: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
8920: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8930: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8940: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
8950: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
8960: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
8970: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8980: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
8990: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
89a0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
89b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
89c0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
89d0: 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
89e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
89f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8a00: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8a10: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8a20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
8a30: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
8a40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
8a50: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
8a60: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
8a70: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
8a80: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
8a90: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
8aa0: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
8ab0: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
8ac0: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
8ad0: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
8ae0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
8af0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
8b00: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
8b10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8b20: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a  (zMaster);.    z
8b30: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
8b40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
8b50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
8b60: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
8b70: 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
8b80: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
8b90: 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
8ba0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
8bb0: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
8bc0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
8bd0: 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
8be0: 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
8bf0: 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
8c00: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
8c10: 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
8c20: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
8c30: 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
8c40: 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
8c50: 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
8c60: 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
8c70: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
8c80: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
8c90: 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
8ca0: 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
8cb0: 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
8cc0: 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
8cd0: 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
8ce0: 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
8cf0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
8d00: 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
8d10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
8d20: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
8d30: 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 66  _errors();.    f
8d40: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8d50: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
8d60: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8d70: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8d80: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
8d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
8da0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
8db0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
8dc0: 20 20 20 7d 0a 20 20 20 20 65 6e 61 62 6c 65 5f     }.    enable_
8dd0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
8de0: 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
8df0: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
8e00: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
8e10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8e20: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
8e30: 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
8e40: 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76  he sqlite3.activ
8e50: 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76  eVdbeCnt count v
8e60: 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
8e70: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
8e80: 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
8e90: 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
8ea0: 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
8eb0: 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
8ec0: 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
8ed0: 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
8ee0: 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
8ef0: 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
8f00: 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
8f10: 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
8f20: 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
8f30: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
8f40: 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
8f50: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
8f60: 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
8f70: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
8f80: 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
8f90: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
8fa0: 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
8fb0: 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
8fc0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20  nt cnt = 0;.  p 
8fd0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
8fe0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
8ff0: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
9000: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
9010: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
9020: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
9030: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
9040: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
9050: 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t==db->activeVdb
9060: 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  eCnt );.}.#else.
9070: 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
9080: 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
9090: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
90a0: 20 65 76 65 72 79 20 61 63 74 69 76 65 20 56 4d   every active VM
90b0: 20 6f 74 68 65 72 20 74 68 61 6e 20 70 56 64 62   other than pVdb
90c0: 65 20 61 6e 64 20 63 68 61 6e 67 65 20 69 74 73  e and change its
90d0: 20 73 74 61 74 75 73 20 74 6f 0a 2a 2a 20 61 62   status to.** ab
90e0: 6f 72 74 65 64 2e 20 20 54 68 69 73 20 68 61 70  orted.  This hap
90f0: 70 65 6e 73 20 77 68 65 6e 20 6f 6e 65 20 56 4d  pens when one VM
9100: 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
9110: 63 6b 20 64 75 65 20 74 6f 20 61 6e 0a 2a 2a 20  ck due to an.** 
9120: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c  ON CONFLICT ROLL
9130: 42 41 43 4b 20 63 6c 61 75 73 65 20 28 66 6f 72  BACK clause (for
9140: 20 65 78 61 6d 70 6c 65 29 2e 20 20 54 68 65 20   example).  The 
9150: 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20 62  other VMs must b
9160: 65 0a 2a 2a 20 61 62 6f 72 74 65 64 20 73 6f 20  e.** aborted so 
9170: 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74  that they do not
9180: 20 68 61 76 65 20 64 61 74 61 20 72 6f 6c 6c 65   have data rolle
9190: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
91a0: 6e 65 61 74 68 0a 2a 2a 20 74 68 65 6d 20 6c 65  neath.** them le
91b0: 61 64 69 6e 67 20 74 6f 20 61 20 73 65 67 66 61  ading to a segfa
91c0: 75 6c 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ult..*/.void sql
91d0: 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63  ite3AbortOtherAc
91e0: 74 69 76 65 56 64 62 65 73 28 73 71 6c 69 74 65  tiveVdbes(sqlite
91f0: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 45 78  3 *db, Vdbe *pEx
9200: 63 65 70 74 29 7b 0a 20 20 56 64 62 65 20 2a 70  cept){.  Vdbe *p
9210: 4f 74 68 65 72 3b 0a 20 20 66 6f 72 28 70 4f 74  Other;.  for(pOt
9220: 68 65 72 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70  her=db->pVdbe; p
9230: 4f 74 68 65 72 3b 20 70 4f 74 68 65 72 3d 70 4f  Other; pOther=pO
9240: 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ther->pNext){.  
9250: 20 20 69 66 28 20 70 4f 74 68 65 72 3d 3d 70 45    if( pOther==pE
9260: 78 63 65 70 74 20 29 20 63 6f 6e 74 69 6e 75 65  xcept ) continue
9270: 3b 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72  ;.    if( pOther
9280: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
9290: 47 49 43 5f 52 55 4e 20 7c 7c 20 70 4f 74 68 65  GIC_RUN || pOthe
92a0: 72 2d 3e 70 63 3c 30 20 29 20 63 6f 6e 74 69 6e  r->pc<0 ) contin
92b0: 75 65 3b 0a 20 20 20 20 63 68 65 63 6b 41 63 74  ue;.    checkAct
92c0: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
92d0: 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73      closeAllCurs
92e0: 6f 72 73 28 70 4f 74 68 65 72 29 3b 0a 20 20 20  ors(pOther);.   
92f0: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
9300: 43 6e 74 28 64 62 29 3b 0a 20 20 20 20 70 4f 74  Cnt(db);.    pOt
9310: 68 65 72 2d 3e 61 62 6f 72 74 65 64 20 3d 20 31  her->aborted = 1
9320: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
9330: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9340: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
9350: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
9360: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
9370: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
9380: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
9390: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
93a0: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
93b0: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
93c0: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
93d0: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
93e0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
93f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9400: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
9410: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
9420: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
9430: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
9440: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
9450: 41 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a  AGIC_HALT..**.**
9460: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
9470: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
9480: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
9490: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
94a0: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
94b0: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
94c0: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
94d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
94e0: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
94f0: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
9500: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
9510: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
9520: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
9530: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
9540: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
9550: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
9560: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28    int i;.  int (
9570: 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70  *xFunc)(Btree *p
9580: 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e  Bt) = 0;  /* Fun
9590: 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e  ction to call on
95a0: 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b   each btree back
95b0: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  end */.  int isS
95c0: 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
95d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
95e0: 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45  o true if SQLITE
95f0: 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20  _NOMEM or IOERR 
9600: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
9610: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
9620: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
9630: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
9640: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
9650: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
9660: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
9670: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
9680: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
9690: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
96a0: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
96b0: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
96c0: 20 2a 2a 20 53 70 65 63 69 61 6c 20 65 72 72 6f   ** Special erro
96d0: 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rs:.  **.  **   
96e0: 20 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 4e    If an SQLITE_N
96f0: 4f 4d 45 4d 20 65 72 72 6f 72 20 68 61 73 20 6f  OMEM error has o
9700: 63 63 75 72 65 64 20 69 6e 20 61 20 73 74 61 74  ccured in a stat
9710: 65 6d 65 6e 74 20 74 68 61 74 20 77 72 69 74 65  ement that write
9720: 73 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68  s to.  **     th
9730: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
9740: 20 65 69 74 68 65 72 20 61 20 73 74 61 74 65 6d   either a statem
9750: 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
9760: 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
9770: 64 0a 20 20 2a 2a 20 20 20 20 20 62 61 63 6b 20  d.  **     back 
9780: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
9790: 65 65 2d 73 74 72 75 63 74 75 72 65 73 20 61 72  ee-structures ar
97a0: 65 20 69 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e  e in a consisten
97b0: 74 20 73 74 61 74 65 2e 20 41 0a 20 20 2a 2a 20  t state. A.  ** 
97c0: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 74 72      statement tr
97d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
97e0: 6c 65 64 20 62 61 63 6b 20 69 66 20 6f 6e 65 20  led back if one 
97f0: 69 73 20 6f 70 65 6e 2c 20 6f 74 68 65 72 77 69  is open, otherwi
9800: 73 65 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  se the.  **     
9810: 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
9820: 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
9830: 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
9840: 2a 20 20 20 20 20 49 66 20 61 6e 20 53 51 4c 49  *     If an SQLI
9850: 54 45 5f 49 4f 45 52 52 20 65 72 72 6f 72 20 68  TE_IOERR error h
9860: 61 73 20 6f 63 63 75 72 65 64 20 69 6e 20 61 20  as occured in a 
9870: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
9880: 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20 20 20  rites to.  **   
9890: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20    the database, 
98a0: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
98b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
98c0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
98d0: 20 54 68 65 0a 20 20 2a 2a 20 20 20 20 20 49 2f   The.  **     I/
98e0: 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
98f0: 20 63 61 75 73 65 64 20 67 61 72 62 61 67 65 20   caused garbage 
9900: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
9910: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
9920: 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 57 65 72  **     file. Wer
9930: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
9940: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 61 6e  n to continue an
9950: 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
9960: 72 6f 6c 6c 65 64 20 0a 20 20 2a 2a 20 20 20 20  rolled .  **    
9970: 20 62 61 63 6b 20 74 68 61 74 20 67 61 72 62 61   back that garba
9980: 67 65 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ge might end up 
9990: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
99a0: 66 69 6c 65 2e 0a 20 20 2a 2a 20 20 20 20 20 0a  file..  **     .
99b0: 20 20 2a 2a 20 20 20 20 20 49 6e 20 62 6f 74 68    **     In both
99c0: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 63 61   of the above ca
99d0: 73 65 73 2c 20 74 68 65 20 56 64 62 65 2e 65 72  ses, the Vdbe.er
99e0: 72 6f 72 41 63 74 69 6f 6e 20 76 61 72 69 61 62  rorAction variab
99f0: 6c 65 20 69 73 20 0a 20 20 2a 2a 20 20 20 20 20  le is .  **     
9a00: 69 67 6e 6f 72 65 64 2e 20 49 66 20 74 68 65 20  ignored. If the 
9a10: 73 71 6c 69 74 65 33 2e 61 75 74 6f 43 6f 6d 6d  sqlite3.autoComm
9a20: 69 74 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65  it flag is false
9a30: 20 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69   and a transacti
9a40: 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 72  on.  **     is r
9a50: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 69 74 20 77  olled back, it w
9a60: 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72  ill be set to tr
9a70: 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74  ue..  **.  ** Ot
9a80: 68 65 72 20 65 72 72 6f 72 73 3a 0a 20 20 2a 2a  her errors:.  **
9a90: 0a 20 20 2a 2a 20 4e 6f 20 65 72 72 6f 72 3a 0a  .  ** No error:.
9aa0: 20 20 2a 2a 0a 20 20 2a 2f 0a 0a 20 20 69 66 28    **.  */..  if(
9ab0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
9ac0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
9ad0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9ae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d  ;.  }.  if( p->m
9af0: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
9b00: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41  _RUN ){.    /* A
9b10: 6c 72 65 61 64 79 20 68 61 6c 74 65 64 2e 20 20  lready halted.  
9b20: 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 2a  Nothing to do. *
9b30: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
9b40: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
9b50: 49 43 5f 48 41 4c 54 20 29 3b 0a 23 69 66 6e 64  IC_HALT );.#ifnd
9b60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
9b70: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
9b80: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
9b90: 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  p);.#endif.    r
9ba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9bb0: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  .  }.  closeAllC
9bc0: 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65  ursors(p);.  che
9bd0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
9be0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
9bf0: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
9c00: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
9c10: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
9c20: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
9c30: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
9c40: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
9c50: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
9c60: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
9c70: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
9c80: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
9c90: 20 65 72 72 6f 72 73 20 2d 20 53 51 4c 49 54 45   errors - SQLITE
9ca0: 5f 4e 4f 4d 45 4d 20 6f 72 20 53 51 4c 49 54 45  _NOMEM or SQLITE
9cb0: 5f 49 4f 45 52 52 20 2a 2f 0a 20 20 20 20 6d 72  _IOERR */.    mr
9cc0: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
9cd0: 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
9ce0: 72 72 6f 72 20 3d 20 28 0a 20 20 20 20 20 20 20  rror = (.       
9cf0: 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
9d00: 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
9d10: 54 45 5f 49 4f 45 52 52 20 7c 7c 20 6d 72 63 3d  TE_IOERR || mrc=
9d20: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
9d30: 54 29 3f 31 3a 30 29 3b 0a 20 20 20 20 69 66 28  T)?1:0);.    if(
9d40: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
9d50: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
9d60: 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69   loop does stati
9d70: 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68  c analysis of th
9d80: 65 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77  e query to see w
9d90: 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20  hich of the.    
9da0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
9db0: 68 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20  hree categories 
9dc0: 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20  it falls into:. 
9dd0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9de0: 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20       Read-only. 
9df0: 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72       **     Quer
9e00: 79 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74  y with statement
9e10: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
9e20: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
9e30: 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  out statement jo
9e40: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20  urnal.      **. 
9e50: 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64       ** We could
9e60: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f   do something mo
9e70: 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20  re elegant than 
9e80: 74 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c  this static anal
9e90: 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20  ysis (i.e..     
9ea0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79   ** store the ty
9eb0: 70 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70  pe of query as p
9ec0: 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c  art of the compl
9ed0: 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62  iation phase), b
9ee0: 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ut .      ** han
9ef0: 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f  dling malloc() o
9f00: 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20  r IO failure is 
9f10: 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65  a fairly obscure
9f20: 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20   edge case so . 
9f30: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
9f40: 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e  probably easier.
9f50: 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20   Todo: Might be 
9f60: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
9f70: 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20  o reduce .      
9f80: 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76  ** code size a v
9f90: 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74  ery small amount
9fa0: 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20   though....     
9fb0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
9fc0: 52 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  ReadOnly = 1;.  
9fd0: 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d      int isStatem
9fe0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ent = 0;.      a
9ff0: 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20  ssert(p->aOp || 
a000: 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20  p->nOp==0);.    
a010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a020: 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nOp; i++){ .    
a030: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61      switch( p->a
a040: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a  Op[i].opcode ){.
a050: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
a060: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  P_Transaction:. 
a070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a080: 69 73 20 69 73 20 61 20 62 69 74 20 73 74 72 61  is is a bit stra
a090: 6e 67 65 2e 20 49 66 20 77 65 20 68 69 74 20 61  nge. If we hit a
a0a0: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
a0b0: 65 72 72 6f 72 20 61 6e 64 0a 20 20 20 20 20 20  error and.      
a0c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61        ** the sta
a0d0: 74 65 6d 65 6e 74 20 64 69 64 20 6e 6f 74 20 6f  tement did not o
a0e0: 70 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  pen a statement 
a0f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 77 65 20  transaction, we 
a100: 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20  will.           
a110: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   ** rollback any
a120: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
a130: 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 20 61 6c  ion and abort al
a140: 6c 20 6f 74 68 65 72 20 61 63 74 69 76 65 0a 20  l other active. 
a150: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74             ** st
a160: 61 74 65 6d 65 6e 74 73 2e 20 4f 72 2c 20 69 66  atements. Or, if
a170: 20 74 68 69 73 20 69 73 20 61 6e 20 53 51 4c 49   this is an SQLI
a180: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 65 72 72  TE_INTERRUPT err
a190: 6f 72 2c 20 77 65 0a 20 20 20 20 20 20 20 20 20  or, we.         
a1a0: 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 6e 6c 79 20     ** will only 
a1b0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  rollback if the 
a1c0: 69 6e 74 65 72 72 75 70 74 65 64 20 73 74 61 74  interrupted stat
a1d0: 65 6d 65 6e 74 20 77 61 73 20 61 20 77 72 69 74  ement was a writ
a1e0: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e..            *
a1f0: 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
a200: 20 49 74 20 63 6f 75 6c 64 20 62 65 20 61 72 67   It could be arg
a210: 75 65 64 20 74 68 61 74 20 72 65 61 64 2d 6f 6e  ued that read-on
a220: 6c 79 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  ly statements sh
a230: 6f 75 6c 64 20 6e 65 76 65 72 0a 20 20 20 20 20  ould never.     
a240: 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61         ** rollba
a250: 63 6b 20 61 6e 79 74 68 69 6e 67 2e 20 42 75 74  ck anything. But
a260: 20 63 61 72 65 66 75 6c 20 61 6e 61 6c 79 73 69   careful analysi
a270: 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
a280: 66 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  fore.           
a290: 20 2a 2a 20 6d 61 6b 69 6e 67 20 74 68 69 73 20   ** making this 
a2a0: 63 68 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20  change.         
a2b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
a2c0: 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e    if( p->aOp[i].
a2d0: 70 32 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  p2 || mrc!=SQLIT
a2e0: 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 52               isR
a300: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
a310: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a320: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a330: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
a340: 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20  Statement:.     
a350: 20 20 20 20 20 20 20 69 73 53 74 61 74 65 6d 65         isStateme
a360: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
a370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a380: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
a390: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a3a0: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
a3b0: 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20  nly, we need do 
a3c0: 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61  no rollback at a
a3d0: 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ll. Otherwise,. 
a3e0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20       ** proceed 
a3f0: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
a400: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
a410: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
a420: 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  sReadOnly ){.   
a430: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
a440: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
a450: 43 4b 45 44 20 26 26 20 69 73 53 74 61 74 65 6d  CKED && isStatem
a460: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a470: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a480: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a490: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
a4a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
a4b0: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
a4c0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
a4d0: 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 69 73 53 74  TE_NOMEM && isSt
a4e0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
a4f0: 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c       xFunc = sql
a500: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
a510: 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  kStmt;.        }
a520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a530: 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
a540: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
a550: 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
a560: 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
a570: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
a580: 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
a590: 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
a5a0: 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
a5b0: 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
a5c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
a5d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
a5e0: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
a5f0: 64 62 65 73 28 64 62 2c 20 70 29 3b 0a 20 20 20  dbes(db, p);.   
a600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
a610: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
a620: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
a630: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
a640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a650: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
a660: 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
a670: 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
a680: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
a690: 6c 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20  ly active vdbe, 
a6a0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64  then.    ** we d
a6b0: 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
a6c0: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
a6d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
a6e0: 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
a6f0: 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
a700: 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
a710: 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
a720: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
a730: 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
a740: 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
a750: 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
a760: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
a770: 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65  it && db->active
a780: 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20  VdbeCnt==1 ){.  
a790: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
a7a0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
a7b0: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
a7c0: 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
a7d0: 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
a7e0: 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
a7f0: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
a800: 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62  rue, and the vdb
a810: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20  e program was . 
a820: 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73         ** succes
a830: 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27  sful or hit an '
a840: 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
a850: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
a860: 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
a870: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
a880: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a890: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64       int rc = vd
a8a0: 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  beCommit(db);.  
a8b0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a8c0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
a8d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
a8e0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
a8f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
a900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a910: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
a920: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
a930: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
a940: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
a950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
a960: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
a970: 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
a980: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a9a0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a9b0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ll(db);.      }.
a9c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78      }else if( !x
a9d0: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66  Func ){.      if
a9e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a9f0: 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
aa00: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
aa10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
aa20: 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20  openedStatement 
aa30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75  ){.          xFu
aa40: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
aa50: 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20  eCommitStmt;.   
aa60: 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
aa70: 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
aa80: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
aa90: 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e   ){.        xFun
aaa0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
aab0: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
aac0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aad0: 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f     sqlite3AbortO
aae0: 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28  therActiveVdbes(
aaf0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
ab00: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
ab10: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
ab20: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
ab30: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ab40: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78  }.  .    /* If x
ab50: 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Func is not NULL
ab60: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65  , then it is one
ab70: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
ab80: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a  RollbackStmt or.
ab90: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
aba0: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43  reeCommitStmt. C
abb0: 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65  all it once on e
abc0: 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20  ach backend. If 
abd0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  an error occurs.
abe0: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72      ** and the r
abf0: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74  eturn code is st
ac00: 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73  ill SQLITE_OK, s
ac10: 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
ac20: 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20  de to the new.  
ac30: 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65    ** error value
ac40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
ac50: 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20  ert(!xFunc ||.  
ac60: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
ac70: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
ac80: 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63  t ||.      xFunc
ac90: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  ==sqlite3BtreeRo
aca0: 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29  llbackStmt.    )
acb0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78  ;.    for(i=0; x
acc0: 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44  Func && i<db->nD
acd0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
ace0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74  int rc;.      Bt
acf0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
ad00: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
ad10: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
ad20: 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70      rc = xFunc(p
ad30: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
ad40: 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53   rc && (p->rc==S
ad50: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
ad60: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
ad70: 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20  AINT) ){.       
ad80: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
ad90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ada0: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
adb0: 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20  rrMsg, 0);.     
adc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
add0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
ade0: 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
adf0: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
ae00: 4c 45 54 45 20 61 6e 64 20 74 68 65 20 73 74 61  LETE and the sta
ae10: 74 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69  tement was commi
ae20: 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65  tted, .    ** se
ae30: 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  t the change cou
ae40: 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
ae50: 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
ae60: 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  ntOn && p->pc>=0
ae70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78   ){.      if( !x
ae80: 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73  Func || xFunc==s
ae90: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
aea0: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  tStmt ){.       
aeb0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
aec0: 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
aed0: 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
aee0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
aef0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
af00: 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
af10: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
af20: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nge = 0;.    }. 
af30: 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   .    /* Rollbac
af40: 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20  k or commit any 
af50: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74  schema changes t
af60: 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f  hat occurred. */
af70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  .    if( p->rc!=
af80: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d  SQLITE_OK && db-
af90: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
afa0: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
afb0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
afc0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
afd0: 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62  db, 0);.      db
afe0: 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66  ->flags = (db->f
aff0: 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e  lags | SQLITE_In
b000: 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20  ternChanges);.  
b010: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65    }.  }..  /* We
b020: 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
b030: 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
b040: 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
b050: 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
b060: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
b070: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74  0 ){.    db->act
b080: 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iveVdbeCnt--;.  
b090: 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
b0a0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
b0b0: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
b0c0: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74  eCnt(db);..  ret
b0d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b0e0: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
b0f0: 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
b100: 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
b110: 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
b120: 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
b130: 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
b140: 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
b150: 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
b160: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
b170: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
b180: 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
b190: 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
b1a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b1b0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
b1c0: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
b1d0: 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
b1e0: 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
b1f0: 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
b200: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
b210: 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
b220: 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
b230: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
b240: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
b250: 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
b260: 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
b270: 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
b280: 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
b290: 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
b2a0: 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
b2b0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
b2c0: 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
b2d0: 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
b2e0: 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
b2f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
b300: 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
b310: 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
b320: 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
b330: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
b340: 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
b350: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b360: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
b370: 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
b380: 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
b390: 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
b3a0: 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
b3b0: 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
b3c0: 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
b3d0: 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
b3e0: 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
b3f0: 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
b400: 2f 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  /.  sqlite3Safet
b410: 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  yOn(db);.  sqlit
b420: 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20  e3VdbeHalt(p);. 
b430: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
b440: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
b450: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
b460: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
b470: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
b480: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
b490: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
b4a0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
b4b0: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
b4c0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
b4d0: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
b4e0: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
b4f0: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
b500: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
b510: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
b520: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
b530: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
b540: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
b550: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
b560: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
b570: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
b580: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
b590: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
b5a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b5b0: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2c 64 62  alueSetStr(db,db
b5c0: 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
b5d0: 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
b5e0: 2c 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a  ,sqlite3_free);.
b5f0: 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
b600: 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
b610: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
b620: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b630: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
b640: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
b650: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
b660: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b670: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b680: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
b690: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
b6a0: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
b6b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
b6c0: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
b6d0: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
b6e0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b6f0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
b700: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
b710: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
b720: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
b730: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
b740: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
b750: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
b760: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
b770: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
b780: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
b790: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
b7a0: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
b7b0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
b7c0: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
b7d0: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
b7e0: 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
b7f0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
b800: 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
b810: 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  un..  */.  asser
b820: 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61  t( p->pTos<&p->a
b830: 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a  Stack[p->pc<0?0:
b840: 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61 53  p->pc] || !p->aS
b850: 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20 56  tack );.#ifdef V
b860: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
b870: 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
b880: 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
b890: 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
b8a0: 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
b8b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b8c0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
b8d0: 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
b8e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
b8f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b900: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
b910: 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
b920: 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
b930: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
b940: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
b950: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
b960: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
b970: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
b980: 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
b990: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
b9a0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
b9b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
b9c0: 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
b9d0: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
b9e0: 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
b9f0: 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
ba00: 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
ba10: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
ba20: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
ba30: 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
ba40: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
ba50: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
ba60: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ba70: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
ba80: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
ba90: 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b   p->aborted = 0;
baa0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
bab0: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
bac0: 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
bad0: 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
bae0: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
baf0: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
bb00: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
bb10: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
bb20: 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
bb30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
bb40: 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
bb50: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
bb60: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
bb70: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
bb80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bb90: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
bba0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
bbb0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bbc0: 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
bbd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
bbe0: 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
bbf0: 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
bc00: 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
bc10: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
bc20: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
bc30: 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20  AGIC_INIT ){.   
bc40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
bc50: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
bc60: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
bc70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bc80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  }../*.** Call th
bc90: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
bca0: 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e   each auxdata en
bcb0: 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63  try in pVdbeFunc
bcc0: 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68   for which.** th
bcd0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
bce0: 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63  bit in mask is c
bcf0: 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65  lear.  Auxdata e
bd00: 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31  ntries beyond 31
bd10: 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64  .** are always d
bd20: 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65  estroyed.  To de
bd30: 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74  stroy all auxdat
bd40: 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20  a entries, call 
bd50: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
bd60: 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f  with mask==0..*/
bd70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bd80: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
bd90: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
bda0: 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  nc, int mask){. 
bdb0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
bdc0: 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e  0; i<pVdbeFunc->
bdd0: 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAux; i++){.    
bde0: 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a  struct AuxData *
bdf0: 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e  pAux = &pVdbeFun
be00: 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20  c->apAux[i];.   
be10: 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28   if( (i>31 || !(
be20: 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26  mask&(1<<i))) &&
be30: 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20   pAux->pAux ){. 
be40: 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
be50: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
be60: 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
be70: 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
be80: 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d     }.      pAux-
be90: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
bea0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
beb0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
bec0: 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
bed0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
bee0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
bef0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bf00: 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70  eturn;.  Cleanup
bf10: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  (p);.  if( p->pP
bf20: 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
bf30: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
bf40: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
bf50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
bf60: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
bf70: 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20     p->db->pVdbe 
bf80: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
bf90: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
bfa0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
bfb0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
bfc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
bfd0: 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  Op ){.    for(i=
bfe0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
bff0: 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f 70  ){.      Op *pOp
c000: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
c010: 20 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d       freeP3(pOp-
c020: 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33  >p3type, pOp->p3
c030: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
c040: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70  ite3_free(p->aOp
c050: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
c060: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
c070: 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71  , p->nVar);.  sq
c080: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c  lite3_free(p->aL
c090: 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
c0a0: 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29  _free(p->aStack)
c0b0: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
c0c0: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
c0d0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
c0e0: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
c0f0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f  ite3_free(p->aCo
c100: 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
c110: 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29 3b  3_free(p->zSql);
c120: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
c130: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
c140: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
c160: 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
c170: 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
c180: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
c190: 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
c1a0: 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65   MoveTo now.  Re
c1b0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
c1c0: 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54  de.  If no MoveT
c1d0: 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68  o is pending, th
c1e0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f  is.** routine do
c1f0: 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72  es nothing and r
c200: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
c210: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c220: 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
c230: 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  (Cursor *p){.  i
c240: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
c250: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
c260: 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
c270: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
c280: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
c290: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
c2a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
c2b0: 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
c2c0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c2d0: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
c2e0: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
c2f0: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
c300: 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
c310: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c320: 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79      *p->pIncrKey
c330: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73   = 0;.    p->las
c340: 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e  tRowid = keyToIn
c350: 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  t(p->movetoTarge
c360: 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  t);.    p->rowid
c370: 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30  IsValid = res==0
c380: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
c390: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
c3a0: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
c3b0: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
c3c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c3d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c3e0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
c3f0: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
c400: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
c410: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
c420: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
c430: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
c440: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
c450: 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ALE;.  }.  retur
c460: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c470: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
c480: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
c490: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
c4a0: 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
c4b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c4c0: 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
c4d0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52  lite3VdbeSerialR
c4e0: 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ead().** sqlite3
c4f0: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
c500: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
c510: 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a  rialWrite().**.*
c520: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
c530: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
c540: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
c550: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
c560: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
c570: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
c580: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
c590: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
c5a0: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
c5b0: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
c5c0: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
c5d0: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
c5e0: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
c5f0: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
c600: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
c610: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
c620: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
c630: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
c640: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
c650: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
c660: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
c670: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
c680: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
c690: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
c6a0: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
c6b0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
c6c0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
c6d0: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
c6e0: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
c6f0: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
c700: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
c710: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
c720: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
c730: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
c740: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
c750: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
c760: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
c770: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
c780: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
c790: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
c7a0: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
c7b0: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
c7c0: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
c7d0: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
c7e0: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
c810: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
c820: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
c830: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
c840: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
c850: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
c860: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
c870: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
c880: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
c890: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
c8a0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
c8b0: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8d0: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
c8e0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
c8f0: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
c900: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
c910: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
c920: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
c950: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
c960: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
c980: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
c990: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
c9a0: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
c9b0: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
c9c0: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
c9d0: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
c9f0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
ca00: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
ca10: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
ca30: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
ca40: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
ca50: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
ca80: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
ca90: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
caa0: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
cab0: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
cac0: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
cad0: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
cae0: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
caf0: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
cb00: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
cb10: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
cb20: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
cb30: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
cb40: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
cb50: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
cb60: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
cb70: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
cb80: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
cb90: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
cba0: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
cbb0: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
cbc0: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
cbd0: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
cbe0: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
cbf0: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
cc00: 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
cc10: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
cc20: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
cc30: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
cc40: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
cc50: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
cc60: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
cc70: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
cc80: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
cc90: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
cca0: 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30 30  ((i64)0x00001000
ccb0: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
ccc0: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
ccd0: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
cce0: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
ccf0: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
cd00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
cd10: 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  +i;.    }.    u 
cd20: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
cd30: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
cd40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
cd50: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
cd60: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
cd70: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
cd80: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
cd90: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
cda0: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
cdb0: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
cdc0: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
cdd0: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
cde0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
cdf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
ce00: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ce10: 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
ce20: 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
ce30: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
ce40: 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
ce50: 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
ce60: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61  em->u.i;.  }.  a
ce70: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
ce80: 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
ce90: 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
cea0: 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
ceb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
cec0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
ced0: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
cee0: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
cef0: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
cf00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
cf10: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
cf20: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
cf30: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
cf40: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
cf50: 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
cf60: 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
cf70: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
cf80: 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
cf90: 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
cfa0: 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
cfb0: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
cfc0: 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
cfd0: 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
cfe0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
cff0: 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
d000: 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
d010: 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
d020: 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
d030: 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
d040: 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
d050: 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
d060: 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
d070: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
d080: 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
d090: 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
d0a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
d0b0: 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
d0c0: 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
d0d0: 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
d0e0: 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
d0f0: 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
d100: 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
d110: 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
d120: 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
d130: 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
d140: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
d150: 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
d160: 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
d170: 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
d180: 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
d190: 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
d1a0: 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
d1b0: 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
d1c0: 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
d1d0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
d1e0: 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
d1f0: 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
d200: 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
d210: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
d220: 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
d230: 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
d240: 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
d250: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
d260: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
d270: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
d280: 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
d290: 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
d2a0: 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
d2b0: 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
d2c0: 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
d2d0: 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
d2e0: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
d2f0: 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
d300: 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
d310: 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
d320: 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
d330: 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
d340: 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
d350: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
d360: 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
d370: 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
d380: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 23 69 66 64 65  orrect..*/.#ifde
d390: 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
d3a0: 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
d3b0: 54 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  T.static double 
d3c0: 66 6c 6f 61 74 53 77 61 70 28 64 6f 75 62 6c 65  floatSwap(double
d3d0: 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
d3e0: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
d3f0: 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
d400: 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
d410: 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
d420: 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
d430: 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
d440: 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
d450: 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
d460: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
d470: 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
d480: 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
d490: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
d4a0: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
d4b0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
d4c0: 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
d4d0: 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
d4e0: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
d4f0: 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
d500: 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
d510: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
d520: 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
d530: 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
d540: 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
d550: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
d560: 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
d570: 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
d580: 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
d590: 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
d5a0: 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79   nBuf must alway
d5b0: 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e  s be.** large en
d5c0: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
d5d0: 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20   entire field.  
d5e0: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66  Except, if the f
d5f0: 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f  ield is.** a blo
d600: 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69  b with a zero-fi
d610: 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20  lled tail, then 
d620: 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a  buf[] might be j
d630: 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a  ust the right.**
d640: 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76   size to hold ev
d650: 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20  erything except 
d660: 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c  for the zero-fil
d670: 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75  led tail.  If bu
d680: 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62  f[].** is only b
d690: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
d6a0: 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70  d the non-zero p
d6b0: 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79  refix, then only
d6c0: 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70   write that.** p
d6d0: 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d  refix into buf[]
d6e0: 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20  .  But if buf[] 
d6f0: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
d700: 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
d710: 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74  .** prefix and t
d720: 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69  he tail then wri
d730: 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e  te the prefix an
d740: 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74  d set the tail t
d750: 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a  o all.** zeros..
d760: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
d770: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d780: 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
d790: 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
d7a0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
d7b0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
d7c0: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
d7d0: 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
d7e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
d7f0: 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
d800: 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
d810: 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69   in buf[]..*/ .i
d820: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
d830: 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
d840: 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a   int nBuf, Mem *
d850: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
d860: 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65  ormat){.  u32 se
d870: 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
d880: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d890: 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72  e(pMem, file_for
d8a0: 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  mat);.  int len;
d8b0: 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
d8c0: 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
d8d0: 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
d8e0: 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
d8f0: 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
d900: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
d910: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
d920: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d930: 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
d940: 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a  eof(pMem->r) );.
d950: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
d960: 6e 64 69 61 6e 46 6c 6f 61 74 28 70 4d 65 6d 2d  ndianFloat(pMem-
d970: 3e 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  >r);.      memcp
d980: 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
d990: 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
d9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
d9b0: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
d9c0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
d9d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d9e0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
d9f0: 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
da00: 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a  t( len<=nBuf );.
da10: 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
da20: 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
da30: 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20   (v&0xFF);.     
da40: 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
da50: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
da60: 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
da70: 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
da80: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
da90: 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
daa0: 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
dab0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
dac0: 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30  ero)?pMem->u.i:0
dad0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
dae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
daf0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
db00: 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
db10: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
db20: 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
db30: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
db40: 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
db50: 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
db60: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
db70: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
db80: 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
db90: 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  .i;.      if( le
dba0: 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  n>nBuf ){.      
dbb0: 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20    len = nBuf;.  
dbc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
dbd0: 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
dbe0: 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
dbf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
dc00: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
dc10: 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
dc20: 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
dc30: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
dc40: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
dc50: 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
dc60: 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
dc70: 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
dc80: 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
dc90: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
dca0: 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
dcb0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
dcc0: 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
dcd0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
dce0: 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
dcf0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
dd00: 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
dd10: 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
dd20: 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
dd30: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd50: 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
dd60: 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
dd70: 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd90: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
dda0: 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
ddb0: 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
ddc0: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
ddd0: 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
dde0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
ddf0: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
de00: 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
de10: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
de20: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
de30: 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
de40: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
de50: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
de60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
de70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
de80: 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
de90: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
dea0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
deb0: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
dec0: 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
ded0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
dee0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
def0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
df00: 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
df10: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
df20: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
df30: 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
df40: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
df50: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
df60: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
df70: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
df80: 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
df90: 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
dfa0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
dfb0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
dfc0: 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
dfd0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
dfe0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
dff0: 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
e000: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e010: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e020: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
e030: 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
e040: 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
e050: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
e060: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
e070: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
e080: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
e090: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
e0a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e0b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e0c0: 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
e0d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
e0e0: 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
e0f0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e100: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
e110: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
e120: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
e130: 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
e140: 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
e150: 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
e160: 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
e170: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
e180: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
e190: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
e1a0: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
e1b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e1c0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
e1d0: 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
e1e0: 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
e1f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
e200: 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
e210: 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
e220: 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
e230: 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
e240: 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
e250: 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
e260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e270: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
e280: 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
e290: 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
e2a0: 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
e2b0: 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
e2c0: 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
e2d0: 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
e2e0: 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
e2f0: 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
e300: 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
e310: 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
e320: 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
e330: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
e340: 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
e350: 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
e360: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e370: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
e380: 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
e390: 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
e3a0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e3b0: 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
e3c0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 32  .      double r2
e3d0: 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 73 77 61   = r1;.      swa
e3e0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e3f0: 74 28 72 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(r2);.      ass
e400: 65 72 74 28 20 73 69 7a 65 6f 66 28 72 32 29 3d  ert( sizeof(r2)=
e410: 3d 73 69 7a 65 6f 66 28 74 31 29 20 26 26 20 6d  =sizeof(t1) && m
e420: 65 6d 63 6d 70 28 26 72 32 2c 20 26 74 31 2c 20  emcmp(&r2, &t1, 
e430: 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
e440: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
e450: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
e460: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
e470: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
e480: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
e490: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
e4a0: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
e4b0: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
e4c0: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
e4d0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
e4e0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
e4f0: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
e500: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
e510: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
e520: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e530: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
e540: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e550: 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
e560: 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
e570: 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
e580: 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
e590: 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
e5a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d  );.        swapM
e5b0: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
e5c0: 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20  pMem->r);.      
e5d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e5e0: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
e5f0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
e600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e610: 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
e620: 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
e630: 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
e640: 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
e650: 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
e660: 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
e670: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e680: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
e690: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
e6a0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
e6b0: 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c  nt len = (serial
e6c0: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
e6d0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
e6e0: 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
e6f0: 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20  pMem->n = len;. 
e700: 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
e710: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
e720: 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
e730: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
e740: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
e750: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
e760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e770: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e780: 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
e790: 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  Ephem;.      }. 
e7a0: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b       return len;
e7b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
e7c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e7d0: 54 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  The header of a 
e7e0: 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20  record consists 
e7f0: 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20 76 61  of a sequence va
e800: 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e  riable-length in
e810: 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65  tegers..** These
e820: 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 61 6c   integers are al
e830: 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d 61 6c  most always smal
e840: 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f 64 65  l and are encode
e850: 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79  d as a single by
e860: 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  te..** The follo
e870: 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65 73  wing macro takes
e880: 20 61 64 76 61 6e 74 61 67 65 20 74 68 69 73 20   advantage this 
e890: 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64 65 20  fact to provide 
e8a0: 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a  a fast decode.**
e8b0: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 73   of the integers
e8c0: 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68 65 61   in a record hea
e8d0: 64 65 72 2e 20 20 49 74 20 69 73 20 66 61 73 74  der.  It is fast
e8e0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
e8f0: 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20  n case.** where 
e900: 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 61  the integer is a
e910: 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20 20 49   single byte.  I
e920: 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73 6c  t is a little sl
e930: 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a  ower when the.**
e940: 20 69 6e 74 65 67 65 72 20 69 73 20 74 77 6f 20   integer is two 
e950: 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e 20 20  or more bytes.  
e960: 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74 20 69  But overall it i
e970: 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
e980: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  The following ex
e990: 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65 71  pressions are eq
e9a0: 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20  uivalent:.**.** 
e9b0: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 47      x = sqlite3G
e9c0: 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c 20 26  etVarint32( A, &
e9d0: 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78  B );.**.**     x
e9e0: 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20 41 2c   = GetVarint( A,
e9f0: 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66   B );.**.*/.#def
ea00: 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28 41 2c  ine GetVarint(A,
ea10: 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29 29 3c  B)  ((B = *(A))<
ea20: 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71 6c 69  =0x7f ? 1 : sqli
ea30: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 41  te3GetVarint32(A
ea40: 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  , &B))../*.** Th
ea50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
ea60: 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
ea70: 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
ea80: 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66 69   records specifi
ea90: 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31  ed by .** {nKey1
eaa0: 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b  , pKey1} and {nK
eab0: 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74  ey2, pKey2}, ret
eac0: 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76  urning a negativ
ead0: 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
eae0: 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
eaf0: 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  f {nKey1, pKey1}
eb00: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
eb10: 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
eb20: 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65  reater than {nKe
eb30: 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74  y2, pKey2}.  Bot
eb40: 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  h Key1 and Key2 
eb50: 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74 72  must be byte str
eb60: 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64  ings.** composed
eb70: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
eb80: 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
eb90: 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74  the VDBE..*/.int
eba0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
ebb0: 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69  rdCompare(.  voi
ebc0: 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69  d *userData,.  i
ebd0: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
ebe0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20  void *pKey1, .  
ebf0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
ec00: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
ec10: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
ec20: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
ec30: 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20  userData;.  u32 
ec40: 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20  d1, d2;         
ec50: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
ec60: 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
ec70: 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
ec80: 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b   u32 idx1, idx2;
ec90: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
eca0: 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
ecb0: 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
ecc0: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
ecd0: 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20  r1, szHdr2;  /* 
ece0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
ecf0: 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
ed00: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
ed10: 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63  nField;.  int rc
ed20: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
ed30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
ed40: 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
ed50: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
ed60: 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  1;.  const unsig
ed70: 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20  ned char *aKey2 
ed80: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
ed90: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a  d char *)pKey2;.
eda0: 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d  .  Mem mem1;.  M
edb0: 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e  em mem2;.  mem1.
edc0: 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
edd0: 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20  enc;.  mem2.enc 
ede0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
edf0: 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74  .  .  idx1 = Get
ee00: 56 61 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a  Varint(aKey1, sz
ee10: 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
ee20: 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47  Hdr1;.  idx2 = G
ee30: 65 74 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20  etVarint(aKey2, 
ee40: 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20  szHdr2);.  d2 = 
ee50: 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64  szHdr2;.  nField
ee60: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
ee70: 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  eld;.  while( id
ee80: 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78  x1<szHdr1 && idx
ee90: 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20  2<szHdr2 ){.    
eea0: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
eeb0: 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  ;.    u32 serial
eec0: 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20  _type2;..    /* 
eed0: 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
eee0: 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
eef0: 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
ef00: 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
ef10: 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74  dx1 += GetVarint
ef20: 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
ef30: 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20  rial_type1 );.  
ef40: 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
ef50: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
ef60: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
ef70: 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
ef80: 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d  eak;.    idx2 +=
ef90: 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79   GetVarint( aKey
efa0: 32 2b 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74  2+idx2, serial_t
efb0: 79 70 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ype2 );.    if( 
efc0: 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c  d2>=nKey2 && sql
efd0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
efe0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
eff0: 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e2)>0 ) break;..
f000: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
f010: 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
f020: 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
f030: 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
f040: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
f050: 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
f060: 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
f070: 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69  ;.    d2 += sqli
f080: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
f090: 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72  (&aKey2[d2], ser
f0a0: 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32  ial_type2, &mem2
f0b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
f0c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
f0d0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
f0e0: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
f0f0: 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e  mem1, &mem2, i<n
f100: 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f  Field ? pKeyInfo
f110: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b  ->aColl[i] : 0);
f120: 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c  .    if( mem1.fl
f130: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20  ags & MEM_Dyn ) 
f140: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
f150: 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20  lease(&mem1);.  
f160: 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73    if( mem2.flags
f170: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c   & MEM_Dyn ) sql
f180: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
f190: 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69  se(&mem2);.    i
f1a0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
f1b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f1c0: 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
f1d0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  * One of the key
f1e0: 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
f1f0: 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  lds, but all the
f200: 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
f210: 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65  at point.  ** we
f220: 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
f230: 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73   incrKey flag is
f240: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
f250: 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20  second key is.  
f260: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61  ** treated as la
f270: 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rger..  */.  if(
f280: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
f290: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72  ( pKeyInfo->incr
f2a0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
f2b0: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
f2c0: 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a  if( d1<nKey1 ){.
f2d0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
f2e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c 6e    }else if( d2<n
f2f0: 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20 72 63  Key2 ){.      rc
f300: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
f310: 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
f320: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
f330: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
f340: 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
f350: 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
f360: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
f370: 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
f380: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
f390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
f3a0: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64  gument is an ind
f3b0: 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65  ex entry compose
f3c0: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
f3d0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
f3e0: 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e  ..** The last en
f3f0: 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f  try in this reco
f400: 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  rd should be an 
f410: 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69  integer (specifi
f420: 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  cally.** an inte
f430: 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69  ger rowid).  Thi
f440: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
f450: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
f460: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74  bytes in.** that
f470: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74   integer..*/.int
f480: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
f490: 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38  owidLen(const u8
f4a0: 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73   *aKey){.  u32 s
f4b0: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
f4c0: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
f4d0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
f4e0: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
f4f0: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
f500: 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69  rowid */..  sqli
f510: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61  te3GetVarint32(a
f520: 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  Key, &szHdr);.  
f530: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
f540: 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31  32(&aKey[szHdr-1
f550: 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
f560: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
f570: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
f580: 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a  n(typeRowid);.}.
f590: 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70    ../*.** pCur p
f5a0: 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
f5b0: 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
f5c0: 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
f5d0: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
f5e0: 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
f5f0: 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
f600: 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
f610: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
f620: 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
f630: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
f640: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
f650: 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
f660: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
f670: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f680: 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
f690: 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
f6a0: 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
f6b0: 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
f6c0: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
f6d0: 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
f6e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f6f0: 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
f700: 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
f710: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
f720: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
f730: 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
f740: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f750: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
f760: 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
f770: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
f780: 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
f790: 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
f7a0: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
f7b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f7c0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
f7d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
f7e0: 46 72 6f 6d 42 74 72 65 65 28 64 62 2c 20 70 43  FromBtree(db, pC
f7f0: 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
f800: 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
f810: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
f820: 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rc;.  }.  sqlite
f830: 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  3GetVarint32((u8
f840: 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a  *)m.z, &szHdr);.
f850: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
f860: 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
f870: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
f880: 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64  wid);.  lenRowid
f890: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
f8a0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
f8b0: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
f8c0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
f8d0: 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
f8e0: 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
f8f0: 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
f900: 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
f910: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
f920: 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
f930: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f940: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
f950: 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
f960: 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
f970: 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74  or pC is point t
f980: 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
f990: 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
f9a0: 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e  Key (of length n
f9b0: 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74  Key).  Write int
f9c0: 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
f9d0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
f9e0: 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
f9f0: 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
fa00: 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
fa10: 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
fa20: 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20  ter than pKey.  
fa30: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
fa40: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
fa50: 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68 65  ** pKey is eithe
fa60: 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
fa70: 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
fa80: 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
fa90: 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
faa0: 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
fab0: 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
fac0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
fad0: 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
fae0: 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
faf0: 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ll..*/.int sqlit
fb00: 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
fb10: 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
fb20: 64 62 2c 0a 20 20 43 75 72 73 6f 72 20 2a 70 43  db,.  Cursor *pC
fb30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fb40: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
fb50: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
fb60: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  st */.  int nKey
fb70: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79  , const u8 *pKey
fb80: 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74  ,   /* The key t
fb90: 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
fba0: 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
fbb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
fbc0: 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
fbd0: 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
fbe0: 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
fbf0: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
fc00: 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
fc10: 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
fc20: 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69  r;.  int lenRowi
fc30: 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73  d;.  Mem m;..  s
fc40: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
fc50: 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
fc60: 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
fc70: 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72  Key<=0 ){.    *r
fc80: 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
fc90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fca0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
fcb0: 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
fcc0: 28 64 62 2c 20 70 43 2d 3e 70 43 75 72 73 6f 72  (db, pC->pCursor
fcd0: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
fce0: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
fcf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fd00: 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
fd10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
fd20: 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d  xRowidLen((u8*)m
fd30: 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71  .z);.  *res = sq
fd40: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
fd50: 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49  ompare(pC->pKeyI
fd60: 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  nfo, m.n-lenRowi
fd70: 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b  d, m.z, nKey, pK
fd80: 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ey);.  sqlite3Vd
fd90: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
fda0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fdb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
fdc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
fdd0: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
fde0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
fdf0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
fe00: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
fe10: 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
fe20: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
fe30: 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
fe40: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
fe50: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
fe60: 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 64  nt nChange){.  d
fe70: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
fe80: 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
fe90: 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
fea0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
feb0: 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
fec0: 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
fed0: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
fee0: 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
fef0: 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
ff00: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
ff10: 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
ff20: 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
ff30: 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
ff40: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
ff50: 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
ff60: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
ff70: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
ff80: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ff90: 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
ffa0: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
ffb0: 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
ffc0: 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
ffd0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
ffe0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
fff0: 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
10000 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
10010 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
10020 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
10030 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
10040 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
10050 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
10060 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
10070 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
10080 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
10090 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
100a0 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
100b0 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
100c0 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
100d0 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
100e0 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
100f0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
10100 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
10110 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
10120 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
10130 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
10140 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
10150 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
10160 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
10170 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
10180 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10190 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
101a0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
101b0 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
101c0 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
101d0 7d 0a                                            }.