/ Hex Artifact Content
Login

Artifact b040c3787ea1c32ba025b1c5822553469abe4efa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
02f0: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0300: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0310: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0320: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0330: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0340: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0350: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0360: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0370: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0380: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
0390: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03a0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03c0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03d0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
03f0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0400: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0410: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0420: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0430: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0440: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0450: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0460: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 64  ro(db, sizeof(Vd
0470: 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  be) );.  if( p==
0480: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0490: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66  p->db = db;.  if
04a0: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
04b0: 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50     db->pVdbe->pP
04c0: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70  rev = p;.  }.  p
04d0: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56  ->pNext = db->pV
04e0: 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  dbe;.  p->pPrev 
04f0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65  = 0;.  db->pVdbe
0500: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = p;.  p->magic
0510: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
0520: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  IT;.  return p;.
0530: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0540: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0550: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0560: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0580: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0590: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
05a0: 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20   n){.  if( p==0 
05b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
05c0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05d0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
05e0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
05f0: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a  ->db, z, n);.}..
0600: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0610: 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20   SQL associated 
0620: 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64 20  with a prepared 
0630: 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e  statement.*/.con
0640: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0650: 56 64 62 65 47 65 74 53 71 6c 28 56 64 62 65 20  VdbeGetSql(Vdbe 
0660: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
0670: 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >zSql;.}../*.** 
0680: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
0690: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
06a0: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
06b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
06c0: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
06d0: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
06e0: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
06f0: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e  char *zTmp;.  in
0700: 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20  t nTmp;.  tmp = 
0710: 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42  *pA;.  *pA = *pB
0720: 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20  ;.  *pB = tmp;. 
0730: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78   pTmp = pA->pNex
0740: 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d  t;.  pA->pNext =
0750: 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42   pB->pNext;.  pB
0760: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a  ->pNext = pTmp;.
0770: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72    pTmp = pA->pPr
0780: 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20  ev;.  pA->pPrev 
0790: 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pB->pPrev;.  p
07a0: 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b  B->pPrev = pTmp;
07b0: 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53  .  zTmp = pA->zS
07c0: 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d  ql;.  pA->zSql =
07d0: 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d   pB->zSql;.  pB-
07e0: 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20  >zSql = zTmp;.  
07f0: 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b  nTmp = pA->nSql;
0800: 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42  .  pA->nSql = pB
0810: 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53  ->nSql;.  pB->nS
0820: 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69  ql = nTmp;.}..#i
0830: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0840: 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61  G./*.** Turn tra
0850: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a  cing on or off.*
0860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0870: 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c  beTrace(Vdbe *p,
0880: 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20   FILE *trace){. 
0890: 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63   p->trace = trac
08a0: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
08b0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08c0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
08d0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
08e0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
08f0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
0900: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0910: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0920: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0930: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0940: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0950: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 0a 2a  tain exactly N.*
0960: 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 56 64 62 65  * elements. Vdbe
0970: 2e 6e 4f 70 41 6c 6c 6f 63 20 69 73 20 73 65 74  .nOpAlloc is set
0980: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
0990: 6e 65 77 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  new size of.** t
09a0: 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
09b0: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
09c0: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
09d0: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
09e0: 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64  the array,.** Vd
09f0: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0a00: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a10: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a20: 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e  is so that.** an
0a30: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0a40: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
0a50: 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  be correctly dea
0a60: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
0aa0: 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  izeOpArray(Vdbe 
0ab0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  *p, int N){.  in
0ac0: 74 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d  t runMode = p->m
0ad0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
0ae0: 5f 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d  _RUN;.  if( runM
0af0: 6f 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c  ode || p->nOpAll
0b00: 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  oc<N ){.    Vdbe
0b10: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  Op *pNew;.    in
0b20: 74 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30  t nNew = N + 100
0b30: 2a 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20  *(!runMode);.   
0b40: 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70   int oldSize = p
0b50: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20  ->nOpAlloc;.    
0b60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
0b70: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e  ealloc(p->aOp, n
0b80: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0b90: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
0ba0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  .      p->nOpAll
0bb0: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
0bc0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bd0: 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f        if( nNew>o
0be0: 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ldSize ){.      
0bf0: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
0c00: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e  [oldSize], 0, (n
0c10: 4e 65 77 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a  New-oldSize)*siz
0c20: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 20 20  eof(Op));.      
0c30: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
0c40: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
0c50: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
0c60: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
0c70: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0c80: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0c90: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0ca0: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0cb0: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0cc0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0cd0: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
0ce0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
0cf0: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
0d00: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
0d10: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
0d20: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
0d40: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
0d50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
0d60: 2a 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20 20  **    p1, p2    
0d70: 20 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20        First two 
0d80: 6f 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73  of the three pos
0d90: 73 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a  sible operands..
0da0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0db0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0dc0: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0dd0: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0de0: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0df0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0e00: 33 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  3() function to 
0e10: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0e20: 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70   of the P3.** op
0e30: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56  lite3VdbeAddOp(V
0e50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
0e60: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
0e70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
0e80: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
0e90: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
0ea0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0eb0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0ec0: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
0ed0: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a  <=i ){.    resiz
0ee0: 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31 29  eOpArray(p, i+1)
0ef0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  ;.    if( p->db-
0f00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
0f10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
0f30: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
0f40: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
0f50: 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20  ->opcode = op;. 
0f60: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20   pOp->p1 = p1;. 
0f70: 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20   pOp->p2 = p2;. 
0f80: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
0f90: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
0fa0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0fb0: 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  xpired = 0;.#ifd
0fc0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64    if( sqlite3_vd
0fe0: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29  be_addop_trace )
0ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
1000: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
1010: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  p[i]);.#endif.  
1020: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
1030: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1040: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1050: 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f 0a  he p3 value..*/.
1060: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f  int sqlite3VdbeO
1070: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
1080: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1090: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
10a0: 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29 7b  zP3,int p3type){
10b0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
10c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70  lite3VdbeAddOp(p
10d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20  , op, p1, p2);. 
10e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10f0: 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP3(p, addr, zP
1100: 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72 65  3, p3type);.  re
1110: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1120: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1130: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1140: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1150: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1160: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1170: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1180: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
1190: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
11a0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
11b0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
11c0: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
11d0: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
11e0: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
11f0: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1200: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1210: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1220: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1230: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1240: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1250: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1260: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1270: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1280: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
1290: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
12a0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
12b0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
12c0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
12d0: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
12e0: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
12f0: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1300: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1310: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1320: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1330: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1340: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1350: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1360: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1370: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1380: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
1390: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
13a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
13b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13c0: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
13d0: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
13e0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
13f0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1400: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1410: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
1420: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d  nLabelAlloc = p-
1430: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1440: 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62   10;.    p->aLab
1450: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1460: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1470: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
14b0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
14c0: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
14d0: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
14e0: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
14f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1500: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1510: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1520: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1530: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1540: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1550: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
1560: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
1570: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
1580: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1590: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
15a0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
15b0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
15c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
15d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
15e0: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
15f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1600: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1610: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
1630: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
1640: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
1650: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1660: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
1670: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1680: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1690: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
16a0: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
16b0: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
16c0: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
16d0: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
16e0: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
16f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1700: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1710: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1720: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
1730: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
1740: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
1750: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
1760: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
1770: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
1780: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
1790: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
17a0: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
17b0: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
17c0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
17d0: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
17e0: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
17f0: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1800: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1810: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1820: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
1830: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
1840: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
1850: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
1860: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
1870: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
1880: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
1890: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
18a0: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
18b0: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
18c0: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
18d0: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
18e0: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
18f0: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1900: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1910: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1920: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
1930: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
1940: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
1950: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
1960: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
1970: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
1980: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1990: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
19a0: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
19b0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
19c0: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
19d0: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
19e0: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
19f0: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1a00: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1a10: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1a20: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
1a30: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
1a40: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
1a50: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
1a60: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
1a70: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
1a80: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1a90: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1aa0: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1ab0: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1ac0: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1ad0: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1ae0: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1af0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1b00: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1b10: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1b20: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1b30: 55 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29  USH_MASK_1)<<16)
1b40: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1b50: 4b 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_2 + (((unsigne
1b60: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29  d)NOPUSH_MASK_3)
1b70: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1b80: 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e  H_MASK_4 + (((un
1b90: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1ba0: 53 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_5)<<16),.    
1bb0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20  NOPUSH_MASK_6 + 
1bc0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1bd0: 53 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c  SH_MASK_7)<<16),
1be0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1bf0: 5f 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _8 + (((unsigned
1c00: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c  )NOPUSH_MASK_9)<
1c10: 3c 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65  <16).  };.  asse
1c20: 72 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20  rt( op<32*5 );. 
1c30: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f   return (masks[o
1c40: 70 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26  p>>5] & (1<<(op&
1c50: 30 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e  0x1F)));.}..#ifn
1c60: 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
1c70: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1c80: 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20  NoPush(u8 op){. 
1c90: 20 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f   return opcodeNo
1ca0: 50 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64  Push(op);.}.#end
1cb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  if../*.** Loop t
1cc0: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
1cd0: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
1ce0: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
1cf0: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45  e negative..** E
1d00: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
1d10: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
1d20: 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79  lve the label by
1d30: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a   setting the P2.
1d40: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  ** value to its 
1d50: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
1d60: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1d70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d80: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
1d90: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
1da0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
1db0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
1dc0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
1dd0: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1de0: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
1df0: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
1e00: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
1e10: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
1e20: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
1e30: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
1e40: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
1e50: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
1e60: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
1e70: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
1e80: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  *.** The integer
1e90: 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73   *pMaxStack is s
1ea0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1eb0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  m number of vdbe
1ec0: 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65   stack.** entrie
1ed0: 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e  s that static an
1ee0: 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74  alysis reveals t
1ef0: 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68  his program migh
1f00: 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t need..**.** Th
1f10: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
1f20: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
1f30: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ng optimization:
1f40: 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a    It scans for.*
1f50: 2a 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69  * Halt instructi
1f60: 6f 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51  ons where P1==SQ
1f70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1f80: 6f 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20  or P2==OE_Abort 
1f90: 6f 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73  or for.** IdxIns
1fa0: 65 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ert instructions
1fb0: 20 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49   where P2!=0.  I
1fc0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1fd0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e  ction is.** foun
1fe0: 64 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74  d, then every St
1ff0: 61 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74  atement instruct
2000: 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74  ion is changed t
2010: 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a  o a Noop.  In.**
2020: 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76   this way, we av
2030: 6f 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65  oid creating the
2040: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2050: 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73  al file unnecess
2060: 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  arily..*/.static
2070: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
2080: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
2090: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
20a0: 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b  , int *pMaxStack
20b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
20c0: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a  t nMaxArgs = 0;.
20d0: 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20    int nMaxStack 
20e0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a  = p->nOp;.  Op *
20f0: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
2100: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
2110: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
2120: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
2130: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
2140: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
2150: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
2160: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
2170: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
2180: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
2190: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
21a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
21b0: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
21c0: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a  de==OP_AggStep .
21d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21e0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
21f0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f  .        || opco
2200: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23  de==OP_VUpdate.#
2210: 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2220: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
2230: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2240: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
2250: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
2260: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20  de==OP_Halt ){. 
2270: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
2280: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
2290: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
22a0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
22b0: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
22c0: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
22d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22e0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
22f0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
2300: 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42     hasStatementB
2310: 65 67 69 6e 20 3d 20 31 3b 0a 23 69 66 6e 64 65  egin = 1;.#ifnde
2320: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2330: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
2340: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2350: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2360: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2370: 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53  e ){.      doesS
2380: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
2390: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
23a0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
23b0: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
23c0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
23d0: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
23e0: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
23f0: 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e 6f 70  sert( pOp[-2].op
2400: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2410: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2420: 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-2].p1;.      
2430: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2440: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2450: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2460: 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68  if( opcodeNoPush
2470: 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20  (opcode) ){.    
2480: 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20    nMaxStack--;. 
2490: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
24a0: 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69  p->p2>=0 ) conti
24b0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
24c0: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
24d0: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70  Label );.    pOp
24e0: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31  ->p2 = aLabel[-1
24f0: 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20  -pOp->p2];.  }. 
2500: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
2510: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
2520: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
2530: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
2540: 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78 53  axArgs;.  *pMaxS
2550: 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63 6b  tack = nMaxStack
2560: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65  ;..  /* If we ne
2570: 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73  ver rollback a s
2580: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
2590: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65  tion, then state
25a0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
25b0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e  ctions are not n
25c0: 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67  eeded.  So chang
25d0: 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65  e every OP_State
25e0: 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ment.  ** opcode
25f0: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2600: 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20  .  This avoid a 
2610: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2620: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2630: 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20  .  ** which can 
2640: 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20  be expensive on 
2650: 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a  some platforms..
2660: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74    */.  if( hasSt
2670: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20  atementBegin && 
2680: 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f  !doesStatementRo
2690: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
26a0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
26b0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
26c0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
26d0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
26e0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
26f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   ){.        pOp-
2700: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
2710: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2720: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2730: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
2740: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2750: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
2760: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
2770: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2780: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
2790: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
27a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
27b0: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
27c0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
27d0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
27e0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
27f0: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2800: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2810: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2820: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2830: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2850: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
2860: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
2870: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
2880: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
2890: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
28a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
28b0: 4e 49 54 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f  NIT );.  resizeO
28c0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
28d0: 20 2b 20 6e 4f 70 29 3b 0a 20 20 69 66 28 20 70   + nOp);.  if( p
28e0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
28f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
2900: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
2910: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
2920: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
2930: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
2940: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
2950: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
2960: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
2970: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
2980: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
2990: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
29a0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
29b0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
29c0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
29d0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
29e0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
29f0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
2a00: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
2a10: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
2a20: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
2a30: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
2a40: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
2a50: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
2a60: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
2a70: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a80: 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  G.      if( sqli
2a90: 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
2aa0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
2ab0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
2ac0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
2ad0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
2ae0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2af0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
2b00: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
2b10: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2b20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2b30: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
2b40: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
2b50: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2b60: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2b70: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
2b80: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
2b90: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
2ba0: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
2bb0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
2bc0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
2bd0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
2be0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
2bf0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
2c00: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
2c10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2c20: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP1(Vdbe *p, in
2c30: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2c40: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2c50: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2c60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2c70: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2c80: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2c90: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2ca0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2cb0: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
2cc0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2cd0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2ce0: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
2cf0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2d00: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
2d10: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
2d20: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
2d30: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
2d40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d50: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
2d60: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2d70: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2d80: 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20  rt( val>=0 );.  
2d90: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2da0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2db0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2dc0: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
2dd0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
2de0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2df0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
2e00: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2e10: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
2e20: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
2e30: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
2e40: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2e50: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
2e60: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2e70: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2e80: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
2e90: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2ea0: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
2eb0: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
2ec0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
2ed0: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
2ee0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
2ef0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
2f00: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
2f10: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
2f20: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
2f30: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
2f40: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
2f50: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
2f60: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
2f70: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75  meralFunction(Fu
2f80: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
2f90: 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65  if( pDef && (pDe
2fa0: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
2fb0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
2fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2fd0: 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a  free(pDef);.  }.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2ff0: 61 20 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65  a P3 value if ne
3000: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
3010: 69 63 20 76 6f 69 64 20 66 72 65 65 50 33 28 69  ic void freeP3(i
3020: 6e 74 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20  nt p3type, void 
3030: 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29  *p3){.  if( p3 )
3040: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 33  {.    switch( p3
3050: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
3060: 73 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P3_DYNAMIC:. 
3070: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59       case P3_KEY
3080: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
3090: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
30a0: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
30b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b  qlite3_free(p3);
30c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
30d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
30e0: 73 65 20 50 33 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P3_MPRINTF: {
30f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3100: 5f 66 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20  _free(p3);.     
3110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3120: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
3130: 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20  VDBEFUNC: {.    
3140: 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56      VdbeFunc *pV
3150: 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46  dbeFunc = (VdbeF
3160: 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20  unc *)p3;.      
3170: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
3180: 75 6e 63 74 69 6f 6e 28 70 56 64 62 65 46 75 6e  unction(pVdbeFun
3190: 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  c->pFunc);.     
31a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
31b0: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
31c0: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
31d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31e0: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
31f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3200: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33   }.      case P3
3210: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
3220: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
3230: 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44  lFunction((FuncD
3240: 65 66 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ef*)p3);.       
3250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3260: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45        case P3_ME
3270: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M: {.        sql
3280: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
3290: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33  qlite3_value*)p3
32a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32c0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68    }.}.../*.** Ch
32d0: 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73  ange N opcodes s
32e0: 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20  tarting at addr 
32f0: 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f  to No-ops..*/.vo
3300: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3310: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
3320: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3330: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
3340: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
3350: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
3360: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
3370: 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20  while( N-- ){.  
3380: 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e      freeP3(pOp->
3390: 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29  p3type, pOp->p3)
33a0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
33b0: 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  Op, 0, sizeof(pO
33c0: 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f  p[0]));.      pO
33d0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
33e0: 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b  oop;.      pOp++
33f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
3400: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3410: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
3420: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3430: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3440: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3450: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
3460: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3470: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3480: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3490: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
34a0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
34b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
34c0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
34d0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
34e0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
34f0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
3500: 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P3 operand is d
3510: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
3520: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
3530: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
3540: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
3550: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3560: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
3570: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
3580: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
3590: 79 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74  ytes of zP3 up t
35a0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
35b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
35c0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
35d0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
35e0: 74 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a  tes of zP3..**.*
35f0: 2a 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e  * If n==P3_KEYIN
3600: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
3610: 20 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65   zP3 is a pointe
3620: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
3630: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
3640: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
3650: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
3660: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
3670: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3680: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
3690: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
36a0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
36b0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
36c0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
36d0: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
36e0: 74 20 7a 50 33 20 70 6f 69 6e 74 73 20 74 6f 20  t zP3 points to 
36f0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
3700: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
3710: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
3720: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
3730: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3740: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
3750: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
3760: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
3770: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
3780: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
3790: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
37a0: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
37b0: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
37c0: 6e 20 28 50 33 5f 53 54 41 54 49 43 2c 20 50 33  n (P3_STATIC, P3
37d0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
37e0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 33  ndicate that zP3
37f0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
3800: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
3810: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
3820: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
3830: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
3840: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
3850: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
3860: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
3870: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
3880: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
3890: 65 6e 20 63 68 61 6e 67 65 20 50 33 20 6f 6e 20  en change P3 on 
38a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
38b0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
38c0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
38d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
38e0: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP3(Vdbe *p, int
38f0: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
3900: 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP3, int n){.
3910: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73    Op *pOp;.  ass
3920: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
3930: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3940: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
3950: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  p==0 || p->aOp==
3960: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
3970: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
3980: 69 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49  if (n != P3_KEYI
3990: 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65  NFO) {.      fre
39a0: 65 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  eP3(n, (void*)*(
39b0: 63 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20  char**)&zP3);.  
39c0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
39d0: 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30    }.  if( addr<0
39e0: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
39f0: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
3a00: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69  ->nOp - 1;.    i
3a10: 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75  f( addr<0 ) retu
3a20: 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20  rn;.  }.  pOp = 
3a30: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3a40: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3a50: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3a60: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3a70: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3a80: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
3a90: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3aa0: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P3_NOTUSED;.  }
3ab0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b  else if( n==P3_K
3ac0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
3ad0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
3ae0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
3af0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
3b00: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
3b10: 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP3)->nField;. 
3b20: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3b30: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3b40: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3b50: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3b60: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3b70: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3b80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
3b90: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
3ba0: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
3bb0: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3bc0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3bd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3be0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3bf0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3c00: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
3c10: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3c20: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3c30: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3c40: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3c50: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3c60: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
3c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3c80: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3c90: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
3ca0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3cb0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
3cc0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3cd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3ce0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3cf0: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
3d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
3d10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3d20: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
3d30: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
3d40: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
3d50: 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59  se if( n==P3_KEY
3d60: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
3d70: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
3d80: 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f  har*)zP3;.    pO
3d90: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b  p->p3type = P3_K
3da0: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3db0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3dc0: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
3dd0: 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  zP3;.    pOp->p3
3de0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3df0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3e00: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33  ) n = strlen(zP3
3e10: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
3e20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
3e30: 70 28 70 2d 3e 64 62 2c 20 7a 50 33 2c 20 6e 29  p(p->db, zP3, n)
3e40: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3e50: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
3e60: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
3e70: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  DEBUG./*.** Repl
3e80: 61 63 65 20 74 68 65 20 50 33 20 66 69 65 6c 64  ace the P3 field
3e90: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
3ea0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
3eb0: 72 75 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ruction with.** 
3ec0: 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f  comment text..*/
3ed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3ee0: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
3ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
3f00: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
3f10: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73  a_list ap;.  ass
3f20: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
3f30: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
3f40: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
3f50: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
3f60: 4f 70 2d 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 70  Op-1].p3==0 || p
3f70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3f80: 65 64 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  ed );.  va_start
3f90: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
3fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3fb0: 67 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69  geP3(p, -1, sqli
3fc0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
3fd0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c  b, zFormat, ap),
3fe0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
3ff0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
4000: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
4010: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
4020: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
4030: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
4040: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
4050: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4060: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4070: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4080: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
4090: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
40a0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
40b0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
40c0: 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  led );.  return 
40d0: 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ((addr>=0 && add
40e0: 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61  r<p->nOp)?(&p->a
40f0: 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a  Op[addr]):0);.}.
4100: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4110: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
4120: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
4130: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
4140: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
4150: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
4160: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
4170: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4180: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
4190: 72 69 62 65 73 20 74 68 65 20 50 33 20 70 61 72  ribes the P3 par
41a0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
41b0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
41c0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
41d0: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
41e0: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
41f0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
4200: 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63  layP3(Op *pOp, c
4210: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
4220: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
4230: 7a 50 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  zP3;.  assert( n
4240: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
4250: 69 74 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70  itch( pOp->p3typ
4260: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33  e ){.    case P3
4270: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
4280: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
4290: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
42a0: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
42b0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
42c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
42d0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
42e0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
42f0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4300: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4310: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4320: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4330: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4340: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4350: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4360: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
4370: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
4380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4390: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
43a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
43b0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
43c0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
43d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
43e0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4400: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4410: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4420: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4430: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4440: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4450: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4460: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
4470: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4480: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
4490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
44a0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
44b0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
44c0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
44d0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
44e0: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
44f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4500: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4510: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4520: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4540: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4550: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4560: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
4570: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
4580: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33  emp );.      zP3
4590: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
45a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
45b0: 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51   case P3_COLLSEQ
45c0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
45d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
45e0: 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Seq*)pOp->p3;.  
45f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4600: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4610: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
4620: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
4630: 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  e);.      zP3 = 
4640: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
4650: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4660: 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b  se P3_FUNCDEF: {
4670: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
4680: 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a  pDef = (FuncDef*
4690: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
46a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
46b0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
46c0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
46d0: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
46e0: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
46f0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4700: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
4710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4720: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
4730: 73 65 20 50 33 5f 56 54 41 42 3a 20 7b 0a 20 20  se P3_VTAB: {.  
4740: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
4750: 20 2a 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74   *pVtab = (sqlit
4760: 65 33 5f 76 74 61 62 2a 29 70 4f 70 2d 3e 70 33  e3_vtab*)pOp->p3
4770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4780: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4790: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
47a0: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
47b0: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
47c0: 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a     zP3 = zTemp;.
47d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
47f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
4800: 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  P3 = pOp->p3;.  
4810: 20 20 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c      if( zP3==0 |
4820: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
4830: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
4840: 20 20 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20    zP3 = "";.    
4850: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4860: 61 73 73 65 72 74 28 20 7a 50 33 21 3d 30 20 29  assert( zP3!=0 )
4870: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b 0a  ;.  return zP3;.
4880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  }.#endif...#if d
4890: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
48a0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
48b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
48c0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
48d0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
48e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
48f0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
4900: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
4910: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
4920: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
4930: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
4940: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61  char *zP3;.  cha
4950: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74  r zPtr[50];.  st
4960: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4970: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
4980: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
4990: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
49a0: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
49b0: 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73  out;.  zP3 = dis
49c0: 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72  playP3(pOp, zPtr
49d0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
49e0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
49f0: 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20   zFormat1,.     
4a00: 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f   pc, sqlite3Opco
4a10: 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63  deNames[pOp->opc
4a20: 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode], pOp->p1, p
4a30: 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20  Op->p2, zP3);.  
4a40: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
4a50: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4a60: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
4a70: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
4a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a90: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4aa0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
4ab0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77    if( p ){.    w
4ac0: 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20  hile( N-->0 ){. 
4ad0: 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32       assert( N<2
4ae0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
4af0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 73 71  ].db );.      sq
4b00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
4b10: 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a  ase(p++);.    }.
4b20: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
4b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
4b40: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
4b50: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
4b60: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
4b70: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
4b80: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
4b90: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
4ba0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
4bb0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
4bc0: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
4bd0: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
4be0: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
4bf0: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
4c00: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4c10: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
4c20: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
4c30: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a  t "EXPLAIN"..*/.
4c40: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c  int sqlite3VdbeL
4c50: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20  ist(.  Vdbe *p  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
4c80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4c90: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
4ca0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
4cb0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
4cc0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
4cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
4ce0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
4cf0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4d00: 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72  _MISUSE;.  asser
4d10: 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  t( db->magic==SQ
4d20: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20  LITE_MAGIC_BUSY 
4d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
4d40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
4d50: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
4d60: 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  USY );..  /* Eve
4d70: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
4d80: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 75  code does not pu
4d90: 74 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  t dynamic string
4da0: 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  s onto the.  ** 
4db0: 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79 20  the stack, they 
4dc0: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
4dd0: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
4de0: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
4df0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
4e00: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
4e10: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
4e20: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
4e30: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d  /.  if( p->pTos=
4e40: 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29  =&p->aStack[4] )
4e50: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
4e60: 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c  Array(p->aStack,
4e70: 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65   5);.  }.  p->re
4e80: 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20  sOnStack = 0;.. 
4e90: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
4ea0: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
4eb0: 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65  i<p->nOp && p->e
4ec0: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
4ed0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
4ee0: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
4ef0: 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  f( i>=p->nOp ){.
4f00: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
4f10: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
4f20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
4f30: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
4f40: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
4f50: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
4f60: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
4f70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
4f80: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
4f90: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
4fa0: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 45  ErrMsg, sqlite3E
4fb0: 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20 28 63  rrStr(p->rc), (c
4fc0: 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65  har*)0);.  }else
4fd0: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
4fe0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
4ff0: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *pMem = p->a
5000: 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d  Stack;.    pMem-
5010: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5020: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  ;.    pMem->type
5030: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5040: 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  R;.    pMem->u.i
5050: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
5080: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  counter */.    p
5090: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
50a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
50b0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
50c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d  _Term;.    pMem-
50d0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
50e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
50f0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a  Op->opcode];  /*
5100: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 61   Opcode */.    a
5110: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5120: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
5130: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5140: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
5150: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5160: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
5170: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
5180: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5190: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
51a0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
51b0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
51e0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
51f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5200: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
5210: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5220: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
5230: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5240: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
5270: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5280: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5290: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
52a0: 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68 65 6d 7c  ags = MEM_Ephem|
52b0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
52c0: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
52d0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
52e0: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
52f0: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
5300: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
5310: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
5320: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65  >z!=0 );.    pMe
5330: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
5340: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
5350: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5360: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
5370: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
5380: 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43  8;..    p->nResC
5390: 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32 2a 28 70  olumn = 5 - 2*(p
53a0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
53b0: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d 65 6d    p->pTos = pMem
53c0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
53d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e  LITE_OK;.    p->
53e0: 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 31 3b 0a  resOnStack = 1;.
53f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5400: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
5410: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
5420: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
5430: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
5440: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
5450: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
5460: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
5470: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
5480: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
5490: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
54a0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
54b0: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
54c0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
54d0: 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  pOp;.  if( nOp<1
54e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
54f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31   = &p->aOp[nOp-1
5500: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
5510: 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26  code==OP_Noop &&
5520: 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20   pOp->p3!=0 ){. 
5530: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5540: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
5550: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
5560: 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20  (u8*)z) ) z++;. 
5570: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
5580: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
5590: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
55a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
55b0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
55c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
55d0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
55e0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
55f0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
5600: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
5610: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5620: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
5630: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
5640: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
5650: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
5660: 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61  ( sqlite3_io_tra
5670: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
5680: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
5690: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
56a0: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
56b0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
56c0: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
56d0: 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >p3!=0 ){.    in
56e0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
56f0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
5700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
5710: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
5720: 22 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  ", pOp->p3);.   
5730: 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63   for(i=0; isspac
5740: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
5750: 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  )z[i]); i++){}. 
5760: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
5770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
5780: 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ( isspace((unsig
5790: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29  ned char)z[i]) )
57a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
57b0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
57c0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
57d0: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
57e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
57f0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
5800: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
5810: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
5820: 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72     sqlite3_io_tr
5830: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
5840: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
5850: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
5860: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
5870: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
5880: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  */.../*.** Prepa
5890: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
58a0: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
58b0: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  on.  This involv
58c0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
58d0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
58e0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
58f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
5900: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
5910: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
5920: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
5930: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
5940: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
5950: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
5960: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
5970: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
5980: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
5990: 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45  y to move a VDBE
59a0: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
59b0: 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45  _INIT to.** VDBE
59c0: 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76  _MAGIC_RUN..*/.v
59d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
59e0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
59f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5a10: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
5a20: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
5a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5a40: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
5a50: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
5a60: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
5a70: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
5a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5a90: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
5aa0: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
5ab0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5ae0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
5af0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ate */.  int isE
5b00: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5b20: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
5b30: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
5b40: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
5b50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
5b60: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  = p->db;..  asse
5b70: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
5b80: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5b90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5ba0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
5bb0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
5bc0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
5bd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
5be0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
5bf0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
5c00: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
5c10: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
5c20: 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20  n later. This.  
5c30: 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68   * is because th
5c40: 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65  e call to resize
5c50: 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20  OpArray() below 
5c60: 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20  may shrink the. 
5c70: 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72    * p->aOp[] arr
5c80: 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72  ay to save memor
5c90: 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e  y if called when
5ca0: 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   in VDBE_MAGIC_R
5cb0: 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a  UN .   * state..
5cc0: 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63     */.  p->magic
5cd0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
5ce0: 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73 74  N;..  /* No inst
5cf0: 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75 73  ruction ever pus
5d00: 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 20  hes more than a 
5d10: 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20 6f  single element o
5d20: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61  nto the.  ** sta
5d30: 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74 61  ck.  And the sta
5d40: 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20 6f  ck never grows o
5d50: 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78 65  n successive exe
5d60: 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  cutions of the. 
5d70: 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20 20   ** same loop.  
5d80: 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  So the total num
5d90: 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ber of instructi
5da0: 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72 20  ons is an upper 
5db0: 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  bound.  ** on th
5dc0: 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20  e maximum stack 
5dd0: 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e 20  depth required. 
5de0: 20 28 41 64 64 65 64 20 6c 61 74 65 72 3a 29 20   (Added later:) 
5df0: 20 54 68 65 0a 20 20 2a 2a 20 72 65 73 6f 6c 76   The.  ** resolv
5e00: 65 50 32 56 61 6c 75 65 73 28 29 20 63 61 6c 6c  eP2Values() call
5e10: 20 63 6f 6d 70 75 74 65 73 20 61 20 74 69 67 68   computes a tigh
5e20: 74 65 72 20 75 70 70 65 72 20 62 6f 75 6e 64 20  ter upper bound 
5e30: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63  on the.  ** stac
5e40: 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a  k size..  **.  *
5e50: 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c  * Allocation all
5e60: 20 74 68 65 20 73 74 61 63 6b 20 73 70 61 63 65   the stack space
5e70: 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20 6e 65   we will ever ne
5e80: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
5e90: 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20  ->aStack==0 ){. 
5ea0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
5eb0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
5ec0: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
5ed0: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
5ee0: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
5ef0: 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20 2f  nt nStack;     /
5f00: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
5f10: 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72 69 65   of stack entrie
5f20: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
5f30: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
5f40: 73 28 70 2c 20 26 6e 41 72 67 2c 20 26 6e 53 74  s(p, &nArg, &nSt
5f50: 61 63 6b 29 3b 0a 20 20 20 20 72 65 73 69 7a 65  ack);.    resize
5f60: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
5f70: 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
5f80: 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 61  nVar>=0 );.    a
5f90: 73 73 65 72 74 28 20 6e 53 74 61 63 6b 3c 70 2d  ssert( nStack<p-
5fa0: 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28 20  >nOp );.    if( 
5fb0: 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  isExplain ){.   
5fc0: 20 20 20 6e 53 74 61 63 6b 20 3d 20 31 30 3b 0a     nStack = 10;.
5fd0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 53 74      }.    p->aSt
5fe0: 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ack = sqlite3DbM
5ff0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
6000: 20 20 20 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a        nStack*siz
6010: 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d  eof(p->aStack[0]
6020: 29 20 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a  )    /* aStack *
6030: 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73  /.      + nArg*s
6040: 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20  izeof(Mem*)     
6050: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72           /* apAr
6060: 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  g */.      + nVa
6070: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20  r*sizeof(Mem)   
6080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6090: 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Var */.      + n
60a0: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
60b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
60c0: 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20   azVar */.      
60d0: 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  + nMem*sizeof(Me
60e0: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
60f0: 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20   /* aMem */.    
6100: 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65    + nCursor*size
6110: 6f 66 28 43 75 72 73 6f 72 2a 29 20 20 20 20 20  of(Cursor*)     
6120: 20 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20     /* apCsr */. 
6130: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64     );.    if( !d
6140: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6150: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
6160: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53   = &p->aStack[nS
6170: 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  tack];.      p->
6180: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20  nMem = nMem;.   
6190: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d     p->aVar = &p-
61a0: 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20  >aMem[nMem];.   
61b0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61     p->nVar = nVa
61c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61  r;.      p->okVa
61d0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
61e0: 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26  apArg = (Mem**)&
61f0: 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  p->aVar[nVar];. 
6200: 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20       p->azVar = 
6210: 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72  (char**)&p->apAr
6220: 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70  g[nArg];.      p
6230: 2d 3e 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f  ->apCsr = (Curso
6240: 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56  r**)&p->azVar[nV
6250: 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  ar];.      p->nC
6260: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
6270: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
6280: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
6290: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
62a0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
62b0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  l;.        p->aV
62c0: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
62d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
62e0: 28 6e 3d 30 3b 20 6e 3c 6e 53 74 61 63 6b 3b 20  (n=0; n<nStack; 
62f0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
6300: 3e 61 53 74 61 63 6b 5b 6e 5d 2e 64 62 20 3d 20  >aStack[n].db = 
6310: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
6320: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b  }.  }.  for(n=0;
6330: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
6340: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d  {.    p->aMem[n]
6350: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
6360: 6c 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  l;.    p->aMem[n
6370: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 0a  ].db = db;.  }..
6380: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e    p->pTos = &p->
6390: 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d  aStack[-1];.  p-
63a0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
63b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
63c0: 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20   p->uniqueCnt = 
63d0: 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65  0;.  p->returnDe
63e0: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72  pth = 0;.  p->er
63f0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
6400: 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74  bort;.  p->popSt
6410: 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65  ack =  0;.  p->e
6420: 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c  xplain |= isExpl
6430: 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ain;.  p->magic 
6440: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
6450: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
6460: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
6470: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
6480: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
6490: 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65   255;.  p->opene
64a0: 64 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  dStatement = 0;.
64b0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
64c0: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ILE.  {.    int 
64d0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
64e0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
64f0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
6500: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
6510: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
6520: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
6530: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
6540: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e  lose a cursor an
6550: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
6560: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
6570: 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a   cursor happens.
6580: 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ** to hold..*/.v
6590: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
65a0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
65b0: 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  p, Cursor *pCx){
65c0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
65d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
65e0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
65f0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
6600: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
6610: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
6620: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
6630: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
6640: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
6650: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66  x->pBt);.  }.#if
6660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6670: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6680: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
6690: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
66a0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
66b0: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
66c0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
66d0: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
66e0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
66f0: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
6700: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
6710: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
6720: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
6730: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f  (p->db);.    pMo
6740: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
6750: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  abCursor);.    s
6760: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
6770: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ->db);.    p->in
6780: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
6790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
67a0: 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70  ite3_free(pCx->p
67b0: 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
67c0: 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65  _free(pCx->aType
67d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
67e0: 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(pCx);.}../*.**
67f0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
6800: 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  rs.*/.static voi
6810: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
6820: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
6830: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
6840: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
6850: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6860: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
6870: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 6e 56 74      if( !p->inVt
6880: 61 62 4d 65 74 68 6f 64 20 7c 7c 20 28 70 2d 3e  abMethod || (p->
6890: 61 70 43 73 72 5b 69 5d 20 26 26 20 21 70 2d 3e  apCsr[i] && !p->
68a0: 61 70 43 73 72 5b 69 5d 2d 3e 70 56 74 61 62 43  apCsr[i]->pVtabC
68b0: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
68c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
68d0: 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73  ursor(p, p->apCs
68e0: 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  r[i]);.      p->
68f0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
6900: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
6910: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
6920: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
6930: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6940: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
6950: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
6960: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
6970: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
6980: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
6990: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
69a0: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
69b0: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
69c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
69d0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
69e0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
69f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6a00: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   i;.  if( p->aSt
6a10: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  ack ){.    relea
6a20: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
6a30: 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54  tack, 1 + (p->pT
6a40: 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29  os - p->aStack))
6a50: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
6a60: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
6a70: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
6a80: 72 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65  rsors(p);.  rele
6a90: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
6aa0: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
6ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
6ac0: 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29  Clear(&p->sFifo)
6ad0: 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65  ;.  if( p->conte
6ae0: 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66  xtStack ){.    f
6af0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e  or(i=0; i<p->con
6b00: 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b  textStackTop; i+
6b10: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6b20: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
6b30: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
6b40: 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d  i].sFifo);.    }
6b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6b60: 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  e(p->contextStac
6b70: 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e  k);.  }.  p->con
6b80: 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20  textStack = 0;. 
6b90: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6ba0: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
6bb0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20  contextStackTop 
6bc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
6bd0: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
6be0: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
6bf0: 30 3b 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61  0;.  p->resOnSta
6c00: 63 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck = 0;.}../*.**
6c10: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
6c20: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
6c30: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
6c40: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6c50: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
6c60: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
6c70: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
6c80: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
6c90: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
6ca0: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
6cb0: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
6cc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
6cd0: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
6ce0: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
6cf0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
6d00: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
6d10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6d20: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
6d30: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
6d40: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
6d50: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
6d60: 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65   n;..  releaseMe
6d70: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
6d80: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
6d90: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
6da0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
6db0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
6dc0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
6dd0: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
6de0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c  Column = nResCol
6df0: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
6e00: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
6e10: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
6e20: 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c  allocZero(p->db,
6e30: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
6e40: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
6e50: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6e60: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
6e70: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
6e80: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
6e90: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
6ea0: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
6eb0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
6ec0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
6ed0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6ee0: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
6ef0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
6f00: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
6f10: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
6f20: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
6f30: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
6f40: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
6f50: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
6f60: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
6f70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
6f80: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
6f90: 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53  **.** If N==P3_S
6fa0: 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20  TATIC  it means 
6fb0: 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20  that zName is a 
6fc0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e  pointer to a con
6fd0: 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20  stant static.** 
6fe0: 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61  string and we ca
6ff0: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
7000: 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69  pointer. If it i
7010: 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68  s P3_DYNAMIC, th
7020: 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e  en .** the strin
7030: 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e 67  g is freed using
7040: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
7050: 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
7060: 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a   finished with.*
7070: 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  * it. Otherwise,
7080: 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d   N bytes of zNam
7090: 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f  e are copied..*/
70a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
70b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20  SetColName(Vdbe 
70c0: 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
70d0: 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72   var, const char
70e0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b   *zName, int N){
70f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
7100: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73   *pColName;.  as
7110: 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65  sert( idx<p->nRe
7120: 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  sColumn );.  ass
7130: 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45  ert( var<COLNAME
7140: 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  _N );.  if( p->d
7150: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7160: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7170: 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28  NOMEM;.  assert(
7180: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
7190: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
71a0: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
71b0: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
71c0: 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d  umn]);.  if( N==
71d0: 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d  P3_DYNAMIC || N=
71e0: 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20  =P3_STATIC ){.  
71f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
7200: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
7210: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
7220: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7230: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7240: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
7250: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
7260: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
7270: 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f  Name, N, SQLITE_
7280: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e  UTF8,SQLITE_TRAN
7290: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66  SIENT);.  }.  if
72a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
72b0: 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43  && N==P3_DYNAMIC
72c0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
72d0: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e  ->flags = (pColN
72e0: 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d  ame->flags&(~MEM
72f0: 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79  _Static))|MEM_Dy
7300: 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  n;.    pColName-
7310: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  >xDel = 0;.  }. 
7320: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7330: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
7340: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
7350: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
7360: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
7370: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
7380: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
7390: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
73a0: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
73b0: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
73c0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
73d0: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
73e0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
73f0: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
7400: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
7410: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
7420: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
7430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
7440: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
7450: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
7460: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
7470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
7480: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
7490: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
74a0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
74b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
74c0: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
74d0: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  mmit = 0;..  /* 
74e0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
74f0: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
7500: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
7510: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
7520: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
7530: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
7540: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
7550: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
7560: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
7570: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
7580: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
7590: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
75a0: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
75b0: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
75c0: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
75d0: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
75e0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
75f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
7600: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
7610: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
7620: 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rc);.  if( rc!=S
7630: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7640: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
7650: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
7660: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
7670: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
7680: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
7690: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
76a0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
76b0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
76c0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
76d0: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
76e0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
76f0: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
7700: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
7710: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
7720: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
7730: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
7740: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
7750: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
7760: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
7770: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
7780: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
7790: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
77a0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
77b0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
77c0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
77d0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
77e0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
77f0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
7800: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65  pBt) ){.      ne
7810: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
7820: 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20       if( i!=1 ) 
7830: 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a  nTrans++;.    }.
7840: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
7850: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
7860: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
7870: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
7880: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
7890: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
78a0: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
78b0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
78c0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
78d0: 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  (db);.    rc = d
78e0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
78f0: 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
7900: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  g);.    sqlite3S
7910: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20  afetyOn(db);.   
7920: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
7930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7940: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
7950: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
7960: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
7970: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
7980: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
7990: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
79a0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
79b0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
79c0: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
79d0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
79e0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
79f0: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
7a00: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
7a10: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
7a20: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
7a30: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
7a40: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
7a50: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
7a60: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7a70: 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e  is :memory:.  In
7a80: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
7a90: 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72  .  ** not suppor
7aa0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
7ab0: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
7ac0: 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65 20 63  use the simple c
7ad0: 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f  ase then.  ** to
7ae0: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
7af0: 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42  =strlen(sqlite3B
7b00: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
7b10: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
7b20: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b   || nTrans<=1 ){
7b30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
7b40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
7b50: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
7b60: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
7b70: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
7b80: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
7b90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
7ba0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
7bb0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
7bc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
7bd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
7be0: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
7bf0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
7c00: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
7c10: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
7c20: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
7c30: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
7c40: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
7c50: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
7c60: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
7c70: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
7c80: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
7c90: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
7ca0: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
7cb0: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
7cc0: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
7cd0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
7ce0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
7cf0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
7d00: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
7d10: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
7d20: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
7d30: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
7d40: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7d50: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7d60: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
7d70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
7d80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
7d90: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
7da0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7db0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7dc0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
7dd0: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
7de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7df0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
7e00: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
7e10: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
7e20: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
7e30: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
7e40: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
7e50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
7e60: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
7e70: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
7e80: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
7e90: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
7ea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
7eb0: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
7ec0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
7ed0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
7ee0: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
7ef0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
7f00: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
7f10: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
7f20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7f30: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
7f40: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
7f50: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
7f60: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
7f70: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
7f80: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
7f90: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
7fa0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  offset = 0;..   
7fb0: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
7fc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7fd0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20   name */.    do 
7fe0: 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e 64  {.      u32 rand
7ff0: 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  om;.      sqlite
8000: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 61  .      sqlite3Ra
8020: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
8030: 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d  random), &random
8040: 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72  );.      zMaster
8050: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8060: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58  f(db, "%s-mj%08X
8070: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61  ", zMainFile, ra
8080: 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29  ndom&0x7fffffff)
8090: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
80a0: 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ster ){.        
80b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
80c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
80d0: 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33   }while( sqlite3
80e0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
80f0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
8100: 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29 3b  CCESS_EXISTS) );
8110: 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
8120: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8130: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
8140: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
8150: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
8160: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
8170: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
8180: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
8190: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
81a0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
81b0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
81c0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
81d0: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 29 3b  OURNAL, 0.    );
81e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
81f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8200: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
8210: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
8220: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
8230: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
8240: 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
8250: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
8260: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
8270: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
8280: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
8290: 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
82a0: 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
82b0: 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
82c0: 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
82d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
82e0: 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
82f0: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
8300: 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
8310: 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
8320: 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
8330: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
8340: 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
8350: 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
8360: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
8370: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
8380: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
8390: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
83a0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
83b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
83c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
83d0: 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e    if( i==1 ) con
83e0: 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f  tinue;   /* Igno
83f0: 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
8400: 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  base */.      if
8410: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
8420: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
8430: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
8440: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
8450: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
8460: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
8470: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
8480: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
8490: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
84a0: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
84b0: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
84c0: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
84d0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
84e0: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
84f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
8500: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
8510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
8520: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8530: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
8540: 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  , strlen(zFile)+
8550: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
8560: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74      offset += st
8570: 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  rlen(zFile)+1;. 
8580: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
8590: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
85a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
85b0: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
85c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
85d0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
85e0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
85f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8600: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8610: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8620: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
8630: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a        }.    }...
8640: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
8650: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8660: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 7a 4d 61 69  ile. */.    zMai
8670: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
8680: 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64  treeGetDirname(d
8690: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
86a0: 20 20 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e      if( (needSyn
86b0: 63 20 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73  c .     && (rc=s
86c0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
86d0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
86e0: 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49  C_NORMAL))!=SQLI
86f0: 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
8700: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
8710: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
8720: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
8730: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
8740: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8750: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8760: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8770: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
8780: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
8790: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
87a0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
87b0: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
87c0: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
87d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
87e0: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
87f0: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
8800: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
8810: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8820: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
8830: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
8840: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
8850: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
8860: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
8870: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
8880: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
8890: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
88a0: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
88b0: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
88c0: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
88d0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
88e0: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
88f0: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
8900: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
8910: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
8920: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8930: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
8940: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
8950: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
8960: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
8970: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
8980: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
8990: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
89a0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
89b0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
89c0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
89d0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
89e0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
89f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
8a00: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
8a10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8a20: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
8a30: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
8a40: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
8a50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
8a60: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
8a70: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8a80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8a90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8aa0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
8ab0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8ac0: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
8ad0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8ae0: 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
8af0: 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
8b00: 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
8b10: 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
8b20: 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
8b30: 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
8b40: 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
8b50: 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
8b60: 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
8b70: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
8b80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8b90: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
8ba0: 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
8bb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
8bc0: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
8bd0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
8be0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
8bf0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
8c00: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
8c10: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
8c20: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
8c30: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
8c40: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
8c50: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
8c60: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8c70: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
8c80: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
8c90: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
8ca0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
8cb0: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
8cc0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8cd0: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
8ce0: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
8cf0: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
8d00: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
8d10: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
8d20: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
8d30: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
8d40: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
8d50: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
8d60: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
8d70: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
8d80: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
8d90: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
8da0: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
8db0: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
8dc0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
8dd0: 72 73 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rs();.    for(i=
8de0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
8df0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
8e00: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8e10: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8e20: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
8e30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8e40: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
8e50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8e60: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
8e70: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
8e80: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
8e90: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
8ea0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
8eb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
8ec0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
8ed0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
8ee0: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
8ef0: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
8f00: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
8f10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
8f20: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
8f30: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
8f40: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
8f50: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
8f60: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
8f70: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
8f80: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
8f90: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
8fa0: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
8fb0: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
8fc0: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
8fd0: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
8fe0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
8ff0: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
9000: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
9010: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9020: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
9030: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
9040: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
9050: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
9060: 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  t = 0;.  p = db-
9070: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
9080: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
9090: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
90a0: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
90b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
90c0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
90d0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
90e0: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
90f0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
9100: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
9110: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
9120: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
9130: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72  ./*.** Find ever
9140: 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65  y active VM othe
9150: 72 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64  r than pVdbe and
9160: 20 63 68 61 6e 67 65 20 69 74 73 20 73 74 61 74   change its stat
9170: 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64  us to.** aborted
9180: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
9190: 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73  when one VM caus
91a0: 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75  es a rollback du
91b0: 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f  e to an.** ON CO
91c0: 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20  NFLICT ROLLBACK 
91d0: 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d  clause (for exam
91e0: 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72  ple).  The other
91f0: 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20   VMs must be.** 
9200: 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20  aborted so that 
9210: 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65  they do not have
9220: 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74   data rolled out
9230: 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68   from underneath
9240: 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67  .** them leading
9250: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a   to a segfault..
9260: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9270: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
9280: 64 62 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  dbes(sqlite3 *db
9290: 2c 20 56 64 62 65 20 2a 70 45 78 63 65 70 74 29  , Vdbe *pExcept)
92a0: 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72  {.  Vdbe *pOther
92b0: 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 64  ;.  for(pOther=d
92c0: 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72  b->pVdbe; pOther
92d0: 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d  ; pOther=pOther-
92e0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
92f0: 20 70 4f 74 68 65 72 3d 3d 70 45 78 63 65 70 74   pOther==pExcept
9300: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9310: 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67   if( pOther->mag
9320: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
9330: 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63  UN || pOther->pc
9340: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
9350: 20 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64     checkActiveVd
9360: 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20 20 63  beCnt(db);.    c
9370: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
9380: 4f 74 68 65 72 29 3b 0a 20 20 20 20 63 68 65 63  Other);.    chec
9390: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
93a0: 62 29 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  b);.    pOther->
93b0: 61 62 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 7d  aborted = 1;.  }
93c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
93d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
93e0: 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
93f0: 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
9400: 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
9410: 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
9420: 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
9430: 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
9440: 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
9450: 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
9460: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
9470: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
9480: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
9490: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
94a0: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
94b0: 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
94c0: 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
94d0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
94e0: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
94f0: 48 41 4c 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  HALT..**.** Retu
9500: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
9510: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
9520: 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
9530: 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
9540: 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
9550: 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
9560: 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
9570: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
9580: 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
9590: 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
95a0: 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
95b0: 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
95c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
95d0: 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
95e0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
95f0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
9600: 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e   i;.  int (*xFun
9610: 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d  c)(Btree *pBt) =
9620: 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e   0;  /* Function
9630: 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68   to call on each
9640: 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a   btree backend *
9650: 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69 61  /.  int isSpecia
9660: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
9670: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
9680: 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e if SQLITE_NOME
9690: 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20  M or IOERR */.. 
96a0: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
96b0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
96c0: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
96d0: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
96e0: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
96f0: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
9700: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
9710: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
9720: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
9730: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
9740: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
9750: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ne. .  **.  ** S
9760: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 3a 0a 20  pecial errors:. 
9770: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20   **.  **     If 
9780: 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  an SQLITE_NOMEM 
9790: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
97a0: 64 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  d in a statement
97b0: 20 74 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a   that writes to.
97c0: 20 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74    **     the dat
97d0: 61 62 61 73 65 2c 20 74 68 65 6e 20 65 69 74 68  abase, then eith
97e0: 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  er a statement o
97f0: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  r transaction mu
9800: 73 74 20 62 65 20 72 6f 6c 6c 65 64 0a 20 20 2a  st be rolled.  *
9810: 2a 20 20 20 20 20 62 61 63 6b 20 74 6f 20 65 6e  *     back to en
9820: 73 75 72 65 20 74 68 65 20 74 72 65 65 2d 73 74  sure the tree-st
9830: 72 75 63 74 75 72 65 73 20 61 72 65 20 69 6e 20  ructures are in 
9840: 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
9850: 74 65 2e 20 41 0a 20 20 2a 2a 20 20 20 20 20 73  te. A.  **     s
9860: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
9870: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
9880: 61 63 6b 20 69 66 20 6f 6e 65 20 69 73 20 6f 70  ack if one is op
9890: 65 6e 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68  en, otherwise th
98a0: 65 0a 20 20 2a 2a 20 20 20 20 20 65 6e 74 69 72  e.  **     entir
98b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
98c0: 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
98d0: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k..  **.  **    
98e0: 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f   If an SQLITE_IO
98f0: 45 52 52 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ERR error has oc
9900: 63 75 72 65 64 20 69 6e 20 61 20 73 74 61 74 65  cured in a state
9910: 6d 65 6e 74 20 74 68 61 74 20 77 72 69 74 65 73  ment that writes
9920: 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68 65   to.  **     the
9930: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
9940: 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
9950: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
9960: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 65 0a  olled back. The.
9970: 20 20 2a 2a 20 20 20 20 20 49 2f 4f 20 65 72 72    **     I/O err
9980: 6f 72 20 6d 61 79 20 68 61 76 65 20 63 61 75 73  or may have caus
9990: 65 64 20 67 61 72 62 61 67 65 20 74 6f 20 62 65  ed garbage to be
99a0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
99b0: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 20 20  journal .  **   
99c0: 20 20 66 69 6c 65 2e 20 57 65 72 65 20 74 68 65    file. Were the
99d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
99e0: 63 6f 6e 74 69 6e 75 65 20 61 6e 64 20 65 76 65  continue and eve
99f0: 6e 74 75 61 6c 6c 79 20 62 65 20 72 6f 6c 6c 65  ntually be rolle
9a00: 64 20 0a 20 20 2a 2a 20 20 20 20 20 62 61 63 6b  d .  **     back
9a10: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 6d 69   that garbage mi
9a20: 67 68 74 20 65 6e 64 20 75 70 20 69 6e 20 74 68  ght end up in th
9a30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9a40: 0a 20 20 2a 2a 20 20 20 20 20 0a 20 20 2a 2a 20  .  **     .  ** 
9a50: 20 20 20 20 49 6e 20 62 6f 74 68 20 6f 66 20 74      In both of t
9a60: 68 65 20 61 62 6f 76 65 20 63 61 73 65 73 2c 20  he above cases, 
9a70: 74 68 65 20 56 64 62 65 2e 65 72 72 6f 72 41 63  the Vdbe.errorAc
9a80: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
9a90: 20 0a 20 20 2a 2a 20 20 20 20 20 69 67 6e 6f 72   .  **     ignor
9aa0: 65 64 2e 20 49 66 20 74 68 65 20 73 71 6c 69 74  ed. If the sqlit
9ab0: 65 33 2e 61 75 74 6f 43 6f 6d 6d 69 74 20 66 6c  e3.autoCommit fl
9ac0: 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ag is false and 
9ad0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  a transaction.  
9ae0: 2a 2a 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64  **     is rolled
9af0: 20 62 61 63 6b 2c 20 69 74 20 77 69 6c 6c 20 62   back, it will b
9b00: 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 20  e set to true.. 
9b10: 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 20 65   **.  ** Other e
9b20: 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors:.  **.  **
9b30: 20 4e 6f 20 65 72 72 6f 72 3a 0a 20 20 2a 2a 0a   No error:.  **.
9b40: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
9b50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b60: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
9b70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9b80: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
9b90: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
9ba0: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ){.    /* Alread
9bb0: 79 20 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69  y halted.  Nothi
9bc0: 6e 67 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20  ng to do. */.   
9bd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
9be0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
9bf0: 4c 54 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  LT );.#ifndef SQ
9c00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9c10: 4c 54 41 42 4c 45 0a 20 20 20 20 63 6c 6f 73 65  LTABLE.    close
9c20: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 23  AllCursors(p);.#
9c30: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
9c40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9c50: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
9c60: 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74  s(p);.  checkAct
9c70: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
9c80: 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
9c90: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
9ca0: 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
9cb0: 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
9cc0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
9cd0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  0 ){.    int mrc
9ce0: 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
9cf0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
9d00: 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 2f 2a 20 43  ->rc */.    /* C
9d10: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
9d20: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
9d30: 72 73 20 2d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rs - SQLITE_NOME
9d40: 4d 20 6f 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  M or SQLITE_IOER
9d50: 52 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  R */.    mrc = p
9d60: 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
9d70: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
9d80: 3d 20 28 0a 20 20 20 20 20 20 20 20 28 6d 72 63  = (.        (mrc
9d90: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
9da0: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
9db0: 45 52 52 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  ERR || mrc==SQLI
9dc0: 54 45 5f 49 4e 54 45 52 52 55 50 54 29 3f 31 3a  TE_INTERRUPT)?1:
9dd0: 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  0);.    if( isSp
9de0: 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
9df0: 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70      /* This loop
9e00: 20 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61   does static ana
9e10: 6c 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65  lysis of the que
9e20: 72 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20  ry to see which 
9e30: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
9e40: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
9e50: 63 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61  categories it fa
9e60: 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20  lls into:.      
9e70: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
9e80: 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20  Read-only.      
9e90: 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74  **     Query wit
9ea0: 68 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  h statement jour
9eb0: 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nal.      **    
9ec0: 20 51 75 65 72 79 20 77 69 74 68 6f 75 74 20 73   Query without s
9ed0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9ee0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
9ef0: 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73  ** We could do s
9f00: 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c  omething more el
9f10: 65 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20  egant than this 
9f20: 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20  static analysis 
9f30: 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73  (i.e..      ** s
9f40: 74 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f 66  tore the type of
9f50: 20 71 75 65 72 79 20 61 73 20 70 61 72 74 20 6f   query as part o
9f60: 66 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f  f the compliatio
9f70: 6e 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20  n phase), but . 
9f80: 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67       ** handling
9f90: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
9fa0: 66 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69  failure is a fai
9fb0: 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65  rly obscure edge
9fc0: 20 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20   case so .      
9fd0: 2a 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62 61  ** this is proba
9fe0: 62 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f  bly easier. Todo
9ff0: 3a 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70  : Might be an op
a000: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64  portunity to red
a010: 75 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  uce .      ** co
a020: 64 65 20 73 69 7a 65 20 61 20 76 65 72 79 20 73  de size a very s
a030: 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75  mall amount thou
a040: 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gh....      */. 
a050: 20 20 20 20 20 69 6e 74 20 69 73 52 65 61 64 4f       int isReadO
a060: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nly = 1;.      i
a070: 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d  nt isStatement =
a080: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
a090: 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f  (p->aOp || p->nO
a0a0: 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p==0);.      for
a0b0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
a0c0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73  i++){ .        s
a0d0: 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d  witch( p->aOp[i]
a0e0: 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  .opcode ){.     
a0f0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
a100: 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20  nsaction:.      
a110: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
a120: 20 61 20 62 69 74 20 73 74 72 61 6e 67 65 2e 20   a bit strange. 
a130: 49 66 20 77 65 20 68 69 74 20 61 20 6d 61 6c 6c  If we hit a mall
a140: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
a150: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20   and.           
a160: 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
a170: 74 20 64 69 64 20 6e 6f 74 20 6f 70 65 6e 20 61  t did not open a
a180: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
a190: 61 63 74 69 6f 6e 2c 20 77 65 20 77 69 6c 6c 0a  action, we will.
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
a1b0: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
a1c0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
a1d0: 6e 64 20 61 62 6f 72 74 20 61 6c 6c 20 6f 74 68  nd abort all oth
a1e0: 65 72 20 61 63 74 69 76 65 0a 20 20 20 20 20 20  er active.      
a1f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
a200: 6e 74 73 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  nts. Or, if this
a210: 20 69 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e   is an SQLITE_IN
a220: 54 45 52 52 55 50 54 20 65 72 72 6f 72 2c 20 77  TERRUPT error, w
a230: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
a240: 20 77 69 6c 6c 20 6f 6e 6c 79 20 72 6f 6c 6c 62   will only rollb
a250: 61 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72  ack if the inter
a260: 72 75 70 74 65 64 20 73 74 61 74 65 6d 65 6e 74  rupted statement
a270: 20 77 61 73 20 61 20 77 72 69 74 65 2e 0a 20 20   was a write..  
a280: 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
a290: 20 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 63           ** It c
a2a0: 6f 75 6c 64 20 62 65 20 61 72 67 75 65 64 20 74  ould be argued t
a2b0: 68 61 74 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74  hat read-only st
a2c0: 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  atements should 
a2d0: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20  never.          
a2e0: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 61 6e    ** rollback an
a2f0: 79 74 68 69 6e 67 2e 20 42 75 74 20 63 61 72 65  ything. But care
a300: 66 75 6c 20 61 6e 61 6c 79 73 69 73 20 69 73 20  ful analysis is 
a310: 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a  required before.
a320: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
a330: 61 6b 69 6e 67 20 74 68 69 73 20 63 68 61 6e 67  aking this chang
a340: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  e.            */
a350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a360: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 20 7c 7c   p->aOp[i].p2 ||
a370: 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
a380: 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
a390: 20 20 20 20 20 20 20 20 69 73 52 65 61 64 4f 6e          isReadOn
a3a0: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
a3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a3d0: 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61 74 65     case OP_State
a3e0: 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ment:.          
a3f0: 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20    isStatement = 
a400: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
a410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
a420: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
a430: 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
a440: 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20   was read-only, 
a450: 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f  we need do no ro
a460: 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f  llback at all. O
a470: 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
a480: 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  ** proceed with 
a490: 74 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  the special hand
a4a0: 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ling..      */. 
a4b0: 20 20 20 20 20 69 66 28 20 21 69 73 52 65 61 64       if( !isRead
a4c0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
a4d0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a4e0: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
a4f0: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
a500: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
a510: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a520: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
a530: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
a540: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
a550: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20       } else if( 
a560: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
a570: 4d 45 4d 20 26 26 20 69 73 53 74 61 74 65 6d 65  MEM && isStateme
a580: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
a590: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
a5a0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
a5b0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a5c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
a5d0: 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
a5e0: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
a5f0: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
a600: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
a610: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
a620: 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
a630: 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
a640: 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
a650: 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
a660: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a670: 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f     sqlite3AbortO
a680: 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28  therActiveVdbes(
a690: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
a6a0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
a6b0: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
a6c0: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
a6d0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
a6e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
a6f0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
a700: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
a710: 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
a720: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
a730: 74 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a  tive vdbe, then.
a740: 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74      ** we do eit
a750: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
a760: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
a770: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
a780: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
a790: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
a7a0: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
a7b0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
a7c0: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
a7d0: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
a7e0: 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a  e has occured. .
a7f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
a800: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26  b->autoCommit &&
a810: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
a820: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  nt==1 ){.      i
a830: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
a840: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
a850: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
a860: 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
a870: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  or) ){.        /
a880: 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
a890: 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
a8a0: 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72 6f  and the vdbe pro
a8b0: 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20  gram was .      
a8c0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
a8d0: 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
a8e0: 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  IL' constraint. 
a8f0: 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
a900: 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mit .        ** 
a910: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
a920: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a930: 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d  int rc = vdbeCom
a940: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20  mit(db);.       
a950: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a960: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
a970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a980: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
a990: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
a9a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a9b0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
a9c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a9d0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
a9e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a9f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aa00: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
aa10: 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
aa20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
aa30: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
aa40: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
aa50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
aa60: 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20  else if( !xFunc 
aa70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
aa80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
aa90: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
aaa0: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
aab0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65      if( p->opene
aac0: 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  dStatement ){.  
aad0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
aae0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
aaf0: 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  itStmt;.        
ab00: 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  } .      }else i
ab10: 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
ab20: 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
ab30: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
ab40: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
ab50: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d  ackStmt;.      }
ab60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ab70: 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41  lite3AbortOtherA
ab80: 63 74 69 76 65 56 64 62 65 73 28 64 62 2c 20 70  ctiveVdbes(db, p
ab90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
aba0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
abb0: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
abc0: 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
abd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
abe0: 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63 20      /* If xFunc 
abf0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
ac00: 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 73  n it is one of s
ac10: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
ac20: 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20 2a  ackStmt or.    *
ac30: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
ac40: 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69  mmitStmt. Call i
ac50: 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 62  t once on each b
ac60: 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72  ackend. If an er
ac70: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20 2a  ror occurs.    *
ac80: 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  * and the return
ac90: 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20 53   code is still S
aca0: 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68  QLITE_OK, set th
acb0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
acc0: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
acd0: 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20 20  error value..   
ace0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21   */.    assert(!
acf0: 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20 78  xFunc ||.      x
ad00: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
ad10: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a  eeCommitStmt ||.
ad20: 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c        xFunc==sql
ad30: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
ad40: 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  kStmt.    );.   
ad50: 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20   for(i=0; xFunc 
ad60: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
ad70: 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
ad80: 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  c;.      Btree *
ad90: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ada0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
adb0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
adc0: 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a  c = xFunc(pBt);.
add0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26          if( rc &
ade0: 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  & (p->rc==SQLITE
adf0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
ae00: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  LITE_CONSTRAINT)
ae10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
ae20: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
ae30: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
ae40: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
ae50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
ae60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ae70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
ae80: 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
ae90: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
aea0: 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  and the statemen
aeb0: 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  t was committed,
aec0: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
aed0: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
aee0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
aef0: 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
af00: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
af10: 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63 20       if( !xFunc 
af20: 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65  || xFunc==sqlite
af30: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
af40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
af50: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
af60: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
af70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
af80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
af90: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
afa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
afb0: 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
afc0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
afd0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20   /* Rollback or 
afe0: 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d  commit any schem
aff0: 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f  a changes that o
b000: 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20  ccurred. */.    
b010: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
b020: 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67  E_OK && db->flag
b030: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
b040: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20  hanges ){.      
b050: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
b060: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
b070: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  );.      db->fla
b080: 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  gs = (db->flags 
b090: 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  | SQLITE_InternC
b0a0: 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 20  hanges);.    }. 
b0b0: 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
b0c0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
b0d0: 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
b0e0: 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
b0f0: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
b100: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
b110: 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
b120: 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70  beCnt--;.  }.  p
b130: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
b140: 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
b150: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
b160: 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  db);..  return S
b170: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b180: 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
b190: 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
b1a0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
b1b0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
b1c0: 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
b1d0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
b1e0: 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
b1f0: 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
b200: 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
b210: 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
b220: 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
b230: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
b240: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b250: 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
b260: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
b270: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
b280: 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
b290: 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
b2a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
b2b0: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
b2c0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
b2d0: 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
b2e0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
b2f0: 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
b300: 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
b310: 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
b320: 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
b330: 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
b340: 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
b350: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
b360: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
b370: 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
b380: 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
b390: 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
b3a0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
b3b0: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
b3c0: 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
b3d0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
b3e0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
b3f0: 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
b400: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
b410: 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
b420: 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
b430: 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
b440: 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
b450: 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
b460: 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
b470: 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
b480: 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
b490: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
b4a0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
b4b0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
b4c0: 65 48 61 6c 74 28 70 29 3b 0a 20 20 73 71 6c 69  eHalt(p);.  sqli
b4d0: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
b4e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
b4f0: 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
b500: 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
b510: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
b520: 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
b530: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
b540: 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
b550: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
b560: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
b570: 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
b580: 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
b590: 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
b5a0: 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
b5b0: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
b5c0: 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
b5d0: 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
b5e0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
b5f0: 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
b600: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
b610: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
b620: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
b630: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
b640: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
b650: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d  etStr(db->pErr,-
b660: 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c  1,p->zErrMsg,SQL
b670: 49 54 45 5f 55 54 46 38 2c 73 71 6c 69 74 65 33  ITE_UTF8,sqlite3
b680: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 64 62  _free);.      db
b690: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72  ->errCode = p->r
b6a0: 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  c;.      p->zErr
b6b0: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
b6c0: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
b6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b6e0: 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
b6f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b700: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
b710: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
b720: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
b730: 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
b740: 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
b750: 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
b760: 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
b770: 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
b780: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
b790: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
b7a0: 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
b7b0: 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
b7c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
b7d0: 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
b7e0: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
b7f0: 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
b800: 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
b810: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
b820: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
b830: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
b840: 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
b850: 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
b860: 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
b870: 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
b880: 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
b890: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
b8a0: 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54  .  assert( p->pT
b8c0: 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d  os<&p->aStack[p-
b8d0: 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20 7c  >pc<0?0:p->pc] |
b8e0: 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29 3b 0a  | !p->aStack );.
b8f0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
b900: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
b910: 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
b920: 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
b930: 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
b940: 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
b950: 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
b960: 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
b970: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b980: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
b990: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
b9a0: 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
b9b0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
b9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
b9d0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
b9e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
b9f0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
ba00: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
ba10: 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c  (out, "%6d %10ll
ba20: 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20  d %8lld ",.     
ba30: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
ba40: 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
ba50: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
ba60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
ba70: 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
ba80: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
ba90: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
baa0: 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
bab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bac0: 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
bad0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
bae0: 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
baf0: 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
bb00: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61  }.#endif.  p->ma
bb10: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
bb20: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72  _INIT;.  p->abor
bb30: 74 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ted = 0;.  retur
bb40: 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
bb50: 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
bb60: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
bb70: 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
bb80: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
bb90: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
bba0: 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
bbb0: 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
bbc0: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
bbd0: 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
bbe0: 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
bbf0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
bc00: 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
bc10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bc20: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
bc30: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
bc40: 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
bc50: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
bc60: 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
bc70: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
bc80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
bc90: 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
bca0: 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65  ask)==rc );.  }e
bcb0: 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  lse if( p->magic
bcc0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  !=VDBE_MAGIC_INI
bcd0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
bce0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
bcf0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
bd00: 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
bd10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bd20: 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75   Call the destru
bd30: 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75  ctor for each au
bd40: 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70  xdata entry in p
bd50: 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69  VdbeFunc for whi
bd60: 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  ch.** the corres
bd70: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d  ponding bit in m
bd80: 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41  ask is clear.  A
bd90: 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62  uxdata entries b
bda0: 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20  eyond 31.** are 
bdb0: 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64  always destroyed
bdc0: 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c  .  To destroy al
bdd0: 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65  l auxdata entrie
bde0: 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  s, call this.** 
bdf0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73  routine with mas
be00: 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  k==0..*/.void sq
be10: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
be20: 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20  uxData(VdbeFunc 
be30: 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20  *pVdbeFunc, int 
be40: 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  mask){.  int i;.
be50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64    for(i=0; i<pVd
be60: 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b  beFunc->nAux; i+
be70: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41  +){.    struct A
be80: 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26  uxData *pAux = &
be90: 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78  pVdbeFunc->apAux
bea0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e  [i];.    if( (i>
beb0: 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c  31 || !(mask&(1<
bec0: 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
bed0: 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
bee0: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
bef0: 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
bf00: 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
bf10: 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
bf20: 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
bf30: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
bf40: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
bf50: 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
bf60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
bf70: 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
bf80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
bf90: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
bfa0: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69   Cleanup(p);.  i
bfb0: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
bfc0: 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
bfd0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
bfe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
bff0: 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65  rt( p->db->pVdbe
c000: 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62  ==p );.    p->db
c010: 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
c020: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
c030: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
c040: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
c050: 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
c060: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
c070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c080: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
c090: 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61   Op *pOp = &p->a
c0a0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72 65  Op[i];.      fre
c0b0: 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c  eP3(pOp->p3type,
c0c0: 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7d   pOp->p3);.    }
c0d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c0e0: 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20  e(p->aOp);.  }. 
c0f0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c100: 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
c110: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
c120: 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  ee(p->aLabel);. 
c130: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
c140: 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c 65  >aStack);.  rele
c150: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
c160: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
c170: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c180: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c190: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
c1a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c1b0: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61  ->zSql);.  p->ma
c1c0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
c1d0: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33  _DEAD;.  sqlite3
c1e0: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
c1f0: 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
c200: 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
c210: 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
c220: 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
c230: 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
c240: 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  now.  Return an 
c250: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
c260: 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e  no MoveTo is pen
c270: 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f  ding, this.** ro
c280: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69  utine does nothi
c290: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  ng and returns S
c2a0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
c2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
c2c0: 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20  orMoveto(Cursor 
c2d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
c2e0: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
c2f0: 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b      int res, rc;
c300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
c310: 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69  EST.    extern i
c320: 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
c330: 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a  h_count;.#endif.
c340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
c350: 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63  sTable );.    rc
c360: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
c370: 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72  oveto(p->pCursor
c380: 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
c390: 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
c3a0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
c3b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e  urn rc;.    *p->
c3c0: 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20  pIncrKey = 0;.  
c3d0: 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d    p->lastRowid =
c3e0: 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76   keyToInt(p->mov
c3f0: 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20  etoTarget);.    
c400: 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
c410: 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66  = res==0;.    if
c420: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
c430: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c440: 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f  eeNext(p->pCurso
c450: 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
c460: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c470: 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  rc;.    }.#ifdef
c480: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
c490: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
c4a0: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
c4b0: 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d      p->deferredM
c4c0: 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
c4d0: 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
c4e0: 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
c4f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c500: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
c510: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
c520: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
c530: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
c540: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
c550: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
c560: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
c570: 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a  eSerialRead().**
c580: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c590: 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
c5a0: 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74  e3VdbeSerialWrit
c5b0: 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  e().**.** encaps
c5c0: 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
c5d0: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
c5e0: 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
c5f0: 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
c600: 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
c610: 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
c620: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
c630: 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
c640: 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
c650: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
c660: 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
c670: 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
c680: 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
c690: 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
c6a0: 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
c6b0: 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
c6c0: 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
c6d0: 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
c6e0: 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
c6f0: 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
c700: 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
c710: 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
c720: 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
c730: 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
c740: 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
c750: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
c760: 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
c770: 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
c780: 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
c790: 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
c7a0: 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
c7b0: 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
c7c0: 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
c7d0: 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
c7e0: 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
c7f0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
c800: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
c810: 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
c820: 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
c830: 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
c840: 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
c850: 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
c860: 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
c880: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
c890: 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
c8a0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
c8d0: 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
c900: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
c910: 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
c930: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
c940: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
c950: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
c960: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
c970: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
c980: 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
c9b0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
c9c0: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
c9e0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
c9f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
ca00: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
ca10: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
ca20: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
ca30: 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
ca60: 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
ca70: 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
ca80: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
ca90: 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
caa0: 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
cad0: 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
cae0: 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
cb10: 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
cb20: 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
cb30: 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
cb40: 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
cb50: 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
cb60: 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
cb70: 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
cb80: 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
cb90: 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
cba0: 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
cbb0: 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
cbc0: 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
cbd0: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
cbe0: 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
cbf0: 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
cc00: 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
cc10: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
cc20: 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
cc30: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
cc40: 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
cc50: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
cc60: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
cc70: 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
cc80: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
cc90: 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
cca0: 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
ccb0: 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
ccc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ccd0: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
cce0: 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
ccf0: 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
cd00: 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
cd10: 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
cd20: 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
cd30: 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
cd40: 30 30 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31  00001000)<<32)-1
cd50: 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
cd60: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
cd70: 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   u;.    if( file
cd80: 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69  _format>=4 && (i
cd90: 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  &1)==i ){.      
cda0: 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20  return 8+i;.    
cdb0: 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20  }.    u = i<0 ? 
cdc0: 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20  -i : i;.    if( 
cdd0: 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
cde0: 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
cdf0: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
ce00: 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
ce10: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
ce20: 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
ce30: 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
ce40: 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
ce50: 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
ce60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
ce70: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
ce80: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
ce90: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
cea0: 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d  assert( flags&(M
ceb0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
cec0: 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e   );.  n = pMem->
ced0: 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
cee0: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
cef0: 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b   n += pMem->u.i;
cf00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
cf10: 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
cf20: 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
cf30: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
cf40: 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
cf50: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
cf60: 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
cf70: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
cf80: 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
cf90: 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -type..*/.int sq
cfa0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
cfb0: 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
cfc0: 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
cfd0: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
cfe0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
cff0: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
d000: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
d010: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
d020: 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
d030: 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
d040: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
d050: 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
d060: 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
d070: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
d080: 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
d090: 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
d0a0: 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
d0b0: 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
d0c0: 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
d0d0: 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
d0e0: 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
d0f0: 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
d100: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
d110: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
d120: 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
d130: 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
d140: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
d150: 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
d160: 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
d170: 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
d180: 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
d190: 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
d1a0: 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
d1b0: 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
d1c0: 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
d1d0: 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
d1e0: 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
d1f0: 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
d200: 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
d210: 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
d220: 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
d230: 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
d240: 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
d250: 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
d260: 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
d270: 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
d280: 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
d290: 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
d2a0: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
d2b0: 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
d2c0: 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
d2d0: 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
d2e0: 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
d2f0: 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
d300: 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
d310: 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
d320: 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
d330: 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
d340: 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
d350: 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
d360: 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
d370: 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
d380: 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
d390: 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
d3a0: 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
d3b0: 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
d3c0: 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
d3d0: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
d3e0: 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
d3f0: 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
d400: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
d410: 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
d420: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d430: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
d440: 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
d450: 20 64 6f 75 62 6c 65 20 66 6c 6f 61 74 53 77 61   double floatSwa
d460: 70 28 64 6f 75 62 6c 65 20 69 6e 29 7b 0a 20 20  p(double in){.  
d470: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 64 6f 75 62  union {.    doub
d480: 6c 65 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  le r;.    u32 i[
d490: 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
d4a0: 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
d4b0: 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
d4c0: 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
d4d0: 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
d4e0: 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
d4f0: 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
d500: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
d510: 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
d520: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
d530: 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
d540: 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
d550: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
d560: 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
d570: 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
d580: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
d590: 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
d5a0: 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
d5b0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
d5c0: 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
d5d0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
d5e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
d5f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
d600: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
d610: 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
d620: 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
d630: 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
d640: 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
d650: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
d660: 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
d670: 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
d680: 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
d690: 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
d6a0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
d6b0: 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
d6c0: 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
d6d0: 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
d6e0: 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
d6f0: 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
d700: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
d710: 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
d720: 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
d730: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
d740: 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
d750: 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
d760: 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
d770: 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
d780: 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
d790: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
d7a0: 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
d7b0: 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
d7c0: 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
d7d0: 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
d7e0: 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
d7f0: 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
d800: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
d810: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
d820: 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
d830: 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
d840: 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
d850: 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
d860: 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
d870: 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
d880: 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
d890: 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
d8a0: 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
d8b0: 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  ]..*/ .int sqlit
d8c0: 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
d8d0: 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
d8e0: 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
d8f0: 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
d900: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
d910: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
d920: 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
d930: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
d940: 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  int len;..  /* I
d950: 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
d960: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
d970: 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
d980: 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
d990: 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69  u64 v;.    int i
d9a0: 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
d9b0: 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
d9c0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
d9d0: 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
d9e0: 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 73 77  ->r) );.      sw
d9f0: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
da00: 61 74 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  at(pMem->r);.   
da10: 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
da20: 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
da30: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
da40: 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
da50: 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
da60: 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
da70: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
da80: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
da90: 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d     assert( len<=
daa0: 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c  nBuf );.    whil
dab0: 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
dac0: 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46  buf[i] = (v&0xFF
dad0: 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
dae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
daf0: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
db00: 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
db10: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
db20: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
db30: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
db40: 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
db50: 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
db60: 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20 20  m->u.i:0).      
db70: 20 20 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65         == sqlite
db80: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
db90: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
dba0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
dbb0: 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a  Mem->n<=nBuf );.
dbc0: 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
dbd0: 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75  n;.    memcpy(bu
dbe0: 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
dbf0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
dc00: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
dc10: 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d   ){.      len +=
dc20: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
dc30: 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29    if( len>nBuf )
dc40: 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
dc50: 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nBuf;.      }.  
dc60: 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b      memset(&buf[
dc70: 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e  pMem->n], 0, len
dc80: 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d  -pMem->n);.    }
dc90: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
dca0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
dcb0: 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
dcc0: 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
dcd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  0;.}../*.** Dese
dce0: 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
dcf0: 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
dd00: 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
dd10: 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
dd20: 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
dd30: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
dd40: 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
dd50: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
dd60: 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  read..*/ .int sq
dd70: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
dd80: 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
dd90: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
dda0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
ddb0: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
ddc0: 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
ddd0: 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
dde0: 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
ddf0: 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
de00: 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
de10: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
de20: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
de30: 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
de40: 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
de50: 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
de60: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
de70: 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
de80: 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
de90: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
dea0: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
deb0: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
dec0: 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
ded0: 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
dee0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
def0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
df00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
df10: 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
df20: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
df30: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
df40: 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
df50: 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
df60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
df70: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
df80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
df90: 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
dfa0: 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
dfb0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
dfc0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
dfd0: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
dfe0: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
dff0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
e000: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e010: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
e020: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
e030: 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
e040: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
e050: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e060: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
e070: 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
e080: 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
e090: 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
e0a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e0b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
e0c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e0d0: 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
e0e0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e0f0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
e100: 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
e110: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
e120: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
e130: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
e140: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e150: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e160: 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
e170: 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
e180: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e190: 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
e1a0: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
e1b0: 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
e1c0: 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
e1d0: 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
e1e0: 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
e1f0: 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
e200: 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
e210: 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
e220: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
e230: 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
e240: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e250: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e260: 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
e270: 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
e280: 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
e290: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
e2a0: 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
e2b0: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
e2c0: 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a  */.      u64 x;.
e2d0: 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66        u32 y;.#if
e2e0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
e2f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
e300: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
e310: 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
e320: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
e330: 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
e340: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
e350: 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
e360: 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64       ** byte ord
e370: 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
e380: 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
e390: 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
e3a0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66   is.      ** def
e3b0: 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
e3c0: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
e3d0: 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
e3e0: 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a  e mixed.      **
e3f0: 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a   endian..      *
e400: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
e410: 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
e420: 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
e430: 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69  <32;.      stati
e440: 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
e450: 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 64  1 = 1.0;.      d
e460: 6f 75 62 6c 65 20 72 32 20 3d 20 72 31 3b 0a 20  ouble r2 = r1;. 
e470: 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
e480: 64 69 61 6e 46 6c 6f 61 74 28 72 32 29 3b 0a 20  dianFloat(r2);. 
e490: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
e4a0: 65 6f 66 28 72 32 29 3d 3d 73 69 7a 65 6f 66 28  eof(r2)==sizeof(
e4b0: 74 31 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t1) && memcmp(&r
e4c0: 32 2c 20 26 74 31 2c 20 73 69 7a 65 6f 66 28 72  2, &t1, sizeof(r
e4d0: 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
e4e0: 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
e4f0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
e500: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
e510: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
e520: 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
e530: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
e540: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
e550: 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
e560: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
e570: 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
e580: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
e590: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  .        pMem->u
e5a0: 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
e5b0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
e5c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e5d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e5e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e5f0: 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
e600: 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29  of(pMem->r)==8 )
e610: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
e620: 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73  (&pMem->r, &x, s
e630: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
e640: 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
e650: 61 6e 46 6c 6f 61 74 28 70 4d 65 6d 2d 3e 72 29  anFloat(pMem->r)
e660: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e670: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c  flags = MEM_Real
e680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e690: 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
e6a0: 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
e6b0: 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
e6c0: 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
e6d0: 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
e6e0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
e6f0: 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
e700: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e710: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e720: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
e730: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
e740: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  .      int len =
e750: 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
e760: 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
e770: 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
e780: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
e790: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
e7a0: 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
e7b0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
e7c0: 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
e7d0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e7e0: 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
e7f0: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
e800: 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
e810: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
e820: 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
e830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
e840: 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
e850: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
e870: 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63  er of a record c
e880: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 71  onsists of a seq
e890: 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c  uence variable-l
e8a0: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a  ength integers..
e8b0: 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72  ** These integer
e8c0: 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77  s are almost alw
e8d0: 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72  ays small and ar
e8e0: 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73  e encoded as a s
e8f0: 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54  ingle byte..** T
e900: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
e910: 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  ro takes advanta
e920: 67 65 20 74 68 69 73 20 66 61 63 74 20 74 6f 20  ge this fact to 
e930: 70 72 6f 76 69 64 65 20 61 20 66 61 73 74 20 64  provide a fast d
e940: 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20  ecode.** of the 
e950: 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72 65  integers in a re
e960: 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49 74  cord header.  It
e970: 20 69 73 20 66 61 73 74 65 72 20 66 6f 72 20 74   is faster for t
e980: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a  he common case.*
e990: 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65  * where the inte
e9a0: 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ger is a single 
e9b0: 62 79 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c  byte.  It is a l
e9c0: 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65  ittle slower whe
e9d0: 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  n the.** integer
e9e0: 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   is two or more 
e9f0: 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72  bytes.  But over
ea00: 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65 72  all it is faster
ea10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
ea20: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
ea30: 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
ea40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20  :.**.**     x = 
ea50: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
ea60: 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a  32( A, &B );.**.
ea70: 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56 61  **     x = GetVa
ea80: 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a  rint( A, B );.**
ea90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56  .*/.#define GetV
eaa0: 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20  arint(A,B)  ((B 
eab0: 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20  = *(A))<=0x7f ? 
eac0: 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61  1 : sqlite3GetVa
ead0: 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a  rint32(A, &B))..
eae0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
eaf0: 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
eb00: 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
eb10: 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
eb20: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a   specified by .*
eb30: 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  * {nKey1, pKey1}
eb40: 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65   and {nKey2, pKe
eb50: 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61  y2}, returning a
eb60: 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
eb70: 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
eb80: 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31  nteger if {nKey1
eb90: 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73  , pKey1} is less
eba0: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
ebb0: 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
ebc0: 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79  han {nKey2, pKey
ebd0: 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61  2}.  Both Key1 a
ebe0: 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20  nd Key2 must be 
ebf0: 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20  byte strings.** 
ec00: 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20  composed by the 
ec10: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
ec20: 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
ec30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ec40: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
ec50: 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44  e(.  void *userD
ec60: 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ata,.  int nKey1
ec70: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
ec80: 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79  ey1, .  int nKey
ec90: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
eca0: 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66  Key2.){.  KeyInf
ecb0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b  o *pKeyInfo = (K
ecc0: 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61  eyInfo*)userData
ecd0: 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20  ;.  u32 d1, d2; 
ece0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
ecf0: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
ed00: 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
ed10: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
ed20: 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a  1, idx2;      /*
ed30: 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
ed40: 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
ed50: 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
ed60: 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64  u32 szHdr1, szHd
ed70: 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  r2;  /* Number o
ed80: 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
ed90: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
eda0: 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
edb0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
edc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
edd0: 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
ede0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
edf0: 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e  r *)pKey1;.  con
ee00: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
ee10: 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74   *aKey2 = (const
ee20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ee30: 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d  )pKey2;..  Mem m
ee40: 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b  em1;.  Mem mem2;
ee50: 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
ee60: 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
ee70: 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
ee80: 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e  o->db;.  mem2.en
ee90: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
eea0: 63 3b 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70  c;.  mem2.db = p
eeb0: 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a  KeyInfo->db;.  .
eec0: 20 20 69 64 78 31 20 3d 20 47 65 74 56 61 72 69    idx1 = GetVari
eed0: 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  nt(aKey1, szHdr1
eee0: 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
eef0: 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74 56 61  ;.  idx2 = GetVa
ef00: 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64  rint(aKey2, szHd
ef10: 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64  r2);.  d2 = szHd
ef20: 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70  r2;.  nField = p
ef30: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
ef40: 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
ef50: 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a  zHdr1 && idx2<sz
ef60: 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20  Hdr2 ){.    u32 
ef70: 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20  serial_type1;.  
ef80: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
ef90: 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e2;..    /* Read
efa0: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
efb0: 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
efc0: 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
efd0: 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
efe0: 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b  += GetVarint( aK
eff0: 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
f000: 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66  _type1 );.    if
f010: 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
f020: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f030: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
f040: 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
f050: 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74  .    idx2 += Get
f060: 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64  Varint( aKey2+id
f070: 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32  x2, serial_type2
f080: 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d   );.    if( d2>=
f090: 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65 33  nKey2 && sqlite3
f0a0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
f0b0: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e  n(serial_type2)>
f0c0: 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
f0d0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
f0e0: 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
f0f0: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
f100: 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
f110: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
f120: 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
f130: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
f140: 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56    d2 += sqlite3V
f150: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
f160: 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f  ey2[d2], serial_
f170: 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a  type2, &mem2);..
f180: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
f190: 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
f1a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f1b0: 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
f1c0: 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c  , &mem2, i<nFiel
f1d0: 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
f1e0: 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
f1f0: 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20   if( mem1.flags 
f200: 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  & MEM_Dyn ) sqli
f210: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
f220: 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66  e(&mem1);.    if
f230: 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d  ( mem2.flags & M
f240: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
f250: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
f260: 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72  mem2);.    if( r
f270: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
f280: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
f290: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  ++;.  }..  /* On
f2a0: 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
f2b0: 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
f2c0: 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
f2d0: 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
f2e0: 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
f2f0: 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
f300: 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
f310: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
f320: 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
f330: 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
f340: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
f350: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
f360: 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
f370: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
f380: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f390: 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  d1<nKey1 ){.    
f3a0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
f3b0: 6c 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32  lse if( d2<nKey2
f3c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d   ){.      rc = -
f3d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
f3e0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
f3f0: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70  SortOrder && i<p
f400: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a  KeyInfo->nField.
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
f420: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
f430: 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
f440: 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a   rc = -rc;.  }..
f450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f460: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
f470: 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65  nt is an index e
f480: 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73  ntry composed us
f490: 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
f4a0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
f4b0: 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   The last entry 
f4c0: 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20 73  in this record s
f4d0: 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
f4e0: 67 65 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c  ger (specificall
f4f0: 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  y.** an integer 
f500: 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f  rowid).  This ro
f510: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
f520: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
f530: 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74  s in.** that int
f540: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
f550: 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
f560: 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b  Len(const u8 *aK
f570: 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72  ey){.  u32 szHdr
f580: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
f590: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
f5a0: 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
f5b0: 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
f5c0: 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
f5d0: 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47  d */..  sqlite3G
f5e0: 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
f5f0: 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69   &szHdr);.  sqli
f600: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  te3GetVarint32(&
f610: 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26  aKey[szHdr-1], &
f620: 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 72 65  typeRowid);.  re
f630: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
f640: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79  SerialTypeLen(ty
f650: 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a  peRowid);.}.  ..
f660: 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
f670: 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
f680: 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
f690: 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
f6a0: 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
f6b0: 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
f6c0: 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
f6d0: 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
f6e0: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
f6f0: 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
f700: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
f710: 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
f720: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
f730: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
f740: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
f750: 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
f760: 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
f770: 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
f780: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
f790: 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
f7a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
f7b0: 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
f7c0: 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
f7d0: 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
f7e0: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
f7f0: 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
f800: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
f810: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
f820: 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74  m m, v;..  sqlit
f830: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
f840: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
f850: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
f860: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
f870: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f880: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
f890: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
f8a0: 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
f8b0: 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  , nCellKey, 1, &
f8c0: 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
f8d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f8e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56   }.  sqlite3GetV
f8f0: 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
f900: 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c  , &szHdr);.  sql
f910: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
f920: 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
f930: 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b  1], &typeRowid);
f940: 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
f950: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
f960: 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
f970: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f980: 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
f990: 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
f9a0: 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
f9b0: 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
f9c0: 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
f9d0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
f9e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f9f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
fa00: 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
fa10: 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
fa20: 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
fa30: 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61   is point to aga
fa40: 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
fa50: 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28  string in pKey (
fa60: 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e  of length nKey).
fa70: 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
fa80: 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
fa90: 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
faa0: 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
fab0: 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
fac0: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
fad0: 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
fae0: 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72  han pKey.  Retur
faf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
fb00: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b  uccess..**.** pK
fb10: 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ey is either cre
fb20: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
fb30: 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
fb40: 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
fb50: 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
fb60: 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
fb70: 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
fb80: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
fb90: 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
fba0: 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a  nored as well..*
fbb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
fbc0: 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
fbd0: 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20    Cursor *pC,   
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbf0: 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
fc00: 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
fc10: 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  /.  int nKey, co
fc20: 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20  nst u8 *pKey,   
fc30: 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f  /* The key to co
fc40: 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  mpare */.  int *
fc50: 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
fc60: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
fc70: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
fc80: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
fc90: 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
fca0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
fcb0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
fcc0: 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
fcd0: 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20   int lenRowid;. 
fce0: 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74   Mem m;..  sqlit
fcf0: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
fd00: 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
fd10: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
fd20: 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  =0 ){.    *res =
fd30: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
fd40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
fd50: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
fd60: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
fd70: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65  >pCursor, 0, nCe
fd80: 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
fd90: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
fda0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
fdb0: 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
fdc0: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
fdd0: 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a  n((u8*)m.z);.  *
fde0: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
fdf0: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70  eRecordCompare(p
fe00: 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e  C->pKeyInfo, m.n
fe10: 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20  -lenRowid, m.z, 
fe20: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73  nKey, pKey);.  s
fe30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
fe40: 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
fe50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fe60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fe70: 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
fe80: 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
fe90: 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
fea0: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
feb0: 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
fec0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
fed0: 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
fee0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
fef0: 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
ff00: 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
ff10: 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
ff20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ff30: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
ff40: 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
ff50: 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
ff60: 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
ff70: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
ff80: 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
ff90: 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
ffa0: 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
ffb0: 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
ffc0: 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
ffd0: 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
ffe0: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
fff0: 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
10000 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
10010 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
10020 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
10030 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
10040 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
10050 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10060 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
10070 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
10080 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
10090 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
100a0 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
100b0 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
100c0 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
100d0 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
100e0 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
100f0 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
10100 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
10110 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
10120 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
10130 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
10140 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
10150 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
10160 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
10170 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
10180 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
10190 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
101a0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
101b0 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
101c0 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
101d0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
101e0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
101f0 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
10200 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
10210 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
10220 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
10230 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
10240 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
10250 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
10260 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
10270 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
10280 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
10290 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
102a0 62 3b 0a 7d 0a                                   b;.}.