/ Hex Artifact Content
Login

Artifact 14b48bfc6334682e5e5858a0835f8b00d8751953:


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 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4ae0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b  MemRelease(p++);
4af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
4b00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4b10: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
4b20: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
4b30: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
4b40: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
4b50: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
4b60: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
4b70: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
4b80: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
4b90: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
4ba0: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
4bb0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
4bc0: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
4bd0: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
4be0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
4bf0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
4c00: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
4c10: 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  N"..*/.int sqlit
4c20: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
4c30: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
4c40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
4c50: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  DBE */.){.  sqli
4c60: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4c70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4c80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4c90: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
4ca0: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70  plain );.  if( p
4cb0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
4cc0: 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e  GIC_RUN ) return
4cd0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
4ce0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
4cf0: 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic==SQLITE_MAGI
4d00: 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  C_BUSY );.  asse
4d10: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
4d20: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
4d30: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20  QLITE_BUSY );.. 
4d40: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
4d50: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
4d60: 20 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d 69 63   not put dynamic
4d70: 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68   strings onto th
4d80: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b  e.  ** the stack
4d90: 2c 20 74 68 65 79 20 6d 61 79 20 62 65 63 6f 6d  , they may becom
4da0: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
4db0: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
4dc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4dd0: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
4de0: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
4df0: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
4e00: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
4e10: 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61 53 74 61  ->pTos==&p->aSta
4e20: 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20 72 65 6c  ck[4] ){.    rel
4e30: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
4e40: 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a  aStack, 5);.  }.
4e50: 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20    p->resOnStack 
4e60: 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  = 0;..  do{.    
4e70: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
4e80: 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20  while( i<p->nOp 
4e90: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
4ea0: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
4eb0: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
4ec0: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
4ed0: 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  nOp ){.    p->rc
4ee0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4ef0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
4f00: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
4f10: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
4f20: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
4f30: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
4f40: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
4f50: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4f60: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
4f70: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
4f80: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
4f90: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
4fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
4fb0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
4fc0: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
4fd0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
4fe0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
4ff0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
5000: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5010: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
5020: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5050: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
5060: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
5070: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5080: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
5090: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
50a0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
50b0: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
50c0: 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64  Names[pOp->opcod
50d0: 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e];  /* Opcode *
50e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  /.    assert( pM
50f0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
5100: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e  pMem->n = strlen
5110: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70  (pMem->z);.    p
5120: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5130: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
5140: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
5150: 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  UTF8;.    pMem++
5160: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
5170: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
5180: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
5190: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
51c0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
51d0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
51e0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
51f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5200: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
5210: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
5240: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5250: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5260: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5270: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5280: 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d  _Ephem|MEM_Str|M
5290: 45 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20 50 33  EM_Term;   /* P3
52a0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   */.    pMem->z 
52b0: 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c  = displayP3(pOp,
52c0: 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73   pMem->zShort, s
52d0: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f  izeof(pMem->zSho
52e0: 72 74 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rt));.    assert
52f0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
5300: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
5310: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
5320: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5330: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
5340: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
5350: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
5360: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
5370: 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 2*(p->explain
5380: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  -1);.    p->pTos
5390: 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e   = pMem;.    p->
53a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
53b0: 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63      p->resOnStac
53c0: 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
53d0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
53e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
53f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5400: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
5410: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5420: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
5430: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
5440: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
5450: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
5460: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
5470: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
5480: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
5490: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
54a0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
54b0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
54c0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
54d0: 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20  p[nOp-1];.  if( 
54e0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
54f0: 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21  Noop && pOp->p3!
5500: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
5510: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
5520: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  3;.    while( is
5530: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29  space(*(u8*)z) )
5540: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
5550: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
5560: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
5570: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5590: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
55a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
55b0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
55c0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
55d0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
55e0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
55f0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
5600: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
5610: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
5620: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
5630: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
5640: 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29 20 72  _io_trace==0 ) r
5650: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
5660: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
5670: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70  Op = &p->aOp[nOp
5680: 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  -1];.  if( pOp->
5690: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20  opcode==OP_Noop 
56a0: 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b  && pOp->p3!=0 ){
56b0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
56c0: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
56d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
56e0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
56f0: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
5700: 33 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  3);.    for(i=0;
5710: 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e   isspace((unsign
5720: 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b 20 69  ed char)z[i]); i
5730: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
5740: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
5750: 20 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65       if( isspace
5760: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
5770: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
5780: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
5790: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
57a0: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
57b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
57c0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
57d0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
57e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
57f0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
5800: 33 5f 69 6f 5f 74 72 61 63 65 28 22 53 51 4c 20  3_io_trace("SQL 
5810: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
5820: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
5830: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
5840: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
5850: 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  OTRACE */.../*.*
5860: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
5870: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
5880: 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73  execution.  This
5890: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
58a0: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
58b0: 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61  cating stack spa
58c0: 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ce and initializ
58d0: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
58e0: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
58f0: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
5900: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
5910: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
5920: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
5930: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
5940: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
5950: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
5960: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
5970: 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42   a VDBE from VDB
5980: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a  E_MAGIC_INIT to.
5990: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  ** VDBE_MAGIC_RU
59a0: 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  N..*/.void sqlit
59b0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
59c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
59f0: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
5a20: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
5a30: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
5a40: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
5a70: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
5a80: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
5a90: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
5aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5ab0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
5ac0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
5ad0: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5af0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
5b00: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
5b10: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
5b20: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
5b30: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
5b40: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
5b50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5b60: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5b70: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
5b80: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
5b90: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
5ba0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
5bb0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
5bc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
5bd0: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
5be0: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
5bf0: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
5c00: 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63  This.   * is bec
5c10: 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
5c20: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29   resizeOpArray()
5c30: 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e   below may shrin
5c40: 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f  k the.   * p->aO
5c50: 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76  p[] array to sav
5c60: 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c  e memory if call
5c70: 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f  ed when in VDBE_
5c80: 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20  MAGIC_RUN .   * 
5c90: 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70  state..   */.  p
5ca0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
5cb0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20  AGIC_RUN;..  /* 
5cc0: 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  No instruction e
5cd0: 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20  ver pushes more 
5ce0: 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c  than a single el
5cf0: 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20  ement onto the. 
5d00: 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20   ** stack.  And 
5d10: 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20  the stack never 
5d20: 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73  grows on success
5d30: 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f  ive executions o
5d40: 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  f the.  ** same 
5d50: 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f  loop.  So the to
5d60: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
5d70: 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e  structions is an
5d80: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a   upper bound.  *
5d90: 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  * on the maximum
5da0: 20 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71   stack depth req
5db0: 75 69 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c  uired.  (Added l
5dc0: 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a  ater:)  The.  **
5dd0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
5de0: 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73  () call computes
5df0: 20 61 20 74 69 67 68 74 65 72 20 75 70 70 65 72   a tighter upper
5e00: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20   bound on the.  
5e10: 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20  ** stack size.. 
5e20: 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   **.  ** Allocat
5e30: 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63  ion all the stac
5e40: 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20  k space we will 
5e50: 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a  ever need..  */.
5e60: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d    if( p->aStack=
5e70: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  =0 ){.    int nA
5e80: 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  rg;       /* Max
5e90: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
5ea0: 72 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20  rgs passed to a 
5eb0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  user function. *
5ec0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b  /.    int nStack
5ed0: 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  ;     /* Maximum
5ee0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b   number of stack
5ef0: 20 65 6e 74 72 69 65 73 20 72 65 71 75 69 72 65   entries require
5f00: 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65  d */.    resolve
5f10: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
5f20: 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20  g, &nStack);.   
5f30: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
5f40: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61  , p->nOp);.    a
5f50: 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29  ssert( nVar>=0 )
5f60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53  ;.    assert( nS
5f70: 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  tack<p->nOp );. 
5f80: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
5f90: 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 61 63 6b   ){.      nStack
5fa0: 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20   = 10;.    }.   
5fb0: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
5fc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
5fd0: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 53 74  (db,.        nSt
5fe0: 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53  ack*sizeof(p->aS
5ff0: 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61  tack[0])    /* a
6000: 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b  Stack */.      +
6010: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
6020: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
6030: 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20  /* apArg */.    
6040: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6050: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6060: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
6070: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
6080: 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20  f(char*)        
6090: 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f       /* azVar */
60a0: 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69  .      + nMem*si
60b0: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
60c0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20          /* aMem 
60d0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73  */.      + nCurs
60e0: 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72  or*sizeof(Cursor
60f0: 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43  *)        /* apC
6100: 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20  sr */.    );.   
6110: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
6120: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
6130: 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53  p->aMem = &p->aS
6140: 74 61 63 6b 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20  tack[nStack];.  
6150: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
6160: 65 6d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  em;.      p->aVa
6170: 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65  r = &p->aMem[nMe
6180: 6d 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61  m];.      p->nVa
6190: 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20  r = nVar;.      
61a0: 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20  p->okVar = 0;.  
61b0: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28      p->apArg = (
61c0: 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e  Mem**)&p->aVar[n
61d0: 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Var];.      p->a
61e0: 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26  zVar = (char**)&
61f0: 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a  p->apArg[nArg];.
6200: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d        p->apCsr =
6210: 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61   (Cursor**)&p->a
6220: 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  zVar[nVar];.    
6230: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
6240: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f  Cursor;.      fo
6250: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
6260: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
6270: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
6280: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
6290: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
62a0: 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d  r(n=0; n<p->nMem
62b0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; n++){.    p->a
62c0: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
62d0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 20 20  EM_Null;.  }..  
62e0: 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53  p->pTos = &p->aS
62f0: 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70  tack[-1];.  p->p
6300: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
6310: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
6320: 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b  ->uniqueCnt = 0;
6330: 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74  .  p->returnDept
6340: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f  h = 0;.  p->erro
6350: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
6360: 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63  rt;.  p->popStac
6370: 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70  k =  0;.  p->exp
6380: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
6390: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
63a0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
63b0: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
63c0: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
63d0: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
63e0: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
63f0: 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53  55;.  p->openedS
6400: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69  tatement = 0;.#i
6410: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
6420: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
6430: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6440: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
6450: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
6460: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
6470: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
6480: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
6490: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
64a0: 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20  se a cursor and 
64b0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
64c0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
64d0: 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a  ursor happens.**
64e0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
64f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
6500: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
6510: 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20   Cursor *pCx){. 
6520: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
6530: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6540: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
6550: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
6560: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
6570: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
6580: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
6590: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
65a0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
65b0: 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  >pBt);.  }.#ifnd
65c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
65d0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
65e0: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
65f0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
6600: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
6610: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
6620: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
6630: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
6640: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
6650: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
6660: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
6670: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  thod = 1;.    sq
6680: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70  lite3SafetyOff(p
6690: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75  ->db);.    pModu
66a0: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
66b0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
66c0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e  ite3SafetyOn(p->
66d0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  db);.    p->inVt
66e0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
66f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
6700: 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61  e3_free(pCx->pDa
6710: 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta);.  sqlite3_f
6720: 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b  ree(pCx->aType);
6730: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6740: 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pCx);.}../*.** C
6750: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
6760: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6770: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
6780: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6790: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  i;.  if( p->apCs
67a0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
67b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
67c0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
67d0: 20 20 69 66 28 20 21 70 2d 3e 69 6e 56 74 61 62    if( !p->inVtab
67e0: 4d 65 74 68 6f 64 20 7c 7c 20 28 70 2d 3e 61 70  Method || (p->ap
67f0: 43 73 72 5b 69 5d 20 26 26 20 21 70 2d 3e 61 70  Csr[i] && !p->ap
6800: 43 73 72 5b 69 5d 2d 3e 70 56 74 61 62 43 75 72  Csr[i]->pVtabCur
6810: 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  sor) ){.      sq
6820: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
6830: 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b  sor(p, p->apCsr[
6840: 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  i]);.      p->ap
6850: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
6860: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
6870: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
6880: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a  fter execution..
6890: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
68a0: 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ne will automati
68b0: 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20  cally close any 
68c0: 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20  cursors, lists, 
68d0: 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72  and/or.** sorter
68e0: 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74  s that were left
68f0: 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20   open.  It also 
6900: 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75  deletes the valu
6910: 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c  es of.** variabl
6920: 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d  es in the aVar[]
6930: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
6940: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
6950: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
6960: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  ;.  if( p->aStac
6970: 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  k ){.    release
6980: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61  MemArray(p->aSta
6990: 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73  ck, 1 + (p->pTos
69a0: 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a   - p->aStack));.
69b0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70      p->pTos = &p
69c0: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20  ->aStack[-1];.  
69d0: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
69e0: 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73  ors(p);.  releas
69f0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
6a00: 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73  m, p->nMem);.  s
6a10: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
6a20: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
6a30: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
6a40: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
6a50: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
6a60: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
6a70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6a80: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
6a90: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
6aa0: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
6ab0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6ac0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
6ad0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
6ae0: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
6af0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
6b00: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
6b10: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
6b20: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
6b30: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
6b40: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
6b50: 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b  .  p->resOnStack
6b60: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
6b70: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
6b80: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
6b90: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
6ba0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
6bb0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
6bc0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
6bd0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
6be0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
6bf0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
6c00: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
6c10: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
6c20: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
6c30: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
6c40: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
6c50: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
6c60: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
6c70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6c80: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
6c90: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
6ca0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
6cb0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
6cc0: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
6cd0: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
6ce0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
6cf0: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
6d00: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f  ite3_free(p->aCo
6d10: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
6d20: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
6d30: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
6d40: 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e  umn = nResColumn
6d50: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
6d60: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
6d70: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
6d80: 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73 69  ocZero(p->db, si
6d90: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
6da0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
6db0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6dc0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
6dd0: 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61 6d 65 2b  {.    (pColName+
6de0: 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  +)->flags = MEM_
6df0: 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Null;.  }.}../*.
6e00: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
6e10: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
6e20: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
6e30: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
6e40: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
6e50: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
6e60: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
6e70: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
6e80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
6e90: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
6ea0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
6eb0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
6ec0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ols()..**.** If 
6ed0: 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74  N==P3_STATIC  it
6ee0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d   means that zNam
6ef0: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
6f00: 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61  o a constant sta
6f10: 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e  tic.** string an
6f20: 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  d we can just co
6f30: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20  py the pointer. 
6f40: 49 66 20 69 74 20 69 73 20 50 33 5f 44 59 4e 41  If it is P3_DYNA
6f50: 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  MIC, then .** th
6f60: 65 20 73 74 72 69 6e 67 20 69 73 20 66 72 65 65  e string is free
6f70: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
6f80: 66 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  free() when the 
6f90: 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65 64  vdbe is finished
6fa0: 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68   with.** it. Oth
6fb0: 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20  erwise, N bytes 
6fc0: 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70  of zName are cop
6fd0: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
6fe0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6ff0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
7000: 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e  dx, int var, con
7010: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
7020: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63  int N){.  int rc
7030: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
7040: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
7050: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
7060: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
7070: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
7080: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
7090: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
70a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
70b0: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
70c0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
70d0: 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
70e0: 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e  Name[idx+var*p->
70f0: 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  nResColumn]);.  
7100: 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49  if( N==P3_DYNAMI
7110: 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49  C || N==P3_STATI
7120: 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  C ){.    rc = sq
7130: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
7140: 74 72 28 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20  tr(p->db, .     
7150: 20 20 20 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61     pColName, zNa
7160: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
7170: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
7180: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
7190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
71a0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 2d 3e 64  beMemSetStr(p->d
71b0: 62 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  b, .        pCol
71c0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20  Name, zName, N, 
71d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
71e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
71f0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
7200: 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33  LITE_OK && N==P3
7210: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
7220: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
7230: 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  = (pColName->fla
7240: 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29  gs&(~MEM_Static)
7250: 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70  )|MEM_Dyn;.    p
7260: 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20  ColName->xDel = 
7270: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7280: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
7290: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
72a0: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
72b0: 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
72c0: 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
72d0: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
72e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
72f0: 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
7300: 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
7310: 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
7320: 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
7330: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
7340: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
7350: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
7360: 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
7370: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
7380: 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
7390: 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
73a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
73b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
73c0: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
73d0: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
73e0: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
73f0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7400: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
7410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
7420: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
7430: 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  ;..  /* Before d
7440: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
7450: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
7460: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
7470: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
7480: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
7490: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
74a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
74b0: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
74c0: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
74d0: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
74e0: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
74f0: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
7500: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
7510: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
7520: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
7530: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
7540: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
7550: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
7560: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
7570: 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20 69  ync(db, rc);.  i
7580: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7590: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
75a0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
75b0: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
75c0: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
75d0: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
75e0: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
75f0: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
7600: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7610: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
7620: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
7630: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
7640: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
7650: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
7660: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
7670: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
7680: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
7690: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
76a0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
76b0: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
76c0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
76d0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
76e0: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
76f0: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
7700: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7710: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
7720: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7730: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
7740: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
7750: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
7760: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
7770: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
7780: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
7790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
77a0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
77b0: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
77c0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
77d0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
77e0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
77f0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
7800: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
7810: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
7820: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
7830: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
7840: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
7850: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
7860: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
7870: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  db);.    if( rc 
7880: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7890: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
78a0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
78b0: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
78c0: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
78d0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
78e0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
78f0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
7900: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
7910: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
7920: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
7930: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
7940: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
7950: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
7960: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
7970: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
7980: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
7990: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
79a0: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
79b0: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
79c0: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
79d0: 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ry:.  In that ca
79e0: 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f  se we do.  ** no
79f0: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
7a00: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
7a10: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
7a20: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
7a30: 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a  .  ** too..  */.
7a40: 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28    if( 0==strlen(
7a50: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
7a60: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
7a70: 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61  0].pBt)) || nTra
7a80: 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  ns<=1 ){.    for
7a90: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
7aa0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
7ab0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
7ac0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
7ad0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
7ae0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
7af0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7b00: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
7b10: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
7b20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
7b30: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
7b40: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
7b50: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
7b60: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
7b70: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
7b80: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
7b90: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
7ba0: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
7bb0: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
7bc0: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
7bd0: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
7be0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
7bf0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
7c00: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
7c10: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
7c20: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
7c30: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
7c40: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
7c50: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
7c60: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
7c70: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
7c80: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
7c90: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
7ca0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
7cb0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
7cc0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
7cd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
7ce0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
7cf0: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
7d00: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
7d10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7d20: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
7d30: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
7d40: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
7d50: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
7d60: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
7d70: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
7d80: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
7d90: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
7da0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
7db0: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
7dc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7dd0: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
7de0: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
7df0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7e00: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
7e10: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
7e20: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
7e30: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
7e40: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
7e50: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
7e60: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
7e70: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
7e80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
7e90: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
7ea0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
7eb0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
7ec0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
7ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
7ee0: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
7ef0: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
7f00: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65   0;..    /* Sele
7f10: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
7f20: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
7f30: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
7f40: 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20  u32 random;.    
7f50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7f60: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
7f70: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
7f80: 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c  (sizeof(random),
7f90: 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20   &random);.     
7fa0: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
7fb0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
7fc0: 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e  s-mj%08X", zMain
7fd0: 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37  File, random&0x7
7fe0: 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
7ff0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a  if( !zMaster ){.
8000: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
8010: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8020: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
8030: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
8040: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8050: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
8060: 49 53 54 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ISTS) );..    /*
8070: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
8080: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
8090: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
80a0: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
80b0: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
80c0: 72 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49  r, .        SQLI
80d0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
80e0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
80f0: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 53 51  EATE|.        SQ
8100: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
8110: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
8120: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
8130: 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  0.    );.    if(
8140: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8150: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8160: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
8170: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8180: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
8190: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
81a0: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
81b0: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
81c0: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
81d0: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
81e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
81f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8200: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
8210: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
8220: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
8230: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8240: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
8250: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
8260: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
8270: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
8280: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8290: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
82a0: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
82b0: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
82c0: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
82d0: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
82e0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
82f0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8300: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
8310: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
8320: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
8330: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
8340: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
8350: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
8360: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26        if( pBt &&
8370: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
8380: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
8390: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
83a0: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
83b0: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
83c0: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
83d0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d      if( zFile[0]
83e0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==0 ) continue; 
83f0: 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f   /* Ignore :memo
8400: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
8410: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
8420: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
8430: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
8440: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
8450: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
8460: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
8470: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8480: 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
8490: 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e  r, zFile, strlen
84a0: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
84b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
84c0: 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 46 69  et += strlen(zFi
84d0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
84e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
84f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
8500: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
8510: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
8520: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
8530: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
8540: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
8550: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8560: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
8570: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8590: 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53      }...    /* S
85a0: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
85b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
85c0: 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20      zMainFile = 
85d0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
85e0: 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  irname(db->aDb[0
85f0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
8600: 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20  (needSync .     
8610: 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73  && (rc=sqlite3Os
8620: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
8630: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
8640: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  ))!=SQLITE_OK) )
8650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
8660: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
8670: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8680: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
8690: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
86a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
86b0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
86c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
86d0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
86e0: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
86f0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
8700: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
8710: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
8720: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
8730: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
8740: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
8750: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
8760: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
8770: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
8780: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
8790: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
87a0: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
87b0: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
87c0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
87d0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
87e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
87f0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
8800: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
8810: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
8820: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
8830: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8840: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
8850: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
8860: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
8870: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
8880: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8890: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
88a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
88b0: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
88c0: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
88d0: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  re occured..    
88e0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
88f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8900: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8910: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
8920: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
8930: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
8940: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
8950: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
8960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
8970: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
8980: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
8990: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
89a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
89b0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
89c0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (pMaster);.    i
89d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
89e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
89f0: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8a00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8a10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8a20: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
8a30: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
8a40: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
8a50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
8a60: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
8a70: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
8a80: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
8a90: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
8aa0: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
8ab0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
8ac0: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
8ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
8ae0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8af0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
8b00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
8b10: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8b20: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
8b30: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
8b40: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8b50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
8b60: 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
8b70: 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
8b80: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
8b90: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
8ba0: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
8bb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8bc0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
8bd0: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
8be0: 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
8bf0: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
8c00: 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
8c10: 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
8c20: 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
8c30: 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
8c40: 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
8c50: 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
8c60: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
8c70: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
8c80: 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
8c90: 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
8ca0: 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
8cb0: 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
8cc0: 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
8cd0: 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
8ce0: 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
8cf0: 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
8d00: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
8d10: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
8d20: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
8d30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
8d40: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
8d50: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8d60: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8d70: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
8d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d90: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8da0: 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20  Two(pBt);.      
8db0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 61 62  }.    }.    enab
8dc0: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
8dd0: 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
8de0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
8df0: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
8e00: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
8e10: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
8e20: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
8e30: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
8e40: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
8e50: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
8e60: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
8e70: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
8e80: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
8e90: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
8ea0: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
8eb0: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
8ec0: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
8ed0: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
8ee0: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
8ef0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
8f00: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
8f10: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
8f20: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
8f30: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
8f40: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
8f50: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
8f60: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
8f70: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
8f80: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
8f90: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
8fa0: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
8fb0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
8fc0: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
8fd0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
8fe0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
8ff0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
9000: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
9010: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
9020: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
9030: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
9040: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
9050: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
9060: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
9070: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
9080: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
9090: 69 6e 64 20 65 76 65 72 79 20 61 63 74 69 76 65  ind every active
90a0: 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e 20 70   VM other than p
90b0: 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67 65 20  Vdbe and change 
90c0: 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a 2a 2a  its status to.**
90d0: 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69 73 20   aborted.  This 
90e0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f 6e 65  happens when one
90f0: 20 56 4d 20 63 61 75 73 65 73 20 61 20 72 6f 6c   VM causes a rol
9100: 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61 6e 0a  lback due to an.
9110: 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  ** ON CONFLICT R
9120: 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65 20 28  OLLBACK clause (
9130: 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20 20 54  for example).  T
9140: 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73  he other VMs mus
9150: 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65 64 20  t be.** aborted 
9160: 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20  so that they do 
9170: 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20 72 6f  not have data ro
9180: 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  lled out from un
9190: 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68 65 6d  derneath.** them
91a0: 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20 73 65   leading to a se
91b0: 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gfault..*/.void 
91c0: 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65  sqlite3AbortOthe
91d0: 72 41 63 74 69 76 65 56 64 62 65 73 28 73 71 6c  rActiveVdbes(sql
91e0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
91f0: 70 45 78 63 65 70 74 29 7b 0a 20 20 56 64 62 65  pExcept){.  Vdbe
9200: 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f 72 28   *pOther;.  for(
9210: 70 4f 74 68 65 72 3d 64 62 2d 3e 70 56 64 62 65  pOther=db->pVdbe
9220: 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74 68 65 72  ; pOther; pOther
9230: 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 29 7b  =pOther->pNext){
9240: 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65 72 3d  .    if( pOther=
9250: 3d 70 45 78 63 65 70 74 20 29 20 63 6f 6e 74 69  =pExcept ) conti
9260: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 74  nue;.    if( pOt
9270: 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  her->magic!=VDBE
9280: 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 4f  _MAGIC_RUN || pO
9290: 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f 6e  ther->pc<0 ) con
92a0: 74 69 6e 75 65 3b 0a 20 20 20 20 63 68 65 63 6b  tinue;.    check
92b0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
92c0: 29 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43  );.    closeAllC
92d0: 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29 3b 0a  ursors(pOther);.
92e0: 20 20 20 20 63 68 65 63 6b 41 63 74 69 76 65 56      checkActiveV
92f0: 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20 20  dbeCnt(db);.    
9300: 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65 64 20  pOther->aborted 
9310: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
9320: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9330: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
9340: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
9350: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
9360: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
9370: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
9380: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
9390: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
93a0: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
93b0: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
93c0: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
93d0: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
93e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
93f0: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
9400: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
9410: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
9420: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
9430: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
9440: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a  E_MAGIC_HALT..**
9450: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
9460: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
9470: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
9480: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
9490: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
94a0: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
94b0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
94c0: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
94d0: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
94e0: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
94f0: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
9500: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
9510: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
9520: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
9530: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
9540: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
9550: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
9560: 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65  t (*xFunc)(Btree
9570: 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20   *pBt) = 0;  /* 
9580: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
9590: 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20 62   on each btree b
95a0: 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ackend */.  int 
95b0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
95c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
95d0: 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c  t to true if SQL
95e0: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45  ITE_NOMEM or IOE
95f0: 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  RR */..  /* This
9600: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
9610: 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
9620: 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
9630: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
9640: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
9650: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
9660: 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
9670: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
9680: 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
9690: 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
96a0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
96b0: 2a 0a 20 20 2a 2a 20 53 70 65 63 69 61 6c 20 65  *.  ** Special e
96c0: 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors:.  **.  **
96d0: 20 20 20 20 20 49 66 20 61 6e 20 53 51 4c 49 54       If an SQLIT
96e0: 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f 72 20 68 61  E_NOMEM error ha
96f0: 73 20 6f 63 63 75 72 65 64 20 69 6e 20 61 20 73  s occured in a s
9700: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 72  tatement that wr
9710: 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20 20 20 20  ites to.  **    
9720: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
9730: 68 65 6e 20 65 69 74 68 65 72 20 61 20 73 74 61  hen either a sta
9740: 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
9750: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
9760: 6c 6c 65 64 0a 20 20 2a 2a 20 20 20 20 20 62 61  lled.  **     ba
9770: 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ck to ensure the
9780: 20 74 72 65 65 2d 73 74 72 75 63 74 75 72 65 73   tree-structures
9790: 20 61 72 65 20 69 6e 20 61 20 63 6f 6e 73 69 73   are in a consis
97a0: 74 65 6e 74 20 73 74 61 74 65 2e 20 41 0a 20 20  tent state. A.  
97b0: 2a 2a 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74  **     statement
97c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
97d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 6f  rolled back if o
97e0: 6e 65 20 69 73 20 6f 70 65 6e 2c 20 6f 74 68 65  ne is open, othe
97f0: 72 77 69 73 65 20 74 68 65 0a 20 20 2a 2a 20 20  rwise the.  **  
9800: 20 20 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61     entire transa
9810: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
9820: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  lled back..  **.
9830: 20 20 2a 2a 20 20 20 20 20 49 66 20 61 6e 20 53    **     If an S
9840: 51 4c 49 54 45 5f 49 4f 45 52 52 20 65 72 72 6f  QLITE_IOERR erro
9850: 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 69 6e  r has occured in
9860: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61   a statement tha
9870: 74 20 77 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a  t writes to.  **
9880: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
9890: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
98a0: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  re transaction m
98b0: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
98c0: 63 6b 2e 20 54 68 65 0a 20 20 2a 2a 20 20 20 20  ck. The.  **    
98d0: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 61 79 20 68   I/O error may h
98e0: 61 76 65 20 63 61 75 73 65 64 20 67 61 72 62 61  ave caused garba
98f0: 67 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ge to be written
9900: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9910: 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  .  **     file. 
9920: 57 65 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  Were the transac
9930: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
9940: 20 61 6e 64 20 65 76 65 6e 74 75 61 6c 6c 79 20   and eventually 
9950: 62 65 20 72 6f 6c 6c 65 64 20 0a 20 20 2a 2a 20  be rolled .  ** 
9960: 20 20 20 20 62 61 63 6b 20 74 68 61 74 20 67 61      back that ga
9970: 72 62 61 67 65 20 6d 69 67 68 74 20 65 6e 64 20  rbage might end 
9980: 75 70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  up in the databa
9990: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 20 20  se file..  **   
99a0: 20 20 0a 20 20 2a 2a 20 20 20 20 20 49 6e 20 62    .  **     In b
99b0: 6f 74 68 20 6f 66 20 74 68 65 20 61 62 6f 76 65  oth of the above
99c0: 20 63 61 73 65 73 2c 20 74 68 65 20 56 64 62 65   cases, the Vdbe
99d0: 2e 65 72 72 6f 72 41 63 74 69 6f 6e 20 76 61 72  .errorAction var
99e0: 69 61 62 6c 65 20 69 73 20 0a 20 20 2a 2a 20 20  iable is .  **  
99f0: 20 20 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 74     ignored. If t
9a00: 68 65 20 73 71 6c 69 74 65 33 2e 61 75 74 6f 43  he sqlite3.autoC
9a10: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 66 61  ommit flag is fa
9a20: 6c 73 65 20 61 6e 64 20 61 20 74 72 61 6e 73 61  lse and a transa
9a30: 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69  ction.  **     i
9a40: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 69  s rolled back, i
9a50: 74 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  t will be set to
9a60: 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   true..  **.  **
9a70: 20 4f 74 68 65 72 20 65 72 72 6f 72 73 3a 0a 20   Other errors:. 
9a80: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20 65 72 72 6f   **.  ** No erro
9a90: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 0a 20 20  r:.  **.  */..  
9aa0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
9ab0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
9ac0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
9ad0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  MEM;.  }.  if( p
9ae0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
9af0: 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 2f  GIC_RUN ){.    /
9b00: 2a 20 41 6c 72 65 61 64 79 20 68 61 6c 74 65 64  * Already halted
9b10: 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  .  Nothing to do
9b20: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
9b30: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
9b40: 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a 23 69  MAGIC_HALT );.#i
9b50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9b60: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9b70: 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f     closeAllCurso
9b80: 72 73 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rs(p);.#endif.  
9b90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ba0: 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  OK;.  }.  closeA
9bb0: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
9bc0: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
9bd0: 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
9be0: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
9bf0: 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
9c00: 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
9c10: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28  started */.  if(
9c20: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
9c30: 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
9c40: 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
9c50: 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
9c60: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
9c70: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
9c80: 69 61 6c 20 65 72 72 6f 72 73 20 2d 20 53 51 4c  ial errors - SQL
9c90: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 53 51 4c  ITE_NOMEM or SQL
9ca0: 49 54 45 5f 49 4f 45 52 52 20 2a 2f 0a 20 20 20  ITE_IOERR */.   
9cb0: 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
9cc0: 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
9cd0: 61 6c 45 72 72 6f 72 20 3d 20 28 0a 20 20 20 20  alError = (.    
9ce0: 20 20 20 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45      (mrc==SQLITE
9cf0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
9d00: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 6d  QLITE_IOERR || m
9d10: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
9d20: 52 55 50 54 29 3f 31 3a 30 29 3b 0a 20 20 20 20  RUPT)?1:0);.    
9d30: 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
9d40: 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  or ){.      /* T
9d50: 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74  his loop does st
9d60: 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f 66  atic analysis of
9d70: 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 73 65   the query to se
9d80: 65 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a 20  e which of the. 
9d90: 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
9da0: 67 20 74 68 72 65 65 20 63 61 74 65 67 6f 72 69  g three categori
9db0: 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f  es it falls into
9dc0: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
9dd0: 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c   **     Read-onl
9de0: 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  y.      **     Q
9df0: 75 65 72 79 20 77 69 74 68 20 73 74 61 74 65 6d  uery with statem
9e00: 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent journal.    
9e10: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
9e20: 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e 74  ithout statement
9e30: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
9e40: 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 63 6f  *.      ** We co
9e50: 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67  uld do something
9e60: 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20 74 68   more elegant th
9e70: 61 6e 20 74 68 69 73 20 73 74 61 74 69 63 20 61  an this static a
9e80: 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20 20  nalysis (i.e..  
9e90: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
9ea0: 20 74 79 70 65 20 6f 66 20 71 75 65 72 79 20 61   type of query a
9eb0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
9ec0: 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61 73 65 29  mpliation phase)
9ed0: 2c 20 62 75 74 20 0a 20 20 20 20 20 20 2a 2a 20  , but .      ** 
9ee0: 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28  handling malloc(
9ef0: 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 20  ) or IO failure 
9f00: 69 73 20 61 20 66 61 69 72 6c 79 20 6f 62 73 63  is a fairly obsc
9f10: 75 72 65 20 65 64 67 65 20 63 61 73 65 20 73 6f  ure edge case so
9f20: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
9f30: 69 73 20 70 72 6f 62 61 62 6c 79 20 65 61 73 69  is probably easi
9f40: 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20  er. Todo: Might 
9f50: 62 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  be an opportunit
9f60: 79 20 74 6f 20 72 65 64 75 63 65 20 0a 20 20 20  y to reduce .   
9f70: 20 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20     ** code size 
9f80: 61 20 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f  a very small amo
9f90: 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20  unt though....  
9fa0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
9fb0: 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 31 3b   isReadOnly = 1;
9fc0: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53 74 61  .      int isSta
9fd0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
9fe0: 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70 20    assert(p->aOp 
9ff0: 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20  || p->nOp==0);. 
a000: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a010: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20  p->nOp; i++){ . 
a020: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
a030: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20  ->aOp[i].opcode 
a040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
a050: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
a060: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :.            /*
a070: 20 54 68 69 73 20 69 73 20 61 20 62 69 74 20 73   This is a bit s
a080: 74 72 61 6e 67 65 2e 20 49 66 20 77 65 20 68 69  trange. If we hi
a090: 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  t a malloc() or 
a0a0: 49 4f 20 65 72 72 6f 72 20 61 6e 64 0a 20 20 20  IO error and.   
a0b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
a0c0: 73 74 61 74 65 6d 65 6e 74 20 64 69 64 20 6e 6f  statement did no
a0d0: 74 20 6f 70 65 6e 20 61 20 73 74 61 74 65 6d 65  t open a stateme
a0e0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
a0f0: 77 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  we will.        
a100: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
a110: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
a120: 61 63 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74  action and abort
a130: 20 61 6c 6c 20 6f 74 68 65 72 20 61 63 74 69 76   all other activ
a140: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
a150: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 4f 72 2c   statements. Or,
a160: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 53   if this is an S
a170: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
a180: 65 72 72 6f 72 2c 20 77 65 0a 20 20 20 20 20 20  error, we.      
a190: 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 6e        ** will on
a1a0: 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 74  ly rollback if t
a1b0: 68 65 20 69 6e 74 65 72 72 75 70 74 65 64 20 73  he interrupted s
a1c0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 77  tatement was a w
a1d0: 72 69 74 65 2e 0a 20 20 20 20 20 20 20 20 20 20  rite..          
a1e0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
a1f0: 20 2a 2a 20 49 74 20 63 6f 75 6c 64 20 62 65 20   ** It could be 
a200: 61 72 67 75 65 64 20 74 68 61 74 20 72 65 61 64  argued that read
a210: 2d 6f 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 73  -only statements
a220: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 0a 20 20   should never.  
a230: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c            ** rol
a240: 6c 62 61 63 6b 20 61 6e 79 74 68 69 6e 67 2e 20  lback anything. 
a250: 42 75 74 20 63 61 72 65 66 75 6c 20 61 6e 61 6c  But careful anal
a260: 79 73 69 73 20 69 73 20 72 65 71 75 69 72 65 64  ysis is required
a270: 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 20 20   before.        
a280: 20 20 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 74 68      ** making th
a290: 69 73 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20  is change.      
a2a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a2b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b       if( p->aOp[
a2c0: 69 5d 2e 70 32 20 7c 7c 20 6d 72 63 21 3d 53 51  i].p2 || mrc!=SQ
a2d0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
a2e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a2f0: 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  isReadOnly = 0;.
a300: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
a310: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a320: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
a330: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20  OP_Statement:.  
a340: 20 20 20 20 20 20 20 20 20 20 69 73 53 74 61 74            isStat
a350: 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  ement = 1;.     
a360: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a380: 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
a390: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
a3a0: 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20  d-only, we need 
a3b0: 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  do no rollback a
a3c0: 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65  t all. Otherwise
a3d0: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  ,.      ** proce
a3e0: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
a3f0: 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
a400: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
a410: 20 21 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a   !isReadOnly ){.
a420: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
a430: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
a440: 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61  BLOCKED && isSta
a450: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
a460: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
a470: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a480: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
a490: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
a4a0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
a4b0: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  lse if( p->rc==S
a4c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 69  QLITE_NOMEM && i
a4d0: 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  sStatement ){.  
a4e0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
a4f0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
a500: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
a510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a520: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
a530: 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
a540: 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
a550: 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
a560: 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
a570: 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
a580: 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
a590: 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
a5a0: 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
a5b0: 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
a5c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a5d0: 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69  e3AbortOtherActi
a5e0: 76 65 56 64 62 65 73 28 64 62 2c 20 70 29 3b 0a  veVdbes(db, p);.
a5f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a600: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
a610: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
a620: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
a630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a640: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
a650: 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
a660: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
a670: 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
a680: 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76 64 62   only active vdb
a690: 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77  e, then.    ** w
a6a0: 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
a6b0: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
a6c0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
a6d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
a6e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
a6f0: 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
a700: 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
a710: 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
a720: 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
a730: 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
a740: 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  cured. .    */. 
a750: 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43     if( db->autoC
a760: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63 74  ommit && db->act
a770: 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b  iveVdbeCnt==1 ){
a780: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
a790: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
a7a0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
a7b0: 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
a7c0: 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
a7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
a7e0: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
a7f0: 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20  s true, and the 
a800: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
a810: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 63   .        ** suc
a820: 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61  cessful or hit a
a830: 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
a840: 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61  traint. This mea
a850: 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
a860: 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
a870: 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
a880: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
a890: 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b   vdbeCommit(db);
a8a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
a8b0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
a8c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a8d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
a8e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a8f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a900: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
a910: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
a920: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
a930: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
a940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a950: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
a960: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
a970: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
a980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a990: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
a9a0: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
a9b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
a9c0: 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20   !xFunc ){.     
a9d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
a9e0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
a9f0: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
aa00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
aa10: 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65  p->openedStateme
aa20: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
aa30: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
aa40: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a  treeCommitStmt;.
aa50: 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
aa60: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
aa70: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
aa80: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ort ){.        x
aa90: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
aaa0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b  reeRollbackStmt;
aab0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
aac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f        sqlite3Abo
aad0: 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62  rtOtherActiveVdb
aae0: 65 73 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  es(db, p);.     
aaf0: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
ab00: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
ab10: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
ab20: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
ab30: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
ab40: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
ab50: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
ab60: 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  one of sqlite3Bt
ab70: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20  reeRollbackStmt 
ab80: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
ab90: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
aba0: 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f  . Call it once o
abb0: 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20  n each backend. 
abc0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
abd0: 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  rs.    ** and th
abe0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
abf0: 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b   still SQLITE_OK
ac00: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
ac10: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
ac20: 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61  .    ** error va
ac30: 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
ac40: 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c  assert(!xFunc ||
ac50: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
ac60: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ac70: 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46  Stmt ||.      xF
ac80: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
ac90: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20  eRollbackStmt.  
aca0: 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30    );.    for(i=0
acb0: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
acc0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
acd0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
ace0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
acf0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ad00: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ad10: 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e         rc = xFun
ad20: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  c(pBt);.        
ad30: 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63  if( rc && (p->rc
ad40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
ad50: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->rc==SQLITE_CON
ad60: 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20  STRAINT) ){.    
ad70: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
ad80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ad90: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
ada0: 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20  >zErrMsg, 0);.  
adb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
adc0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
add0: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
ade0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
adf0: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
ae00: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f  statement was co
ae10: 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a  mmitted, .    **
ae20: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
ae30: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
ae40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
ae50: 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63  geCntOn && p->pc
ae60: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
ae70: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
ae80: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
ae90: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
aea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
aeb0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
aec0: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
aed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aee0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
aef0: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
af00: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
af10: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
af20: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
af30: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
af40: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
af50: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
af60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
af70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
af80: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
af90: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
afa0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
afb0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
afc0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
afd0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
afe0: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
aff0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
b000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b010: 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
b020: 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
b030: 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
b040: 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
b050: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
b060: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
b070: 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b  activeVdbeCnt--;
b080: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
b090: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
b0a0: 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
b0b0: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
b0c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b0d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ;.}../*.** Each 
b0e0: 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
b0f0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
b100: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
b110: 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
b120: 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
b130: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
b140: 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
b150: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
b160: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
b170: 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
b180: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
b190: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
b1a0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
b1b0: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
b1c0: 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
b1d0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
b1e0: 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
b1f0: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
b200: 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
b210: 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
b220: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
b230: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
b240: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
b250: 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
b260: 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
b270: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
b280: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
b290: 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
b2a0: 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
b2b0: 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
b2c0: 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
b2d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
b2e0: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
b2f0: 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
b300: 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
b310: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
b320: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
b330: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
b340: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
b350: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
b360: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
b370: 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
b380: 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
b390: 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
b3a0: 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
b3b0: 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
b3c0: 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
b3d0: 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
b3e0: 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
b3f0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 61    */.  sqlite3Sa
b400: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71  fetyOn(db);.  sq
b410: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
b420: 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  ;.  sqlite3Safet
b430: 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  yOff(db);..  /* 
b440: 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
b450: 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
b460: 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
b470: 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
b480: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
b490: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
b4a0: 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
b4b0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
b4c0: 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
b4d0: 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
b4e0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
b4f0: 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
b500: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
b510: 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
b520: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
b530: 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
b540: 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
b550: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
b560: 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
b570: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
b580: 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73     if( p->zErrMs
b590: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
b5a0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
b5b0: 2c 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e  ,db->pErr,-1,p->
b5c0: 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55  zErrMsg,SQLITE_U
b5d0: 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72 65 65  TF8,sqlite3_free
b5e0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
b5f0: 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
b600: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
b610: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
b620: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
b630: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
b640: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
b650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b660: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
b670: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
b680: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
b690: 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
b6a0: 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
b6b0: 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
b6c0: 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
b6d0: 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
b6e0: 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
b6f0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
b700: 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
b710: 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
b720: 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
b730: 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
b740: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
b750: 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
b760: 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
b770: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
b780: 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
b790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
b7a0: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
b7b0: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
b7c0: 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
b7d0: 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
b7e0: 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
b7f0: 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
b800: 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  E run..  */.  as
b810: 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70  sert( p->pTos<&p
b820: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30  ->aStack[p->pc<0
b830: 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d  ?0:p->pc] || !p-
b840: 3e 61 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65  >aStack );.#ifde
b850: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
b860: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
b870: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
b880: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
b890: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
b8a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
b8b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
b8c0: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
b8d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b8e0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
b8f0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
b900: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
b910: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
b920: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
b930: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
b940: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
b950: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
b960: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
b970: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
b980: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
b990: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
b9a0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
b9b0: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
b9c0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
b9d0: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
b9e0: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
b9f0: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
ba00: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
ba10: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
ba20: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
ba30: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
ba40: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
ba50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
ba60: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
ba70: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
ba80: 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d  ;.  p->aborted =
ba90: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   0;.  return p->
baa0: 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
bab0: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
bac0: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
bad0: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
bae0: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
baf0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
bb00: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
bb10: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
bb20: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
bb30: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
bb40: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
bb50: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
bb60: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
bb70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bb80: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
bb90: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
bba0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
bbb0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
bbc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bbd0: 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
bbe0: 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
bbf0: 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
bc00: 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  =rc );.  }else i
bc10: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
bc20: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
bc30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bc40: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
bc50: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
bc60: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
bc70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
bc80: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
bc90: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
bca0: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
bcb0: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
bcc0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
bcd0: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
bce0: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
bcf0: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
bd00: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
bd10: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
bd20: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
bd30: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
bd40: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
bd50: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
bd60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bd70: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
bd80: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
bd90: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
bda0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
bdb0: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
bdc0: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
bdd0: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
bde0: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
bdf0: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
be00: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
be10: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
be20: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
be30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
be40: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
be50: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
be60: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
be70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
be80: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
be90: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
bea0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
beb0: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
bec0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
bed0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
bee0: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
bef0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61  ) return;.  Clea
bf00: 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  nup(p);.  if( p-
bf10: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
bf20: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
bf30: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
bf40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
bf50: 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ->db->pVdbe==p )
bf60: 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64  ;.    p->db->pVd
bf70: 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
bf80: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
bf90: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
bfa0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
bfb0: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
bfc0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72  ->aOp ){.    for
bfd0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
bfe0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a  i++){.      Op *
bff0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
c000: 3b 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 70  ;.      freeP3(p
c010: 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d  Op->p3type, pOp-
c020: 3e 70 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p3);.    }.    
c030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c040: 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  aOp);.  }.  rele
c050: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
c060: 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
c070: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
c080: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  >aLabel);.  sqli
c090: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61  te3_free(p->aSta
c0a0: 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ck);.  releaseMe
c0b0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
c0c0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
c0d0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
c0e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c0f0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
c100: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71  ite3_free(p->zSq
c110: 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  l);.  p->magic =
c120: 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
c130: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
c140: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  (p);.}../*.** If
c150: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
c160: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
c170: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
c180: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
c190: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
c1a0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
c1b0: 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f   code.  If no Mo
c1c0: 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c  veTo is pending,
c1d0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
c1e0: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e   does nothing an
c1f0: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
c200: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
c210: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
c220: 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a  eto(Cursor *p){.
c230: 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
c240: 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
c250: 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
c260: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
c270: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
c280: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
c290: 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
c2a0: 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
c2b0: 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
c2c0: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
c2d0: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
c2e0: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
c2f0: 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
c300: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c310: 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72  c;.    *p->pIncr
c320: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Key = 0;.    p->
c330: 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54  lastRowid = keyT
c340: 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61  oInt(p->movetoTa
c350: 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f  rget);.    p->ro
c360: 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73  widIsValid = res
c370: 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ==0;.    if( res
c380: 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
c390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
c3a0: 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  t(p->pCursor, &r
c3b0: 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
c3c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
c3d0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
c3e0: 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
c3f0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
c400: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
c410: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
c420: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
c430: 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
c440: 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65  _STALE;.  }.  re
c450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
c470: 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
c480: 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
c490: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
c4a0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
c4b0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
c4c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c4d0: 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69  alRead().** sqli
c4e0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
c4f0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
c500: 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a  eSerialWrite().*
c510: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
c520: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
c530: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
c540: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
c550: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
c560: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
c570: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
c580: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
c590: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
c5a0: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
c5b0: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
c5c0: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
c5d0: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
c5e0: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
c5f0: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
c600: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
c610: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
c620: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
c630: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
c640: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
c650: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
c660: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
c670: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
c680: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
c690: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
c6a0: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
c6b0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
c6c0: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
c6d0: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
c6e0: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
c6f0: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
c700: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
c710: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
c720: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
c730: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
c740: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
c750: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
c760: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
c770: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
c780: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
c790: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
c7a0: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
c7b0: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
c7c0: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
c7f0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
c800: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c820: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
c830: 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c850: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
c860: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
c870: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
c880: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
c890: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
c8a0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
c8d0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
c8e0: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
c900: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
c910: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
c920: 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
c930: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
c940: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c950: 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
c980: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
c990: 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
c9a0: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
c9b0: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
c9c0: 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
c9f0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
ca00: 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
ca30: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
ca40: 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
ca70: 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
ca80: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
ca90: 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
caa0: 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
cab0: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
cac0: 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
cad0: 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
cae0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
caf0: 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
cb00: 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
cb10: 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
cb20: 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
cb30: 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
cb40: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
cb50: 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
cb60: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
cb70: 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
cb80: 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
cb90: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
cba0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
cbb0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
cbc0: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
cbd0: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
cbe0: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
cbf0: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
cc00: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
cc10: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
cc20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
cc30: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
cc40: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
cc50: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
cc60: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
cc70: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
cc80: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
cc90: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31   ((((i64)0x00001
cca0: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
ccb0: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
ccc0: 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
ccd0: 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d     if( file_form
cce0: 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d  at>=4 && (i&1)==
ccf0: 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  i ){.      retur
cd00: 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20  n 8+i;.    }.   
cd10: 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20   u = i<0 ? -i : 
cd20: 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32  i;.    if( u<=12
cd30: 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  7 ) return 1;.  
cd40: 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
cd50: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
cd60: 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
cd70: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
cd80: 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
cd90: 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
cda0: 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
cdb0: 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
cdc0: 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
cdd0: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
cde0: 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
cdf0: 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
ce00: 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  t( flags&(MEM_St
ce10: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
ce20: 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20   n = pMem->n;.  
ce30: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
ce40: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
ce50: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a   pMem->u.i;.  }.
ce60: 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
ce70: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
ce80: 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
ce90: 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
cea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ceb0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
cec0: 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
ced0: 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
cee0: 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
cef0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cf00: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
cf10: 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
cf20: 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
cf30: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
cf40: 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
cf50: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
cf60: 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
cf70: 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
cf80: 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
cf90: 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
cfa0: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
cfb0: 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
cfc0: 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
cfd0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
cfe0: 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
cff0: 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
d000: 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
d010: 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
d020: 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
d030: 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
d040: 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
d050: 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
d060: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
d070: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
d080: 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
d090: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
d0a0: 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
d0b0: 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
d0c0: 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
d0d0: 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
d0e0: 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
d0f0: 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
d100: 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
d110: 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
d120: 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
d130: 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
d140: 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
d150: 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
d160: 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
d170: 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
d180: 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
d190: 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
d1a0: 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
d1b0: 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
d1c0: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
d1d0: 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
d1e0: 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
d1f0: 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
d200: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
d210: 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
d220: 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
d230: 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
d240: 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
d250: 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
d260: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
d270: 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
d280: 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
d290: 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
d2a0: 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
d2b0: 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
d2c0: 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
d2d0: 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
d2e0: 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
d2f0: 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
d300: 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
d310: 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
d320: 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
d330: 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
d340: 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
d350: 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
d360: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
d370: 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 23 69  s correct..*/.#i
d380: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
d390: 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
d3a0: 4c 4f 41 54 0a 73 74 61 74 69 63 20 64 6f 75 62  LOAT.static doub
d3b0: 6c 65 20 66 6c 6f 61 74 53 77 61 70 28 64 6f 75  le floatSwap(dou
d3c0: 62 6c 65 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  ble in){.  union
d3d0: 20 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b   {.    double r;
d3e0: 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
d3f0: 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
d400: 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
d410: 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
d420: 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
d430: 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
d440: 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
d450: 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
d460: 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
d470: 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
d480: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
d490: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
d4a0: 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
d4b0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
d4c0: 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
d4d0: 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
d4e0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
d4f0: 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
d500: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
d510: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
d520: 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
d530: 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
d540: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
d550: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
d560: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
d570: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
d580: 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
d590: 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
d5a0: 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
d5b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
d5c0: 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
d5d0: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
d5e0: 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
d5f0: 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
d600: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
d610: 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
d620: 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
d630: 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
d640: 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
d650: 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
d660: 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
d670: 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
d680: 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
d690: 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
d6a0: 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
d6b0: 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
d6c0: 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
d6d0: 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
d6e0: 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
d6f0: 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
d700: 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
d710: 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
d720: 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
d730: 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
d740: 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
d750: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
d760: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
d770: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
d780: 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
d790: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
d7a0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
d7b0: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
d7c0: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
d7d0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
d7e0: 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
d7f0: 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
d800: 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
d810: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
d820: 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
d830: 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
d840: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
d850: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
d860: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
d870: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d880: 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
d890: 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c  format);.  int l
d8a0: 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
d8b0: 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
d8c0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
d8d0: 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
d8e0: 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
d8f0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
d900: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
d910: 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
d920: 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
d930: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
d940: 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
d950: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 70 4d  edEndianFloat(pM
d960: 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 6d 65  em->r);.      me
d970: 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
d980: 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
d990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d9a0: 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
d9b0: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
d9c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
d9d0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
d9e0: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
d9f0: 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20  sert( len<=nBuf 
da00: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
da10: 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
da20: 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20  ] = (v&0xFF);.  
da30: 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
da40: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
da50: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
da60: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
da70: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
da80: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
da90: 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
daa0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
dab0: 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
dac0: 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  i:0).           
dad0: 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65    == sqlite3Vdbe
dae0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
daf0: 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
db00: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
db10: 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
db20: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
db30: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
db40: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
db50: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
db60: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
db70: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
db80: 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28  ->u.i;.      if(
db90: 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20   len>nBuf ){.   
dba0: 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b       len = nBuf;
dbb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
dbc0: 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
dbd0: 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
dbe0: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
dbf0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
dc00: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
dc10: 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
dc20: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
dc30: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
dc40: 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
dc50: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
dc60: 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
dc70: 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
dc80: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
dc90: 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
dca0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
dcb0: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
dcc0: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
dcd0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
dce0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
dcf0: 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
dd00: 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
dd10: 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
dd20: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
dd30: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dd40: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
dd50: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
dd60: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
dd90: 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
dda0: 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
ddb0: 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
ddc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
ddd0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
dde0: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
ddf0: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
de00: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
de10: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
de20: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
de30: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
de40: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
de50: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
de60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
de70: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
de80: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
de90: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
dea0: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
deb0: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
dec0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ded0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
dee0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
def0: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
df00: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
df10: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
df20: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
df30: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
df40: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
df50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
df60: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
df70: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
df80: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
df90: 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
dfa0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
dfb0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
dfc0: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
dfd0: 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
dfe0: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
dff0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e000: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e010: 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
e020: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
e030: 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
e040: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e050: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
e060: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
e070: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
e080: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
e090: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
e0a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
e0c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
e0d0: 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
e0e0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
e0f0: 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
e100: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
e110: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
e120: 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
e130: 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
e140: 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
e150: 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
e160: 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
e170: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
e180: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
e190: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
e1a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e1b0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e1c0: 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
e1d0: 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
e1e0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
e1f0: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
e200: 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
e210: 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
e220: 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
e230: 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
e240: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
e250: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e260: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
e270: 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
e280: 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
e290: 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
e2a0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
e2b0: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
e2c0: 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
e2d0: 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
e2e0: 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
e2f0: 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
e300: 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
e310: 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
e320: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
e330: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
e340: 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
e350: 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
e360: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e370: 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
e380: 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
e390: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
e3a0: 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
e3b0: 2e 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  .0;.      double
e3c0: 20 72 32 20 3d 20 72 31 3b 0a 20 20 20 20 20 20   r2 = r1;.      
e3d0: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
e3e0: 6c 6f 61 74 28 72 32 29 3b 0a 20 20 20 20 20 20  loat(r2);.      
e3f0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
e400: 32 29 3d 3d 73 69 7a 65 6f 66 28 74 31 29 20 26  2)==sizeof(t1) &
e410: 26 20 6d 65 6d 63 6d 70 28 26 72 32 2c 20 26 74  & memcmp(&r2, &t
e420: 31 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  1, sizeof(r1))==
e430: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  0 );.#endif..   
e440: 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c     x = (buf[0]<<
e450: 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
e460: 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
e470: 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
e480: 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34   y = (buf[4]<<24
e490: 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29  ) | (buf[5]<<16)
e4a0: 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c   | (buf[6]<<8) |
e4b0: 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78   buf[7];.      x
e4c0: 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
e4d0: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
e4e0: 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
e4f0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
e500: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
e510: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e520: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
e540: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
e550: 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
e560: 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  em->r)==8 );.   
e570: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
e580: 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
e590: 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73 77  (x));.        sw
e5a0: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
e5b0: 61 74 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  at(pMem->r);.   
e5c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e5d0: 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20   = MEM_Real;.   
e5e0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
e5f0: 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 8;.    }.    c
e600: 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
e610: 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
e620: 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
e630: 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70  ger 1 */.      p
e640: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
e650: 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
e660: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e670: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
e680: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
e690: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
e6a0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72    int len = (ser
e6b0: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
e6c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
e6d0: 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
e6e0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
e6f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
e700: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
e710: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
e720: 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
e730: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e740: 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
e750: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e760: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e770: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
e780: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
e790: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
e7a0: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
e7b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
e7c0: 2a 2a 20 54 68 65 20 68 65 61 64 65 72 20 6f 66  ** The header of
e7d0: 20 61 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73   a record consis
e7e0: 74 73 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65  ts of a sequence
e7f0: 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68   variable-length
e800: 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68   integers..** Th
e810: 65 73 65 20 69 6e 74 65 67 65 72 73 20 61 72 65  ese integers are
e820: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73   almost always s
e830: 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63  mall and are enc
e840: 6f 64 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  oded as a single
e850: 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f   byte..** The fo
e860: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61  llowing macro ta
e870: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 74 68  kes advantage th
e880: 69 73 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69  is fact to provi
e890: 64 65 20 61 20 66 61 73 74 20 64 65 63 6f 64 65  de a fast decode
e8a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67  .** of the integ
e8b0: 65 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20  ers in a record 
e8c0: 68 65 61 64 65 72 2e 20 20 49 74 20 69 73 20 66  header.  It is f
e8d0: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
e8e0: 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65  mmon case.** whe
e8f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  re the integer i
e900: 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  s a single byte.
e910: 20 20 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65    It is a little
e920: 20 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65   slower when the
e930: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74  .** integer is t
e940: 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73  wo or more bytes
e950: 2e 20 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69  .  But overall i
e960: 74 20 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  t is faster..**.
e970: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
e980: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
e990: 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a   equivalent:.**.
e9a0: 2a 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  **     x = sqlit
e9b0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 20 41  e3GetVarint32( A
e9c0: 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  , &B );.**.**   
e9d0: 20 20 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28    x = GetVarint(
e9e0: 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23   A, B );.**.*/.#
e9f0: 64 65 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74  define GetVarint
ea00: 28 41 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41  (A,B)  ((B = *(A
ea10: 29 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73  ))<=0x7f ? 1 : s
ea20: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
ea30: 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a  2(A, &B))../*.**
ea40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
ea50: 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
ea60: 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
ea70: 64 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63  dex records spec
ea80: 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b  ified by .** {nK
ea90: 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
eaa0: 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20  {nKey2, pKey2}, 
eab0: 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61  returning a nega
eac0: 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
ead0: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
eae0: 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  r if {nKey1, pKe
eaf0: 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e  y1} is less than
eb00: 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
eb10: 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b  * greater than {
eb20: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20  nKey2, pKey2}.  
eb30: 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65  Both Key1 and Ke
eb40: 79 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20  y2 must be byte 
eb50: 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f  strings.** compo
eb60: 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  sed by the OP_Ma
eb70: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
eb80: 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a  of the VDBE..*/.
eb90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
eba0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
ebb0: 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a  void *userData,.
ebc0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
ebd0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
ebe0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
ebf0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
ec00: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ){.  KeyInfo *pK
ec10: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66  eyInfo = (KeyInf
ec20: 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75  o*)userData;.  u
ec30: 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20  32 d1, d2;      
ec40: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
ec50: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
ec60: 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
ec70: 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64  /.  u32 idx1, id
ec80: 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  x2;      /* Offs
ec90: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
eca0: 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
ecb0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
ecc0: 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20  zHdr1, szHdr2;  
ecd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
ece0: 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
ecf0: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
ed00: 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
ed10: 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
ed20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ed30: 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
ed40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
ed50: 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Key1;.  const un
ed60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
ed70: 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y2 = (const unsi
ed80: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
ed90: 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  2;..  Mem mem1;.
eda0: 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65    Mem mem2;.  me
edb0: 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
edc0: 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65  o->enc;.  mem2.e
edd0: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
ede0: 6e 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20  nc;.  .  idx1 = 
edf0: 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c  GetVarint(aKey1,
ee00: 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
ee10: 20 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20   szHdr1;.  idx2 
ee20: 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79  = GetVarint(aKey
ee30: 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32  2, szHdr2);.  d2
ee40: 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69   = szHdr2;.  nFi
ee50: 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
ee60: 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
ee70: 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
ee80: 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20  idx2<szHdr2 ){. 
ee90: 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
eea0: 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72  pe1;.    u32 ser
eeb0: 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20  ial_type2;..    
eec0: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
eed0: 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
eee0: 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
eef0: 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
ef00: 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72    idx1 += GetVar
ef10: 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  int( aKey1+idx1,
ef20: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
ef30: 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
ef40: 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
ef50: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
ef60: 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
ef70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32   break;.    idx2
ef80: 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61   += GetVarint( a
ef90: 4b 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61  Key2+idx2, seria
efa0: 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69  l_type2 );.    i
efb0: 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20  f( d2>=nKey2 && 
efc0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
efd0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
efe0: 74 79 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b  type2)>0 ) break
eff0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
f000: 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
f010: 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
f020: 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
f030: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
f040: 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
f050: 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
f060: 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73  m1);.    d2 += s
f070: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f080: 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20  Get(&aKey2[d2], 
f090: 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d  serial_type2, &m
f0a0: 65 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em2);..    /* Do
f0b0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
f0c0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
f0d0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
f0e0: 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20  e(&mem1, &mem2, 
f0f0: 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
f100: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
f110: 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31  0);.    if( mem1
f120: 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  .flags & MEM_Dyn
f130: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
f140: 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b  mRelease(&mem1);
f150: 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c  .    if( mem2.fl
f160: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20  ags & MEM_Dyn ) 
f170: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
f180: 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20  lease(&mem2);.  
f190: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
f1a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f1b0: 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  }.    i++;.  }..
f1c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
f1d0: 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
f1e0: 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20  fields, but all 
f1f0: 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
f200: 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a   that point.  **
f210: 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20   were equal. If 
f220: 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67  the incrKey flag
f230: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
f240: 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73  he second key is
f250: 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73  .  ** treated as
f260: 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20   larger..  */.  
f270: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
f280: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69   if( pKeyInfo->i
f290: 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ncrKey ){.      
f2a0: 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  rc = -1;.    }el
f2b0: 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20  se if( d1<nKey1 
f2c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
f2d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
f2e0: 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20  2<nKey2 ){.     
f2f0: 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a   rc = -1;.    }.
f300: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
f310: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
f320: 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e   && i<pKeyInfo->
f330: 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20  nField.         
f340: 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66        && pKeyInf
f350: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
f360: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63   ){.    rc = -rc
f370: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
f380: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
f390: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
f3a0: 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70  index entry comp
f3b0: 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  osed using the O
f3c0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
f3d0: 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  ode..** The last
f3e0: 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72   entry in this r
f3f0: 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
f400: 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63  an integer (spec
f410: 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69  ifically.** an i
f420: 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20  nteger rowid).  
f430: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
f440: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
f450: 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74  of bytes in.** t
f460: 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  hat integer..*/.
f470: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
f480: 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74  dxRowidLen(const
f490: 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
f4a0: 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
f4b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
f4c0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
f4d0: 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
f4e0: 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
f4f0: 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73  he rowid */..  s
f500: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
f510: 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b  2(aKey, &szHdr);
f520: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
f530: 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64  int32(&aKey[szHd
f540: 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
f550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
f560: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
f570: 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
f580: 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  .}.  ../*.** pCu
f590: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
f5a0: 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
f5b0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
f5c0: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
f5d0: 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
f5e0: 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
f5f0: 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
f600: 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
f610: 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
f620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
f630: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
f640: 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
f650: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
f660: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
f670: 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
f680: 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
f690: 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
f6a0: 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
f6b0: 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
f6c0: 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
f6d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6e0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
f6f0: 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
f700: 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
f710: 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
f720: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
f730: 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
f740: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
f750: 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73    Mem m, v;..  s
f760: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
f770: 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
f780: 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
f790: 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  Key<=0 ){.    re
f7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f7b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
f7c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
f7d0: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 64 62 2c  MemFromBtree(db,
f7e0: 20 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b   pCur, 0, nCellK
f7f0: 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
f800: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
f810: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c  rn rc;.  }.  sql
f820: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
f830: 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72  (u8*)m.z, &szHdr
f840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
f850: 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
f860: 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70  z[szHdr-1], &typ
f870: 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f  eRowid);.  lenRo
f880: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
f890: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
f8a0: 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  ypeRowid);.  sql
f8b0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
f8c0: 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
f8d0: 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
f8e0: 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
f8f0: 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
f900: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
f910: 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
f920: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f930: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
f940: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
f950: 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
f960: 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
f970: 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  t to against.** 
f980: 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
f990: 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74  n pKey (of lengt
f9a0: 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20  h nKey).  Write 
f9b0: 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
f9c0: 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
f9d0: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
f9e0: 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
f9f0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
fa00: 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
fa10: 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79  reater than pKey
fa20: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
fa30: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
fa40: 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69  **.** pKey is ei
fa50: 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
fa60: 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
fa70: 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
fa80: 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
fa90: 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
faa0: 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
fab0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
fac0: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
fad0: 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
fae0: 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   well..*/.int sq
faf0: 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
fb00: 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
fb10: 33 20 2a 64 62 2c 0a 20 20 43 75 72 73 6f 72 20  3 *db,.  Cursor 
fb20: 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
fb30: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
fb40: 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
fb50: 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ainst */.  int n
fb60: 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Key, const u8 *p
fb70: 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65  Key,   /* The ke
fb80: 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
fb90: 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbb0: 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
fbc0: 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
fbd0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
fbe0: 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
fbf0: 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
fc00: 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
fc10: 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52  rsor;.  int lenR
fc20: 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  owid;.  Mem m;..
fc30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
fc40: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
fc50: 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43  llKey);.  if( nC
fc60: 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20  ellKey<=0 ){.   
fc70: 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
fc80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fc90: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
fca0: 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
fcb0: 72 65 65 28 64 62 2c 20 70 43 2d 3e 70 43 75 72  ree(db, pC->pCur
fcc0: 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  sor, 0, nCellKey
fcd0: 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
fce0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
fcf0: 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f   rc;.  }.  lenRo
fd00: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
fd10: 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38  eIdxRowidLen((u8
fd20: 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d  *)m.z);.  *res =
fd30: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
fd40: 72 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b  rdCompare(pC->pK
fd50: 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52  eyInfo, m.n-lenR
fd60: 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c  owid, m.z, nKey,
fd70: 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65   pKey);.  sqlite
fd80: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
fd90: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
fda0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fdb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
fdc0: 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
fdd0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
fde0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
fdf0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
fe00: 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
fe10: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
fe20: 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
fe30: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
fe40: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
fe50: 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
fe60: 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
fe70: 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
fe80: 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
fe90: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
fea0: 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
feb0: 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
fec0: 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
fed0: 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
fee0: 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
fef0: 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
ff00: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
ff10: 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
ff20: 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
ff30: 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
ff40: 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
ff50: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
ff60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
ff70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ff80: 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
ff90: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
ffa0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
ffb0: 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
ffc0: 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
ffd0: 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
ffe0: 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
fff0: 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
10000 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
10010 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
10020 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
10030 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
10040 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
10050 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
10060 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
10070 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
10080 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
10090 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
100a0 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
100b0 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
100c0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
100d0 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
100e0 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
100f0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
10100 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
10110 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
10120 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
10130 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
10140 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
10150 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
10160 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
10170 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
10180 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
10190 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
101a0 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
101b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
101c0 62 3b 0a 7d 0a                                   b;.}.