/ Hex Artifact Content
Login

Artifact db33a4c2477546da05e772352be43896d24d51d5:


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 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0660: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65  mt *pStmt){.  re
0670: 74 75 72 6e 20 28 28 56 64 62 65 20 2a 29 70 53  turn ((Vdbe *)pS
0680: 74 6d 74 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f  tmt)->zSql;.}../
0690: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06a0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06b0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06d0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06e0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06f0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0710: 0a 20 20 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74  .  int nTmp;.  t
0720: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0730: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0740: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0750: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0760: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0770: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0780: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0790: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07a0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07b0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07c0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07d0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07e0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07f0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0800: 70 3b 0a 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e  p;.  nTmp = pA->
0810: 6e 53 71 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c  nSql;.  pA->nSql
0820: 20 3d 20 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pB->nSql;.  p
0830: 42 2d 3e 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a  B->nSql = nTmp;.
0840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0850: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0860: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0870: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0880: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0890: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
08a0: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
08b0: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
08c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
08d0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
08e0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  y so that it con
08f0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 4e  tains at least N
0900: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  .** elements..**
0910: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0920: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0930: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0940: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a  ing the array,.*
0950: 2a 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  * Vdbe.aOp and V
0960: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0970: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74  ain unchanged (t
0980: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a  his is so that.*
0990: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  * any opcodes al
09a0: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
09b0: 63 61 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79  can be correctly
09c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20   deallocated.** 
09d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
09e0: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
09f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a00: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56   resizeOpArray(V
0a10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
0a20: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0a30: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0a40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70  p->nOpAlloc;.  p
0a50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a60: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a70: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0a80: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0a90: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0aa0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ab0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  Op = pNew;.    i
0ac0: 66 28 20 4e 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a  f( N>oldSize ){.
0ad0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
0ae0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
0af0: 2c 20 28 4e 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  , (N-oldSize)*si
0b00: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 7d  zeof(Op));.    }
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0b20: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b30: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b40: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b50: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b60: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0b80: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0b90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0ba0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bd0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0bf0: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c10: 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20  *    p1, p2, p3 
0c20: 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a       Operands.**
0c30: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
0c40: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
0c50: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0c60: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0c70: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0c80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0c90: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0ca0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0cb0: 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72  f the P4.** oper
0cc0: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64  te3VdbeAddOp3(Vd
0ce0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0cf0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
0d00: 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p3){.  int i;
0d10: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
0d20: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  .  i = p->nOp;. 
0d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0d40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0d50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
0d60: 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20  OpAlloc<=i ){.  
0d70: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
0d80: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32  p, p->nOpAlloc*2
0d90: 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28   + 100);.    if(
0da0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
0db0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  iled ){.      re
0dc0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
0dd0: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
0de0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
0df0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
0e00: 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20  = op;.  pOp->p1 
0e10: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0e20: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0e30: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0e40: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0e50: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0e60: 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  D;.  p->expired 
0e70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
0e80: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 73  TE_DEBUG.  if( s
0e90: 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f  qlite3_vdbe_addo
0ea0: 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69 74 65  p_trace ) sqlite
0eb0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
0ec0: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
0ed0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
0ee0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
0ef0: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
0f00: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
0f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
0f20: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
0f30: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
0f40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
0f50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0f60: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
0f70: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
0f80: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
0f90: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
0fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
0fb0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0fc0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
0fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
0fe0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
0ff0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1000: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  }.../*.** Add an
1010: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1020: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1030: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
1040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1050: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1060: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1070: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1080: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1090: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
10b0: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
10c0: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
10d0: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
10e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1100: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1110: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1120: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1130: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
1150: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1160: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1170: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
1180: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
1190: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
11a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11b0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
11c0: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
11d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
11e0: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
11f0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1200: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1210: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1220: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1230: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1240: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1250: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1260: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1270: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1280: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1290: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
12a0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
12b0: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
12c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
12d0: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
12e0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
12f0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
1300: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
1310: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
1320: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
1330: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1340: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1350: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1360: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1370: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1380: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1390: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
13a0: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
13b0: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
13c0: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
13d0: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
13e0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
13f0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
1400: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
1410: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
1420: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
1430: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1440: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1460: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1470: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1490: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
14a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
14b0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
14c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
14d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
14e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
14f0: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
1500: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
1510: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
1520: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
1530: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1540: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1550: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1560: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1590: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
15a0: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
15b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
15c0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
15d0: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
15e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
15f0: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1600: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1610: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
1620: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
1630: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
1640: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
1650: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1660: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1670: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1680: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1690: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16a0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
16d0: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
16e0: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
16f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1700: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1710: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
1720: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
1730: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1740: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1750: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20  }.}../*.** Loop 
1770: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
1780: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
1790: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
17a0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  re negative..** 
17b0: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
17c0: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
17d0: 6f 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62  olve the label b
17e0: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32  y setting the P2
17f0: 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73  .** value to its
1800: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
1810: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
1820: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1830: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
1840: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
1850: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
1860: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
1870: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
1880: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
1890: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
18a0: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
18b0: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
18c0: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
18d0: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
18e0: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
18f0: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
1900: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
1910: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
1920: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
1930: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  **.** The intege
1940: 72 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20  r *pMaxStack is 
1950: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1960: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  um number of vdb
1970: 65 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69  e stack.** entri
1980: 65 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61  es that static a
1990: 6e 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20  nalysis reveals 
19a0: 74 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67  this program mig
19b0: 68 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ht need..**.** T
19c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
19d0: 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   does the follow
19e0: 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ing optimization
19f0: 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a  :  It scans for.
1a00: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
1a10: 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65  that might cause
1a20: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
1a30: 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73  lback.  Such ins
1a40: 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  tructions.** are
1a50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
1a60: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
1a70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
1a80: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
1a90: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
1aa0: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
1ab0: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
1ac0: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49  _VRename.**.** I
1ad0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1ae0: 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ction is found, 
1af0: 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65  then every State
1b00: 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ment instruction
1b10: 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20   .** is changed 
1b20: 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74  to a Noop.  In t
1b30: 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
1b40: 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73  d creating the s
1b50: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75  tatement .** jou
1b60: 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65  rnal file unnece
1b70: 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ssarily..*/.stat
1b80: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
1b90: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
1ba0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
1bb0: 67 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61  gs, int *pMaxSta
1bc0: 63 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ck){.  int i;.  
1bd0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30  int nMaxArgs = 0
1be0: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63  ;.  int nMaxStac
1bf0: 6b 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70  k = p->nOp;.  Op
1c00: 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c   *pOp;.  int *aL
1c10: 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c  abel = p->aLabel
1c20: 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74  ;.  int doesStat
1c30: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1c40: 30 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74  0;.  int hasStat
1c50: 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a  ementBegin = 0;.
1c60: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
1c70: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
1c80: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
1c90: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
1ca0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
1cb0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
1cc0: 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20  P_Function ){.  
1cd0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e      if( pOp->p5>
1ce0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1cf0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20  rgs = pOp->p5;. 
1d00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1d10: 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20  ode==OP_AggStep 
1d20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d30: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1d40: 45 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63  E.        || opc
1d50: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a  ode==OP_VUpdate.
1d60: 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
1d70: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
1d80: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1d90: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
1da0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
1db0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a  ode==OP_Halt ){.
1dc0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1dd0: 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  1==SQLITE_CONSTR
1de0: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
1df0: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
1e00: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
1e10: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
1e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e30: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
1e40: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
1e50: 20 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74      hasStatement
1e60: 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  Begin = 1;.    }
1e70: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1e80: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20  =OP_Destroy ){. 
1e90: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
1ea0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
1eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ec0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1ed0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1ee0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
1ef0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
1f00: 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  VRename ){.     
1f10: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1f20: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
1f30: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1f40: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
1f50: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
1f60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
1f70: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
1f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
1f90: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
1fa0: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
1fb0: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
1fc0: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
1fd0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1fe0: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
1ff0: 7d 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  }.    if( !sqlit
2000: 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50  e3VdbeOpcodeHasP
2010: 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65 2c 20  roperty(opcode, 
2020: 4f 50 46 4c 47 5f 50 55 53 48 29 20 29 7b 0a 20  OPFLG_PUSH) ){. 
2030: 20 20 20 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d       nMaxStack--
2040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2050: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f   sqlite3VdbeOpco
2060: 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70  deHasProperty(op
2070: 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50  code, OPFLG_JUMP
2080: 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  ) && pOp->p2<0 )
2090: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20a0: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c  -1-pOp->p2<p->nL
20b0: 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f  abel );.      pO
20c0: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
20d0: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  1-pOp->p2];.    
20e0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
20f0: 66 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  free(p->aLabel);
2100: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
2110: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
2120: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
2130: 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d   *pMaxStack = nM
2140: 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49  axStack;..  /* I
2150: 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62  f we never rollb
2160: 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ack a statement 
2170: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2180: 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  n statement.  **
2190: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
21a0: 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  e not needed.  S
21b0: 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f  o change every O
21c0: 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  P_Statement.  **
21d0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20   opcode into an 
21e0: 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61  OP_Noop.  This a
21f0: 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73  void a call to s
2200: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
2210: 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69  usive().  ** whi
2220: 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73  ch can be expens
2230: 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74  ive on some plat
2240: 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  forms..  */.  if
2250: 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  ( hasStatementBe
2260: 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74  gin && !doesStat
2270: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b  ementRollback ){
2280: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  .    for(pOp=p->
2290: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
22a0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
22b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
22c0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  p->opcode==OP_St
22d0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
22e0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
22f0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
2300: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2310: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2320: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
2330: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
2340: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
2350: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2360: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
2370: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
2380: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
2390: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
23a0: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
23b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
23c0: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
23d0: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
23e0: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
23f0: 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   Return the.** a
2400: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
2410: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64  rst operation ad
2420: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
2430: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
2440: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f  (Vdbe *p, int nO
2450: 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  p, VdbeOpList co
2460: 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74  nst *aOp){.  int
2470: 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28   addr;.  assert(
2480: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2490: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
24a0: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
24b0: 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29   > p->nOpAlloc )
24c0: 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  {.    resizeOpAr
24d0: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 2a 32 20  ray(p, p->nOp*2 
24e0: 2b 20 6e 4f 70 29 3b 0a 20 20 7d 0a 20 20 69 66  + nOp);.  }.  if
24f0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
2500: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
2510: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64  urn 0;.  }.  add
2520: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  r = p->nOp;.  if
2530: 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69  ( nOp>0 ){.    i
2540: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
2550: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
2560: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
2570: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
2580: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
2590: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
25a0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
25b0: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
25c0: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
25d0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
25e0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
25f0: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
2600: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
2610: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f   && sqlite3VdbeO
2620: 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79  pcodeHasProperty
2630: 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f  (pOut->opcode, O
2640: 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20  PFLG_JUMP) ){.  
2650: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
2660: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
2670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2680: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
2690: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
26a0: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
26b0: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
26c0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
26d0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
26e0: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
26f0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
2700: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2710: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28  _DEBUG.      if(
2720: 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64   sqlite3_vdbe_ad
2730: 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a 20 20 20  dop_trace ){.   
2740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2750: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
2760: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
2770: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
2780: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
2790: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
27a0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
27b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
27c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
27d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
27e0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
27f0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2800: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2810: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
2820: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
2830: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
2840: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
2850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2860: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
2870: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
2880: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
2890: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
28a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
28b0: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
28c0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
28d0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
28e0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
28f0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2900: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2910: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2920: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2930: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2940: 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a  addr].p1 = val;.
2950: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2960: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2970: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
2980: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2990: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
29a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
29b0: 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e  seful for settin
29c0: 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  g a jump destina
29d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
29e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
29f0: 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  2(Vdbe *p, int a
2a00: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
2a10: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2a20: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2a30: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2a40: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2a50: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2a60: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2a70: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
2a80: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2a90: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2aa0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
2ab0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
2ac0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
2ad0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2ae0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
2af0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2b00: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2b10: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2b20: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2b30: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2b40: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2b50: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
2b60: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
2b70: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d  ->aOp[addr].p3 =
2b80: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2b90: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2ba0: 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70  lue of the P5 op
2bb0: 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f  erand for the mo
2bc0: 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61  st recently.** a
2bd0: 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  dded operation..
2be0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2bf0: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
2c00: 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20   *p, u8 val){.  
2c10: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2c20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2c30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2c40: 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29  f( p && p->aOp )
2c50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
2c60: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d  >nOp>0 );.    p-
2c70: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
2c80: 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  5 = val;.  }.}..
2c90: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2ca0: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
2cb0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
2cc0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2cd0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
2ce0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
2cf0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
2d00: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
2d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2d20: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
2d30: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
2d40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
2d50: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
2d60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
2d70: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
2d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
2d90: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
2da0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
2db0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
2dc0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
2dd0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
2de0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
2df0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
2e00: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
2e10: 20 20 69 66 28 20 70 44 65 66 20 26 26 20 28 70    if( pDef && (p
2e20: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
2e30: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
2e40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2e50: 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20  3_free(pDef);.  
2e60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
2e70: 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20  e a P4 value if 
2e80: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74  necessary..*/.st
2e90: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34  atic void freeP4
2ea0: 28 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69  (int p4type, voi
2eb0: 64 20 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33  d *p3){.  if( p3
2ec0: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
2ed0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
2ee0: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20  case P4_REAL:.  
2ef0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
2f00: 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  4:.      case P4
2f10: 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20  _MPRINTF:.      
2f20: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
2f30: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
2f40: 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61  EYINFO:.      ca
2f50: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  se P4_KEYINFO_HA
2f60: 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20  NDOFF: {.       
2f70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33   sqlite3_free(p3
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2f90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fa0: 63 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43  case P4_VDBEFUNC
2fb0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
2fc0: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20  Func *pVdbeFunc 
2fd0: 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33  = (VdbeFunc *)p3
2fe0: 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  ;.        freeEp
2ff0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
3000: 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63  pVdbeFunc->pFunc
3010: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3020: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
3030: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
3040: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3050: 65 33 5f 66 72 65 65 28 70 56 64 62 65 46 75 6e  e3_free(pVdbeFun
3060: 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  c);.        brea
3070: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3080: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
3090: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
30a0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
30b0: 6e 28 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b  n((FuncDef*)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 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
30f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
3100: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
3110: 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20  alue*)p3);.     
3120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3130: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
3140: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f  /*.** Change N o
3150: 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20  pcodes starting 
3160: 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70  at addr to No-op
3170: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3180: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
3190: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
31a0: 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  addr, int N){.  
31b0: 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20  if( p && p->aOp 
31c0: 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  ){.    VdbeOp *p
31d0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
31e0: 72 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e  r];.    while( N
31f0: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  -- ){.      free
3200: 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  P4(pOp->p4type, 
3210: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
3220: 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c    memset(pOp, 0,
3230: 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29   sizeof(pOp[0]))
3240: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63  ;.      pOp->opc
3250: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
3260: 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20       pOp++;.    
3270: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
3280: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
3290: 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  of the P4 operan
32a0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
32b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
32c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
32d0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
32e0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
32f0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
3300: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
3310: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
3320: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
3330: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
3340: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
3350: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
3360: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
3370: 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70  0 then the P4 op
3380: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
3390: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
33a0: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
33b0: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
33c0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
33d0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
33e0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20  _malloc()..** A 
33f0: 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65  value of n==0 me
3400: 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f  ans copy bytes o
3410: 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20  f zP4 up to and 
3420: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a  including the.**
3430: 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65   first null byte
3440: 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63  .  If n>0 then c
3450: 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66  opy n+1 bytes of
3460: 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e   zP4..**.** If n
3470: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20  ==P4_KEYINFO it 
3480: 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69  means that zP4 i
3490: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
34a0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
34b0: 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73  re..** A copy is
34c0: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79   made of the Key
34d0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
34e0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
34f0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
3500: 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62  te3_malloc, to b
3510: 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65  e freed when the
3520: 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a   Vdbe is finaliz
3530: 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59  ed..** n==P4_KEY
3540: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64  INFO_HANDOFF ind
3550: 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20  icates that zP4 
3560: 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49  points to a KeyI
3570: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  nfo structure.**
3580: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
3590: 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  y that the calle
35a0: 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66  r has obtained f
35b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
35c0: 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c  oc. The .** call
35d0: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72  er should not fr
35e0: 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ee the allocatio
35f0: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  n, it will be fr
3600: 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62  eed when the Vdb
3610: 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65  e is.** finalize
3620: 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  d..** .** Other 
3630: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
3640: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
3650: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
3660: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
3670: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
3680: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
3690: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
36a0: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
36b0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
36c0: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
36d0: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
36e0: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
36f0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
3700: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
3710: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
3720: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
3730: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
3740: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3750: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
3760: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
3770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
3780: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
3790: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pOp;.  assert( p
37a0: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
37b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
37c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
37d0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  | p->aOp==0 || p
37e0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
37f0: 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20  ed ){.    if (n 
3800: 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b  != P4_KEYINFO) {
3810: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 6e 2c  .      freeP4(n,
3820: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
3830: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
3840: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3850: 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64  if( addr<0 || ad
3860: 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  dr>=p->nOp ){.  
3870: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
3880: 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64  - 1;.    if( add
3890: 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  r<0 ) return;.  
38a0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
38b0: 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50  p[addr];.  freeP
38c0: 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  4(pOp->p4type, p
38d0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
38e0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
38f0: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
3900: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
3910: 20 28 69 6e 74 29 7a 50 34 3b 0a 20 20 20 20 70   (int)zP4;.    p
3920: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a  Op->p4type = n;.
3930: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d    }else if( zP4=
3940: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  =0 ){.    pOp->p
3950: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  4.p = 0;.    pOp
3960: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
3970: 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TUSED;.  }else i
3980: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
3990: 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
39a0: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  *pKeyInfo;.    i
39b0: 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65  nt nField, nByte
39c0: 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20  ;..    nField = 
39d0: 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d  ((KeyInfo*)zP4)-
39e0: 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79  >nField;.    nBy
39f0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65  te = sizeof(*pKe
3a00: 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64  yInfo) + (nField
3a10: 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49  -1)*sizeof(pKeyI
3a20: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b  nfo->aColl[0]) +
3a30: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65   nField;.    pKe
3a40: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f  yInfo = sqlite3_
3a50: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
3a60: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
3a70: 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
3a80: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e  ;.    if( pKeyIn
3a90: 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  fo ){.      unsi
3aa0: 67 6e 65 64 20 63 68 61 72 20 2a 61 53 6f 72 74  gned char *aSort
3ab0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
3ac0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3ad0: 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  4, nByte);.     
3ae0: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
3af0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3b00: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
3b10: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
3b20: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
3b30: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
3b40: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
3b50: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
3b60: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
3b70: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
3b80: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
3b90: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
3ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
3bb0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
3bc0: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3bd0: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
3be0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3bf0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3c00: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3c10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
3c20: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
3c30: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
3c40: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3c50: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3c60: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
3c70: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
3c80: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
3c90: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
3ca0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3cb0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3cc0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3cd0: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34  ) n = strlen(zP4
3ce0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
3cf0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
3d00: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
3d10: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
3d20: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
3d30: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3d40: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
3d50: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
3d60: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
3d70: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
3d80: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
3d90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3da0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
3db0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3dc0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
3dd0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65  _list ap;.  asse
3de0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
3df0: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
3e00: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
3e10: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
3e20: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
3e30: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
3e40: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
3e50: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 76   p->nOp ){.    v
3e60: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
3e70: 6d 61 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  mat);.    p->aOp
3e80: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
3e90: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  ent = sqlite3VMP
3ea0: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
3eb0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
3ec0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
3ed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
3ee0: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
3ef0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
3f00: 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  ress..*/.VdbeOp 
3f10: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
3f20: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
3f30: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
3f40: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3f50: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
3f60: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
3f70: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
3f80: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3f90: 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 65 74 75  Failed );.  retu
3fa0: 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26 26 20  rn ((addr>=0 && 
3fb0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70  addr<p->nOp)?(&p
3fc0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b  ->aOp[addr]):0);
3fd0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
3fe0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
3ff0: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
4000: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
4010: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
4020: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
4030: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4040: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
4050: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
4060: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
4070: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
4080: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
4090: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
40a0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
40b0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
40c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
40d0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
40e0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
40f0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
4100: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
4110: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
4120: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
4130: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
4140: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
4150: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
4160: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
4170: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
4180: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4190: 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
41a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
41b0: 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f   zTemp, "keyinfo
41c0: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
41d0: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69  nField);.      i
41e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29   = strlen(zTemp)
41f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
4200: 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   j<pKeyInfo->nFi
4210: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
4220: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
4230: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
4240: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
4250: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
4260: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
4270: 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  trlen(pColl->zNa
4280: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
4290: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
42a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
42b0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
42c0: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
42d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
42e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
42f0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
4300: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
4310: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
4320: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
4330: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
4340: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
4350: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
4360: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
4370: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
4380: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
4390: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20  l->zName,n+1);. 
43a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
43b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
43c0: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
43d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
43e0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
43f0: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  il",4);.        
4400: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
4410: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4420: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
4430: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
4440: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
4450: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
4460: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4470: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4480: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
4490: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
44a0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
44b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
44c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
44d0: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
44e0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
44f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
4500: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4510: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
4520: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
4530: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
4540: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
4550: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4560: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
4570: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
4580: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
4590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
45a0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
45b0: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
45c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
45d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
45e0: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
45f0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4610: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
4620: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4630: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4640: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
4650: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4660: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4670: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
4680: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4690: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
46a0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
46b0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
46c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
46d0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
46e0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
46f0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
4700: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
4710: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
4720: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
4730: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
4740: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
4750: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
4760: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4770: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4780: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
4790: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
47a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
47b0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
47c0: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
47d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
47e0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
47f0: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
4800: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4810: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
4820: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
4830: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4840: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4850: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
4860: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4870: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
4880: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4890: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
48a0: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
48b0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
48c0: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
48d0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
48e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
48f0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
4900: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
4910: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
4920: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4930: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
4940: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
4950: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
4960: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
4970: 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  0 || pOp->opcode
4980: 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  ==OP_Noop ){.   
4990: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
49a0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
49b0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
49c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
49d0: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
49e0: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
49f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
4a00: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
4a10: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
4a20: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
4a30: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
4a40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4a50: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
4a60: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
4a70: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
4a80: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
4a90: 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
4aa0: 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70  sert( i<sizeof(p
4ab0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
4ac0: 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b  ;.  mask = 1<<i;
4ad0: 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65  .  if( (p->btree
4ae0: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
4af0: 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d  ){.    p->btreeM
4b00: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
4b10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
4b20: 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70  exArrayInsert(&p
4b30: 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d  ->aMutex, p->db-
4b40: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
4b50: 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  }.}...#if define
4b60: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
4b70: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4b80: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
4b90: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
4ba0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
4bb0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4bc0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
4bd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4be0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
4bf0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
4c00: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
4c10: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
4c20: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
4c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
4c40: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
4c50: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
4c60: 34 73 20 25 2e 32 58 5c 6e 22 3b 0a 20 20 69 66  4s %.2X\n";.  if
4c70: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
4c80: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
4c90: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
4ca0: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
4cb0: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
4cc0: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
4cd0: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
4ce0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
4cf0: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
4d00: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
4d10: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
4d20: 3e 70 35 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  >p5);.  fflush(p
4d30: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
4d40: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
4d50: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
4d60: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
4d70: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
4d80: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
4d90: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
4da0: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  ){.    while( N-
4db0: 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ->0 ){.      ass
4dc0: 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b 30 5d  ert( N<2 || p[0]
4dd0: 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a  .db==p[1].db );.
4de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4df0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29  eMemRelease(p++)
4e00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
4e10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4e20: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
4e30: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
4e40: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
4e50: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
4e60: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
4e70: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
4e80: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
4e90: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
4ea0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
4eb0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
4ec0: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
4ed0: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
4ee0: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
4ef0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
4f00: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
4f10: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
4f20: 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IN"..*/.int sqli
4f30: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
4f40: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
4f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4f60: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  VDBE */.){.  sql
4f70: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4f80: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4f90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4fa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
4fb0: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
4fc0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
4fd0: 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72  AGIC_RUN ) retur
4fe0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
4ff0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
5000: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
5010: 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73  IC_BUSY );.  ass
5020: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
5030: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
5040: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a  SQLITE_BUSY );..
5050: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
5060: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
5070: 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d 69  s not put dynami
5080: 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74  c strings onto t
5090: 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  he.  ** the stac
50a0: 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65 63 6f  k, they may beco
50b0: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
50c0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
50d0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
50e0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
50f0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
5100: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
5110: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ing..  */.  if( 
5120: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 29 7b  p->pResultSet ){
5130: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
5140: 72 72 61 79 28 70 2d 3e 70 52 65 73 75 6c 74 53  rray(p->pResultS
5150: 65 74 2c 20 35 29 3b 0a 20 20 20 20 70 2d 3e 70  et, 5);.    p->p
5160: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20  ResultSet = 0;. 
5170: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
5180: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
5190: 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26  ile( i<p->nOp &&
51a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
51b0: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
51c0: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
51d0: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f  ;.  if( i>=p->nO
51e0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  p ){.    p->rc =
51f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5200: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
5210: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
5220: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
5230: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
5240: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5250: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
5260: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
5270: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
5280: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
5290: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
52a0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
52b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70  }else{.    Op *p
52c0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
52d0: 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
52e0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
52f0: 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20   p->aStack;.    
5300: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
5310: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
5320: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5330: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
5340: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5350: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
5360: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
5390: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
53a0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
53b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
53c0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
53d0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
53e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
53f0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
5400: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
5410: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
5420: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
5430: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5440: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5450: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5460: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
5470: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
5480: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
5490: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
54a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
54b0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
54c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
54d0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
54e0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
5510: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5520: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5530: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5540: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5550: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
5560: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
5590: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
55a0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
55b0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
55c0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
55d0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
55e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
55f0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
5600: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
5630: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
5640: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5650: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  GER;.      pMem+
5660: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d  +;.    }..    pM
5670: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5680: 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45  Ephem|MEM_Str|ME
5690: 4d 5f 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 50  M_Term;     /* P
56a0: 34 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  4 */.    pMem->z
56b0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
56c0: 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20  , pMem->zShort, 
56d0: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68  sizeof(pMem->zSh
56e0: 6f 72 74 29 29 3b 0a 20 20 20 20 61 73 73 65 72  ort));.    asser
56f0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
5700: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73  .    pMem->n = s
5710: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5720: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
5730: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
5740: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5750: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70  LITE_UTF8;.    p
5760: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
5770: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
5780: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
5790: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
57a0: 5f 54 65 72 6d 7c 4d 45 4d 5f 53 68 6f 72 74 3b  _Term|MEM_Short;
57b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
57c0: 20 73 70 72 69 6e 74 66 28 70 4d 65 6d 2d 3e 7a   sprintf(pMem->z
57d0: 53 68 6f 72 74 2c 20 22 25 2e 32 78 22 2c 20 70  Short, "%.2x", p
57e0: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
57f0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
5800: 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74  z = pMem->zShort
5810: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
5820: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5830: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
5840: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
5850: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
5860: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
5870: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
58a0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
58b0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
58c0: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
58d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
58e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
58f0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
5900: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
5910: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
5920: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
5930: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
5940: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
5950: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
5960: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
5970: 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65     }..    p->nRe
5980: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35 2a  sColumn = 8 - 5*
5990: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
59a0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d      p->pTos = pM
59b0: 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  em;.    p->rc = 
59c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
59d0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
59e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
59f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5a00: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
5a10: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
5a20: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
5a30: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
5a40: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
5a50: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
5a60: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
5a70: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
5a80: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
5a90: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
5aa0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
5ab0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
5ac0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
5ad0: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
5ae0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
5af0: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
5b00: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
5b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5b20: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77  pOp->p4.z;.    w
5b30: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
5b40: 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  u8*)z) ) z++;.  
5b50: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b    printf("SQL: [
5b60: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a  %s]\n", z);.  }.
5b70: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
5b80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5b90: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
5ba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5bb0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
5bc0: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
5bd0: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
5be0: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
5bf0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5c00: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
5c10: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
5c20: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
5c30: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
5c40: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63   sqlite3_io_trac
5c50: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5c60: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
5c70: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
5c80: 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69  >aOp[nOp-1];.  i
5c90: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
5ca0: 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e  OP_Noop && pOp->
5cb0: 70 34 2e 70 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.p!=0 ){.    i
5cc0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
5cd0: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
5ce0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5cf0: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
5d00: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  s", pOp->p4.p);.
5d10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73      for(i=0; iss
5d20: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
5d30: 68 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  har)z[i]); i++){
5d40: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
5d50: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
5d60: 20 69 66 28 20 69 73 73 70 61 63 65 28 28 75 6e   if( isspace((un
5d70: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d  signed char)z[i]
5d80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
5d90: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
5da0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
5db0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
5dc0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
5dd0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
5de0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
5df0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
5e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f  ;.    sqlite3_io
5e10: 5f 74 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  _trace("SQL %s\n
5e20: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
5e30: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
5e40: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
5e50: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
5e60: 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72  CE */.../*.** Pr
5e70: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
5e80: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
5e90: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
5ea0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
5eb0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
5ec0: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
5ed0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
5ee0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
5ef0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
5f00: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
5f10: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
5f20: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
5f30: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
5f40: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
5f50: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
5f60: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
5f70: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
5f80: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
5f90: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
5fa0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
5fb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5fc0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
5fd0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ff0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
6000: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6020: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
6030: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
6040: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
6050: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
6060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6070: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
6080: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
6090: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
60a0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
60b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
60c0: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
60d0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
60e0: 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20  isExplain       
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6100: 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49  ue if the EXPLAI
6110: 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72  N keywords is pr
6120: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  esent */.){.  in
6130: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
6140: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61  db = p->db;..  a
6150: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
6160: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
6170: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
6180: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
6190: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
61a0: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
61b0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
61c0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
61d0: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
61e0: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
61f0: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
6200: 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73  than later. This
6210: 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73 65  .   * is because
6220: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73   the call to res
6230: 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c  izeOpArray() bel
6240: 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68  ow may shrink th
6250: 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20  e.   * p->aOp[] 
6260: 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65  array to save me
6270: 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77  mory if called w
6280: 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49  hen in VDBE_MAGI
6290: 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74  C_RUN .   * stat
62a0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61  e..   */.  p->ma
62b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
62c0: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69  _RUN;..  /* No i
62d0: 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20  nstruction ever 
62e0: 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e  pushes more than
62f0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
6300: 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  t onto the.  ** 
6310: 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20  stack.  And the 
6320: 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77  stack never grow
6330: 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20  s on successive 
6340: 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68  executions of th
6350: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70  e.  ** same loop
6360: 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20  .  So the total 
6370: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75  number of instru
6380: 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70  ctions is an upp
6390: 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e  er bound.  ** on
63a0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61   the maximum sta
63b0: 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72 65  ck depth require
63c0: 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65 72  d.  (Added later
63d0: 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73  :)  The.  ** res
63e0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20 63  olveP2Values() c
63f0: 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74  all computes a t
6400: 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f 75  ighter upper bou
6410: 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73  nd on the.  ** s
6420: 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a  tack size..  **.
6430: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20    ** Allocation 
6440: 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70  all the stack sp
6450: 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72  ace we will ever
6460: 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   need..  */.  if
6470: 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29  ( p->aStack==0 )
6480: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20  {.    int nArg; 
6490: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
64a0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
64b0: 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72  passed to a user
64c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
64d0: 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20    int nStack;   
64e0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
64f0: 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74  ber of stack ent
6500: 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f  ries required */
6510: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
6520: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26  lues(p, &nArg, &
6530: 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73  nStack);.    res
6540: 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d  izeOpArray(p, p-
6550: 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72  >nOp);.    asser
6560: 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20  t( nVar>=0 );.  
6570: 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b    assert( nStack
6580: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69  <p->nOp );.    i
6590: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a  f( isExplain ){.
65a0: 20 20 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 31        nStack = 1
65b0: 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  6;.    }.    p->
65c0: 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  aStack = sqlite3
65d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
65e0: 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b 2a  .        nStack*
65f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b  sizeof(p->aStack
6600: 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61 63  [0])    /* aStac
6610: 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72  k */.      + nAr
6620: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20  g*sizeof(Mem*)  
6630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6640: 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20  pArg */.      + 
6650: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6670: 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20  * aVar */.      
6680: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  + nVar*sizeof(ch
6690: 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  ar*)            
66a0: 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20   /* azVar */.   
66b0: 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66     + nMem*sizeof
66c0: 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20  (Mem)           
66d0: 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20      /* aMem */. 
66e0: 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73       + nCursor*s
66f0: 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 2b  izeof(Cursor*) +
6700: 20 31 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a   1    /* apCsr *
6710: 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  /.    );.    if(
6720: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
6730: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
6740: 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Mem = &p->aStack
6750: 5b 6e 53 74 61 63 6b 2d 31 5d 3b 20 20 2f 2a 20  [nStack-1];  /* 
6760: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
6770: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
6780: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
6790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
67a0: 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20     /*       not 
67b0: 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a  from 0..nMem-1 *
67c0: 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20  /.      p->aVar 
67d0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b  = &p->aMem[nMem+
67e0: 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61  1];.      p->nVa
67f0: 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20  r = nVar;.      
6800: 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20  p->okVar = 0;.  
6810: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28      p->apArg = (
6820: 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e  Mem**)&p->aVar[n
6830: 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Var];.      p->a
6840: 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26  zVar = (char**)&
6850: 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a  p->apArg[nArg];.
6860: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d        p->apCsr =
6870: 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61   (Cursor**)&p->a
6880: 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  zVar[nVar];.    
6890: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
68a0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f  Cursor;.      fo
68b0: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
68c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
68d0: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
68e0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
68f0: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
6900: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = db;.      }.  
6910: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
6920: 53 74 61 63 6b 3b 20 6e 2b 2b 29 7b 0a 20 20 20  Stack; n++){.   
6930: 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 6e       p->aStack[n
6940: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
6950: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
6960: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 70 2d 3e 6e 4d  or(n=1; n<=p->nM
6970: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d  em; n++){.    p-
6980: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
6990: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
69a0: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64  ->aMem[n].db = d
69b0: 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 54 6f  b;.  }..  p->pTo
69c0: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d  s = &p->aStack[-
69d0: 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  1];.  p->pc = -1
69e0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
69f0: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71  TE_OK;.  p->uniq
6a00: 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ueCnt = 0;.  p->
6a10: 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b  returnDepth = 0;
6a20: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
6a30: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
6a40: 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20 30  p->popStack =  0
6a50: 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c  ;.  p->explain |
6a60: 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70  = isExplain;.  p
6a70: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
6a80: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
6a90: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
6aa0: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
6ab0: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
6ac0: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
6ad0: 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65  p->openedStateme
6ae0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
6af0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
6b00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
6b10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
6b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
6b30: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
6b40: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
6b50: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20  .cycles = 0;.   
6b60: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
6b70: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
6b80: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
6b90: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
6ba0: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
6bb0: 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a 20  rsor happens.** 
6bc0: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
6bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
6be0: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
6bf0: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
6c00: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
6c10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6c20: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
6c30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
6c40: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
6c50: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
6c60: 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42   }.  if( pCx->pB
6c70: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
6c80: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
6c90: 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  pBt);.  }.#ifnde
6ca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6cb0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
6cc0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
6cd0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
6ce0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
6cf0: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
6d00: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
6d10: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
6d20: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
6d30: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
6d40: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
6d50: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  hod = 1;.    sql
6d60: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 2d  ite3SafetyOff(p-
6d70: 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c  >db);.    pModul
6d80: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
6d90: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
6da0: 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64  te3SafetyOn(p->d
6db0: 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  b);.    p->inVta
6dc0: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
6dd0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
6de0: 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61 74  3_free(pCx->pDat
6df0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  a);.  sqlite3_fr
6e00: 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 0a  ee(pCx->aType);.
6e10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6e20: 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Cx);.}../*.** Cl
6e30: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
6e40: 65 78 63 65 70 74 20 66 6f 72 20 56 54 61 62 20  except for VTab 
6e50: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
6e60: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e   currently.** in
6e70: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
6e80: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
6e90: 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65  sorsExceptActive
6ea0: 56 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b 0a  Vtabs(Vdbe *p){.
6eb0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
6ec0: 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74  ->apCsr==0 ) ret
6ed0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
6ee0: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
6ef0: 2b 29 7b 0a 20 20 20 20 43 75 72 73 6f 72 20 2a  +){.    Cursor *
6f00: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
6f10: 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26 20  ;.    if( pC && 
6f20: 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f  (!p->inVtabMetho
6f30: 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62 43  d || !pC->pVtabC
6f40: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
6f50: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
6f60: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
6f70: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
6f80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
6f90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
6fa0: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
6fb0: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
6fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
6fd0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
6fe0: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
6ff0: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
7000: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
7010: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
7020: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
7030: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
7040: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
7050: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
7060: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7070: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
7080: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
7090: 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20   p->aStack ){.  
70a0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
70b0: 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 31 20 2b  y(p->aStack, 1 +
70c0: 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e 61   (p->pTos - p->a
70d0: 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 70 2d 3e  Stack));.    p->
70e0: 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63  pTos = &p->aStac
70f0: 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  k[-1];.  }.  clo
7100: 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65  seAllCursorsExce
7110: 70 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29  ptActiveVtabs(p)
7120: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
7130: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
7140: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c   p->nMem);.  sql
7150: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
7160: 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20  r(&p->sFifo);.  
7170: 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  if( p->contextSt
7180: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ack ){.    for(i
7190: 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74  =0; i<p->context
71a0: 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a  StackTop; i++){.
71b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
71c0: 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63  eFifoClear(&p->c
71d0: 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73  ontextStack[i].s
71e0: 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Fifo);.    }.   
71f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
7200: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a  >contextStack);.
7210: 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74    }.  p->context
7220: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  Stack = 0;.  p->
7230: 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74  contextStackDept
7240: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  h = 0;.  p->cont
7250: 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b  extStackTop = 0;
7260: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7270: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
7280: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
7290: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
72a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
72b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
72c0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
72d0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
72e0: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
72f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
7300: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
7310: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
7320: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
7330: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
7340: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
7350: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
7360: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
7370: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
7380: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
7390: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
73a0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
73b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
73c0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
73d0: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
73e0: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
73f0: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
7400: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
7410: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
7420: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
7430: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
7440: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c  te3_free(p->aCol
7450: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
7460: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
7470: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
7480: 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b  mn = nResColumn;
7490: 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
74a0: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
74b0: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
74c0: 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73 69 7a  cZero(p->db, siz
74d0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
74e0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
74f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
7500: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
7510: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
7520: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
7530: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
7540: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
7550: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
7560: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7570: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
7580: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
7590: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
75a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
75b0: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
75c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
75d0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
75e0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
75f0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
7600: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
7610: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
7620: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
7630: 2a 20 49 66 20 4e 3d 3d 50 34 5f 53 54 41 54 49  * If N==P4_STATI
7640: 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  C  it means that
7650: 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e   zName is a poin
7660: 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e  ter to a constan
7670: 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69  t static.** stri
7680: 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75  ng and we can ju
7690: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
76a0: 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50 34  ter. If it is P4
76b0: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a  _DYNAMIC, then .
76c0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
76d0: 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
76e0: 69 74 65 33 5f 66 72 65 65 28 29 20 77 68 65 6e  ite3_free() when
76f0: 20 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e   the vdbe is fin
7700: 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74  ished with.** it
7710: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62  . Otherwise, N b
7720: 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72  ytes of zName ar
7730: 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74  e copied..*/.int
7740: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
7750: 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20  olName(Vdbe *p, 
7760: 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 76 61 72  int idx, int var
7770: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
7780: 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ame, int N){.  i
7790: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
77a0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
77b0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
77c0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
77d0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
77e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
77f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
7800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
7810: 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  M;.  assert( p->
7820: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
7830: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
7840: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
7850: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
7860: 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 34 5f 44  );.  if( N==P4_D
7870: 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 34 5f  YNAMIC || N==P4_
7880: 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63  STATIC ){.    rc
7890: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
78a0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
78b0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
78c0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
78d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73  _STATIC);.  }els
78e0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
78f0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
7900: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
7910: 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , N, SQLITE_UTF8
7920: 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
7930: 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  T);.  }.  if( rc
7940: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e  ==SQLITE_OK && N
7950: 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  ==P4_DYNAMIC ){.
7960: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
7970: 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d  ags = (pColName-
7980: 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61  >flags&(~MEM_Sta
7990: 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20  tic))|MEM_Dyn;. 
79a0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65     pColName->xDe
79b0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
79c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
79d0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
79e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
79f0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
7a00: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
7a10: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
7a20: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
7a30: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
7a40: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
7a50: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
7a60: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
7a70: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
7a80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
7a90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
7aa0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
7ab0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7ac0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
7ad0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
7ae0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
7af0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
7b00: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
7b10: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
7b20: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
7b30: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
7b40: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
7b50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7b60: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
7b70: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f   = 0;..  /* Befo
7b80: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
7b90: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
7ba0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
7bb0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
7bc0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
7bd0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
7be0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
7bf0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
7c00: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
7c10: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
7c20: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
7c30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
7c40: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
7c50: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
7c60: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
7c70: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
7c80: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
7c90: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
7ca0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
7cb0: 74 61 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b  tabSync(db, rc);
7cc0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7cd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
7ce0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
7cf0: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
7d00: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
7d10: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
7d20: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
7d30: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
7d40: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
7d50: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
7d60: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
7d70: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
7d80: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
7d90: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
7da0: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
7db0: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
7dc0: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
7dd0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
7de0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
7df0: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
7e00: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
7e10: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
7e20: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
7e30: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
7e40: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
7e50: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
7e60: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
7e70: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
7e80: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
7e90: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
7ea0: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
7eb0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
7ec0: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
7ed0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
7ee0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
7ef0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7f00: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
7f10: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
7f20: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
7f30: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
7f40: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
7f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
7f60: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
7f70: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
7f80: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
7f90: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  mitArg);.    sql
7fa0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
7fb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
7fc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7fd0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
7fe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7ff0: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
8000: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
8010: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
8020: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
8030: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
8040: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
8050: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
8060: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
8070: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
8080: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
8090: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
80a0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
80b0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
80c0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
80d0: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
80e0: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
80f0: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
8100: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
8110: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  .  In that case 
8120: 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73  we do.  ** not s
8130: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
8140: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
8150: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d  , so use the sim
8160: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20  ple case then.  
8170: 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ** too..  */.  i
8180: 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c  f( 0==strlen(sql
8190: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
81a0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
81b0: 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c  pBt)) || nTrans<
81c0: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =1 ){.    for(i=
81d0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
81e0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
81f0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
8200: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
8210: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
8220: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
8230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8240: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
8250: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
8260: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
8270: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
8280: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
8290: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
82a0: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
82b0: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
82c0: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
82d0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
82e0: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
82f0: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
8300: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
8310: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
8320: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
8330: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
8340: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
8350: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
8360: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
8370: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
8380: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
8390: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
83a0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
83b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
83c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
83d0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
83e0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
83f0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
8400: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
8410: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
8420: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
8430: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8440: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8450: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8460: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
8470: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
8480: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
8490: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
84a0: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
84b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
84c0: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
84d0: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
84e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
84f0: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
8500: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
8510: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
8520: 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69  tomicly..  */.#i
8530: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8540: 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
8550: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
8560: 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
8570: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  s;.    int needS
8580: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ync = 0;.    cha
8590: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
85a0: 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
85b0: 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
85c0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
85d0: 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
85e0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
85f0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
8600: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
8610: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
8620: 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
8630: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
8640: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
8650: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
8660: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
8670: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
8680: 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73   random;.      s
8690: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
86a0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
86b0: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
86c0: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
86d0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
86e0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
86f0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
8700: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
8710: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
8720: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
8730: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
8740: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8750: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8760: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
8770: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
8780: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
8790: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
87a0: 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  S) );..    /* Op
87b0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
87c0: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63  urnal. */.    rc
87d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
87e0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
87f0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
8800: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8810: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
8820: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
8830: 45 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  E|.        SQLIT
8840: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
8850: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
8860: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
8870: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
8880: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8890: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
88a0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
88b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
88c0: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
88d0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
88e0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
88f0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
8900: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
8910: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
8920: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
8930: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8940: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
8950: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
8960: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
8980: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
8990: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
89a0: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
89b0: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
89c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
89d0: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
89e0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
89f0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
8a00: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
8a10: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
8a20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8a30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
8a40: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8a50: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8a60: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
8a70: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
8a80: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
8a90: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
8aa0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
8ab0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
8ac0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8ad0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
8ae0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8af0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
8b00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
8b10: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
8b20: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
8b30: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
8b40: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
8b50: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
8b60: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
8b70: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
8b80: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
8b90: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
8ba0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
8bb0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8bc0: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
8bd0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c  strlen(zFile)+1,
8be0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
8bf0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c    offset += strl
8c00: 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  en(zFile)+1;.   
8c10: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8c20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8c30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8c40: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
8c50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8c60: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
8c70: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
8c80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8c90: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
8ca0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
8cb0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
8cc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8cd0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
8ce0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8cf0: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
8d00: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
8d10: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
8d20: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
8d30: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
8d40: 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d  .    zMainFile =
8d50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8d60: 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  Dirname(db->aDb[
8d70: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  0].pBt);.    if(
8d80: 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20   (needSync .    
8d90: 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74 65 33   && (0==(sqlite3
8da0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
8db0: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
8dc0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
8dd0: 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20 20 20  QUENTIAL)).     
8de0: 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73  && (rc=sqlite3Os
8df0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
8e00: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
8e10: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  ))!=SQLITE_OK) )
8e20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
8e30: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
8e40: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8e50: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
8e60: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
8e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8e80: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
8e90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8ea0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
8eb0: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
8ec0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
8ed0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
8ee0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
8ef0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
8f00: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
8f10: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
8f20: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
8f30: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
8f40: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
8f50: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
8f60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8f70: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
8f80: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
8f90: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
8fa0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
8fb0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
8fc0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
8fd0: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
8fe0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
8ff0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
9000: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9010: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
9020: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
9030: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
9040: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
9050: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9060: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
9070: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
9080: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
9090: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
90a0: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  re occured..    
90b0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
90c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
90d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
90e0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
90f0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
9100: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
9110: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
9120: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9130: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
9140: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
9150: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9160: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
9170: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
9180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9190: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
91a0: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
91b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
91c0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
91d0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
91e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
91f0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
9200: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
9210: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
9220: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
9230: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
9240: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
9250: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
9260: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
9270: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
9280: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
9290: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
92a0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
92b0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
92c0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
92d0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
92e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
92f0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
9310: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
9320: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
9330: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9340: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
9350: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
9360: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
9370: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
9380: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
9390: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
93a0: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
93b0: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
93c0: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
93d0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
93e0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
93f0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
9400: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
9410: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
9420: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
9430: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
9440: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
9450: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
9460: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
9470: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
9480: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
9490: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
94a0: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
94b0: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
94c0: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
94d0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
94e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
94f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
9500: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
9510: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
9520: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
9530: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9540: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9550: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9560: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e    }.    }.    en
9570: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
9580: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
9590: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
95a0: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
95b0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
95c0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
95d0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
95e0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
95f0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
9600: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
9610: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
9620: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
9630: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
9640: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
9650: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
9660: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
9670: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
9680: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
9690: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
96a0: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
96b0: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
96c0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
96d0: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
96e0: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
96f0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
9700: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
9710: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
9720: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
9730: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
9740: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
9750: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
9760: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
9770: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
9780: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9790: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
97a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
97b0: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
97c0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
97d0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
97e0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
97f0: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
9800: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  veVdbeCnt );.}.#
9810: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
9820: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
9830: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
9840: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
9850: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
9860: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
9870: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
9880: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
9890: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
98a0: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
98b0: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
98c0: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
98d0: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
98e0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
98f0: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
9900: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
9910: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
9920: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
9930: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
9940: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
9950: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
9960: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
9970: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
9980: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
9990: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
99a0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
99b0: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
99c0: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
99d0: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
99e0: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
99f0: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
9a00: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
9a10: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
9a20: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
9a30: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
9a40: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
9a50: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
9a60: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
9a70: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
9a80: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
9a90: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
9aa0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
9ab0: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
9ac0: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
9ad0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
9ae0: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
9af0: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
9b00: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
9b10: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
9b20: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
9b30: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
9b40: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
9b50: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9b60: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
9b70: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9b80: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
9b90: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
9ba0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
9bb0: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
9bc0: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
9bd0: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
9be0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9bf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9c00: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
9c10: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
9c20: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
9c30: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
9c40: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
9c50: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
9c60: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
9c70: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
9c80: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
9c90: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
9ca0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
9cb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9cc0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
9cd0: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
9ce0: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
9cf0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
9d00: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
9d10: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
9d20: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
9d30: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
9d40: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
9d50: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
9d60: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
9d70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
9d80: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
9d90: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
9da0: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
9db0: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
9dc0: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
9dd0: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
9de0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
9df0: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
9e00: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
9e10: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
9e20: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
9e30: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
9e40: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
9e50: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
9e60: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
9e70: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a   int i;.  int (*
9e80: 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42  xFunc)(Btree *pB
9e90: 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63  t) = 0;  /* Func
9ea0: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20  tion to call on 
9eb0: 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65  each btree backe
9ec0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70  nd */.  int isSp
9ed0: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
9ee0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
9ef0: 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   true if SQLITE_
9f00: 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a  NOMEM or IOERR *
9f10: 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
9f20: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
9f30: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
9f40: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
9f50: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
9f60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
9f70: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
9f80: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
9f90: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
9fa0: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
9fb0: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
9fc0: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
9fd0: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
9fe0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
9ff0: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
a000: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
a010: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
a020: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
a030: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
a040: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
a050: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
a060: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
a070: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
a080: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
a090: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
a0a0: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
a0b0: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
a0c0: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
a0d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
a0e0: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
a0f0: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
a100: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
a110: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
a120: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
a130: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
a140: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
a150: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
a160: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
a170: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
a180: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
a190: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
a1a0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
a1b0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
a1c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a1d0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
a1e0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
a1f0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
a200: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
a210: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
a220: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
a230: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
a240: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
a250: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
a260: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
a270: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20  rom p->rc */..  
a280: 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
a290: 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
a2a0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a2b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
a2c0: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70  texArrayEnter(&p
a2d0: 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->aMutex);..    
a2e0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
a2f0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
a300: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
a310: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
a320: 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
a330: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
a340: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
a350: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
a380: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
a390: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
a3a0: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
a3b0: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
a3c0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f   /* This loop do
a3d0: 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73  es static analys
a3e0: 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  is of the query 
a3f0: 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66 20  to see which of 
a400: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  the.      ** fol
a410: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61 74  lowing three cat
a420: 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73  egories it falls
a430: 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a   into:.      **.
a440: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61        **     Rea
a450: 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  d-only.      ** 
a460: 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20 73      Query with s
a470: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
a480: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75  .      **     Qu
a490: 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61 74  ery without stat
a4a0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  ement journal.  
a4b0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
a4c0: 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65  We could do some
a4d0: 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61  thing more elega
a4e0: 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61  nt than this sta
a4f0: 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e  tic analysis (i.
a500: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  e..      ** stor
a510: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75  e the type of qu
a520: 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74  ery as part of t
a530: 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70  he compliation p
a540: 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20  hase), but .    
a550: 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61    ** handling ma
a560: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
a570: 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c 79  lure is a fairly
a580: 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63 61   obscure edge ca
a590: 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20  se so .      ** 
a5a0: 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79  this is probably
a5b0: 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d   easier. Todo: M
a5c0: 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72  ight be an oppor
a5d0: 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65  tunity to reduce
a5e0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20   .      ** code 
a5f0: 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c  size a very smal
a600: 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e  l amount though.
a610: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
a620: 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e 6c    int notReadOnl
a630: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  y = 0;.      int
a640: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30   isStatement = 0
a650: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
a660: 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d  ->aOp || p->nOp=
a670: 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  =0);.      for(i
a680: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
a690: 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69  +){ .        swi
a6a0: 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  tch( p->aOp[i].o
a6b0: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
a6c0: 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73     case OP_Trans
a6d0: 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  action:.        
a6e0: 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20      notReadOnly 
a6f0: 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b  |= p->aOp[i].p2;
a700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a710: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
a720: 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a  se OP_Statement:
a730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 53  .            isS
a740: 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20  tatement = 1;.  
a750: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a770: 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a   }..   .      /*
a780: 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
a790: 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20  s read-only, we 
a7a0: 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62  need do no rollb
a7b0: 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65  ack at all. Othe
a7c0: 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
a7d0: 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65  proceed with the
a7e0: 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
a7f0: 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
a800: 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e 6c    if( notReadOnl
a810: 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
a820: 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
a830: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
a840: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
a850: 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61 74 65  OCKED && isState
a860: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
a870: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
a880: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
a890: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  mt;.          p-
a8a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53  >rc = SQLITE_BUS
a8b0: 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
a8c0: 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49  e if( (mrc==SQLI
a8d0: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
a8e0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
a8f0: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
a900: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
a910: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
a920: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
a930: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a940: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
a950: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
a960: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
a970: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
a980: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
a990: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
a9a0: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
a9b0: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
a9c0: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
a9d0: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
a9e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76  */.          inv
a9f0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
aa00: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
aa10: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
aa20: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
aa30: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
aa40: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
aa50: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
aa60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
aa70: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
aa80: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
aa90: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
aaa0: 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
aab0: 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20   vdbe, then.    
aac0: 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  ** we do either 
aad0: 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
aae0: 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
aaf0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
ab00: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
ab10: 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
ab20: 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
ab30: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
ab40: 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
ab50: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
ab60: 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20  s occured. .    
ab70: 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  */.    if( db->a
ab80: 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
ab90: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d  >activeVdbeCnt==
aba0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
abb0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
abc0: 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
abd0: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
abe0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
abf0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
ac00: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
ac10: 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20  ag is true, and 
ac20: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
ac30: 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   was .        **
ac40: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68   successful or h
ac50: 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
ac60: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73  constraint. This
ac70: 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
ac80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72  .        ** is r
ac90: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20  equired..       
aca0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
acb0: 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
acc0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  db);.        if(
acd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
ace0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
acf0: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
ad00: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
ad10: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
ad20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
ad30: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
ad40: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
ad50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ad60: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
ad70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
ad80: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
ad90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ada0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
adb0: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
adc0: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
add0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ade0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
adf0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
ae00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ae10: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
ae20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
ae30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
ae40: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
ae50: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
ae60: 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64     if( p->opened
ae70: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
ae80: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
ae90: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
aea0: 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  tStmt;.        }
aeb0: 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66   .      }else if
aec0: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
aed0: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
aee0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
aef0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
af00: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65  ckStmt;.      }e
af10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
af20: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
af30: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
af40: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
af50: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
af60: 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
af70: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
af80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
af90: 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63  .    /* If xFunc
afa0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
afb0: 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  en it is one of 
afc0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
afd0: 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20  backStmt or.    
afe0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
aff0: 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20  ommitStmt. Call 
b000: 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  it once on each 
b010: 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65  backend. If an e
b020: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20  rror occurs.    
b030: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ** and the retur
b040: 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20  n code is still 
b050: 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74  SQLITE_OK, set t
b060: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
b070: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
b080: 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20   error value..  
b090: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b0a0: 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20  !xFunc ||.      
b0b0: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
b0c0: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c  reeCommitStmt ||
b0d0: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
b0e0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b0f0: 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20  ckStmt.    );.  
b100: 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63    for(i=0; xFunc
b110: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
b120: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
b130: 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  rc;.      Btree 
b140: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
b150: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
b160: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
b170: 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b  rc = xFunc(pBt);
b180: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
b190: 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  && (p->rc==SQLIT
b1a0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
b1b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b1c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
b1d0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
b1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
b1f0: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
b200: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  g, 0);.        }
b210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b220: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
b230: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
b240: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
b250: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
b260: 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  nt was committed
b270: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
b280: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
b290: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
b2a0: 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
b2b0: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
b2c0: 20 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63        if( !xFunc
b2d0: 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74   || xFunc==sqlit
b2e0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
b2f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b300: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
b310: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
b320: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
b330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b340: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
b350: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
b360: 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
b370: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
b380: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
b390: 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
b3a0: 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
b3b0: 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20  occurred. */.   
b3c0: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
b3d0: 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61  TE_OK && db->fla
b3e0: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
b3f0: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20  Changes ){.     
b400: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
b410: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
b420: 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  0);.      db->fl
b430: 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ags = (db->flags
b440: 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   | SQLITE_Intern
b450: 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a  Changes);.    }.
b460: 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
b470: 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
b480: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
b490: 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d  exArrayLeave(&p-
b4a0: 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20  >aMutex);.  }.. 
b4b0: 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
b4c0: 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
b4d0: 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
b4e0: 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
b4f0: 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
b500: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
b510: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b520: 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  --;.  }.  p->mag
b530: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b540: 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
b550: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
b560: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
b570: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b580: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b590: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 68 65  NOMEM;.  }.  che
b5a0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
b5b0: 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  db);..  return S
b5c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
b5d0: 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
b5e0: 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
b5f0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b600: 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
b610: 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
b620: 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
b630: 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
b640: 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
b650: 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
b660: 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
b670: 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
b680: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
b690: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b6a0: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
b6b0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
b6c0: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
b6d0: 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
b6e0: 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
b6f0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
b700: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
b710: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
b720: 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
b730: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
b740: 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
b750: 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
b760: 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
b770: 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
b780: 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
b790: 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
b7a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
b7b0: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
b7c0: 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
b7d0: 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
b7e0: 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
b7f0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
b800: 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
b810: 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
b820: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
b830: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
b840: 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
b850: 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
b860: 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
b870: 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
b880: 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
b890: 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
b8a0: 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
b8b0: 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
b8c0: 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
b8d0: 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
b8e0: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
b8f0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
b900: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  db);.  sqlite3Vd
b910: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73 71 6c  beHalt(p);.  sql
b920: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
b930: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
b940: 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
b950: 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
b960: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
b970: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
b980: 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
b990: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
b9a0: 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
b9b0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
b9c0: 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
b9d0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
b9e0: 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
b9f0: 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
ba00: 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
ba10: 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
ba20: 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
ba30: 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
ba40: 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
ba50: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
ba60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
ba70: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
ba80: 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
ba90: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
baa0: 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
bab0: 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51  -1,p->zErrMsg,SQ
bac0: 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69 74 65  LITE_UTF8,sqlite
bad0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 64  3_free);.      d
bae0: 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
baf0: 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  rc;.      p->zEr
bb00: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
bb10: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
bb20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
bb30: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
bb40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bb50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bb60: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
bb70: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
bb80: 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
bb90: 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
bba0: 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
bbb0: 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
bbc0: 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
bbd0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
bbe0: 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
bbf0: 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
bc00: 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
bc10: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
bc20: 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
bc30: 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
bc40: 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
bc50: 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
bc60: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
bc70: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
bc80: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
bc90: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
bca0: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
bcb0: 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
bcc0: 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  TF8, sqlite3_fre
bcd0: 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  e);.    p->zErrM
bce0: 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
bcf0: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
bd00: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
bd10: 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
bd20: 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
bd30: 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
bd40: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
bd50: 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
bd60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
bd70: 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b  pTos<&p->aStack[
bd80: 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d  p->pc<0?0:p->pc]
bd90: 20 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29   || !p->aStack )
bda0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
bdb0: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
bdc0: 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
bdd0: 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
bde0: 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
bdf0: 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
be00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
be10: 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
be20: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
be30: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
be40: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
be50: 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
be60: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
be70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
be80: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
be90: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
bea0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
beb0: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
bec0: 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
bed0: 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
bee0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
bef0: 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
bf00: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
bf10: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
bf20: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
bf30: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
bf40: 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
bf50: 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
bf60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bf70: 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
bf80: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
bf90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
bfa0: 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
bfb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
bfc0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
bfd0: 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62  IC_INIT;.  p->ab
bfe0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72 65 74  orted = 0;.  ret
bff0: 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
c000: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
c010: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
c020: 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
c030: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
c040: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
c050: 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
c060: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
c070: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
c080: 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
c090: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
c0a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
c0b0: 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
c0c0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c0d0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
c0e0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
c0f0: 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
c100: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
c110: 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
c120: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
c130: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
c140: 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
c150: 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
c160: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67  }else if( p->mag
c170: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
c180: 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  NIT ){.    retur
c190: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
c1a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
c1b0: 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
c1c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c1d0: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74  ** Call the dest
c1e0: 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20  ructor for each 
c1f0: 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e  auxdata entry in
c200: 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77   pVdbeFunc for w
c210: 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72  hich.** the corr
c220: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
c230: 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20   mask is clear. 
c240: 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   Auxdata entries
c250: 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72   beyond 31.** ar
c260: 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79  e always destroy
c270: 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20  ed.  To destroy 
c280: 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72  all auxdata entr
c290: 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a  ies, call this.*
c2a0: 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d  * routine with m
c2b0: 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20  ask==0..*/.void 
c2c0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
c2d0: 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e  eAuxData(VdbeFun
c2e0: 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e  c *pVdbeFunc, in
c2f0: 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  t mask){.  int i
c300: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c310: 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20  VdbeFunc->nAux; 
c320: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
c330: 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
c340: 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41   &pVdbeFunc->apA
c350: 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28  ux[i];.    if( (
c360: 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28  i>31 || !(mask&(
c370: 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d  1<<i))) && pAux-
c380: 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69  >pAux ){.      i
c390: 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
c3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
c3b0: 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
c3c0: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
c3d0: 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20       pAux->pAux 
c3e0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
c3f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
c400: 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
c410: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c420: 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
c430: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
c440: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
c450: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20  .  Cleanup(p);. 
c460: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
c470: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
c480: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
c490: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
c4a0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64  sert( p->db->pVd
c4b0: 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e  be==p );.    p->
c4c0: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
c4d0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
c4e0: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
c4f0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
c500: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
c510: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
c520: 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d      Op *pOp = p-
c530: 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >aOp;.    for(i=
c540: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
c550: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
c560: 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79  freeP4(pOp->p4ty
c570: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
c580: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
c590: 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65  BUG.      sqlite
c5a0: 33 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d  3_free(pOp->zCom
c5b0: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
c5c0: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c    .    }.    sql
c5d0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70  ite3_free(p->aOp
c5e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
c5f0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
c600: 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71  , p->nVar);.  sq
c610: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c  lite3_free(p->aL
c620: 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
c630: 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29  _free(p->aStack)
c640: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
c650: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
c660: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
c670: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
c680: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f  ite3_free(p->aCo
c690: 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
c6a0: 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29 3b  3_free(p->zSql);
c6b0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
c6c0: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
c6d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c6e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
c6f0: 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
c700: 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
c710: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
c720: 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
c730: 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65   MoveTo now.  Re
c740: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
c750: 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54  de.  If no MoveT
c760: 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68  o is pending, th
c770: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f  is.** routine do
c780: 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72  es nothing and r
c790: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
c7a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c7b0: 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
c7c0: 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  (Cursor *p){.  i
c7d0: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
c7e0: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
c7f0: 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
c800: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
c810: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
c820: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
c830: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
c840: 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
c850: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c860: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
c870: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
c880: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
c890: 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
c8a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c8b0: 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79      *p->pIncrKey
c8c0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73   = 0;.    p->las
c8d0: 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e  tRowid = keyToIn
c8e0: 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  t(p->movetoTarge
c8f0: 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  t);.    p->rowid
c900: 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30  IsValid = res==0
c910: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
c920: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
c930: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
c940: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
c950: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c960: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c970: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
c980: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
c990: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
c9a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
c9b0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
c9c0: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
c9d0: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
c9e0: 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ALE;.  }.  retur
c9f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ca00: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
ca10: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
ca20: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
ca30: 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
ca40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ca50: 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
ca60: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52  lite3VdbeSerialR
ca70: 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ead().** sqlite3
ca80: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
ca90: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
caa0: 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a  rialWrite().**.*
cab0: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
cac0: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
cad0: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
cae0: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
caf0: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
cb00: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
cb10: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
cb20: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
cb30: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
cb40: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
cb50: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
cb60: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
cb70: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
cb80: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
cb90: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
cba0: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
cbb0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
cbc0: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
cbd0: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
cbe0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
cbf0: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
cc00: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
cc10: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
cc20: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
cc30: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
cc40: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
cc50: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
cc60: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
cc70: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
cc80: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
cc90: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
cca0: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
ccb0: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
ccc0: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
ccd0: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
cce0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
ccf0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
cd00: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
cd10: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
cd20: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
cd30: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
cd40: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
cd50: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
cd60: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
cd70: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
cda0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
cdc0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
cdd0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
cdf0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
ce00: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
ce10: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
ce20: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
ce30: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
ce40: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
ce70: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
ce80: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
ce90: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
cea0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
ceb0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
cee0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
cef0: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
cf10: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
cf20: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
cf30: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
cf40: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
cf50: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
cf60: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
cf80: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
cf90: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
cfa0: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
cfc0: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
cfd0: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
cfe0: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
d010: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
d020: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
d030: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
d040: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
d050: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
d060: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
d070: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
d080: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
d090: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
d0a0: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
d0b0: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
d0c0: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
d0d0: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
d0e0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
d0f0: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
d100: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
d110: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
d120: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
d130: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
d140: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
d150: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
d160: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
d170: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
d180: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
d190: 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
d1a0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
d1b0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
d1c0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
d1d0: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
d1e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d1f0: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
d200: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
d210: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
d220: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
d230: 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30 30  ((i64)0x00001000
d240: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
d250: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
d260: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
d270: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
d280: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
d290: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
d2a0: 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  +i;.    }.    u 
d2b0: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
d2c0: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
d2d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
d2e0: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
d2f0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
d300: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
d310: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
d320: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
d330: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
d340: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
d350: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
d360: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
d370: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
d380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
d390: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d3a0: 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
d3b0: 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
d3c0: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
d3d0: 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
d3e0: 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
d3f0: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61  em->u.i;.  }.  a
d400: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
d410: 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
d420: 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
d430: 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
d440: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d450: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
d460: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
d470: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
d480: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
d490: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
d4a0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
d4b0: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
d4c0: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
d4d0: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
d4e0: 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
d4f0: 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
d500: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
d510: 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
d520: 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
d530: 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
d540: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
d550: 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
d560: 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
d570: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
d580: 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
d590: 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
d5a0: 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
d5b0: 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
d5c0: 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
d5d0: 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
d5e0: 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
d5f0: 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
d600: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
d610: 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
d620: 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
d630: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
d640: 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
d650: 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
d660: 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
d670: 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
d680: 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
d690: 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
d6a0: 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
d6b0: 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
d6c0: 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
d6d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
d6e0: 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
d6f0: 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
d700: 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
d710: 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
d720: 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
d730: 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
d740: 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
d750: 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
d760: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
d770: 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
d780: 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
d790: 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
d7a0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
d7b0: 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
d7c0: 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
d7d0: 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
d7e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
d7f0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
d800: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
d810: 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
d820: 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
d830: 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
d840: 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
d850: 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
d860: 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
d870: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
d880: 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
d890: 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
d8a0: 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
d8b0: 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
d8c0: 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
d8d0: 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
d8e0: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
d8f0: 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
d900: 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
d910: 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
d920: 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
d930: 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
d940: 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
d950: 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
d960: 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
d970: 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
d980: 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
d990: 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
d9a0: 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
d9b0: 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
d9c0: 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
d9d0: 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
d9e0: 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
d9f0: 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
da00: 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
da10: 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
da20: 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
da30: 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
da40: 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
da50: 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
da60: 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
da70: 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
da80: 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
da90: 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
daa0: 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
dab0: 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
dac0: 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
dad0: 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
dae0: 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
daf0: 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
db00: 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
db10: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
db20: 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
db30: 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
db40: 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
db50: 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
db60: 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
db70: 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
db80: 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
db90: 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
dba0: 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
dbb0: 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
dbc0: 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
dbd0: 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
dbe0: 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
dbf0: 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
dc00: 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
dc10: 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
dc20: 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
dc30: 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
dc40: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
dc50: 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
dc60: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
dc70: 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
dc80: 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
dc90: 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
dca0: 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
dcb0: 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
dcc0: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
dcd0: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
dce0: 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
dcf0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
dd00: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
dd10: 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
dd20: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
dd30: 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
dd40: 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
dd50: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
dd60: 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
dd70: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
dd80: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
dd90: 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
dda0: 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
ddb0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
ddc0: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
ddd0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
dde0: 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
ddf0: 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
de00: 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20  f[].  nBuf must 
de10: 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72  always be.** lar
de20: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
de30: 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
de40: 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ld.  Except, if 
de50: 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  the field is.** 
de60: 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65  a blob with a ze
de70: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20  ro-filled tail, 
de80: 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74  then buf[] might
de90: 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67   be just the rig
dea0: 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f  ht.** size to ho
deb0: 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78  ld everything ex
dec0: 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72  cept for the zer
ded0: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20  o-filled tail.  
dee0: 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f  If buf[].** is o
def0: 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74  nly big enough t
df00: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a  o hold the non-z
df10: 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e  ero prefix, then
df20: 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74   only write that
df30: 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20  .** prefix into 
df40: 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62  buf[].  But if b
df50: 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e  uf[] is large en
df60: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74  ough to hold bot
df70: 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20  h the.** prefix 
df80: 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65  and the tail the
df90: 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66  n write the pref
dfa0: 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74  ix and set the t
dfb0: 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65  ail to all.** ze
dfc0: 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ros..**.** Retur
dfd0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
dfe0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
dff0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
e000: 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
e010: 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
e020: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
e030: 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
e040: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
e050: 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
e060: 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
e070: 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
e080: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
e090: 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
e0a0: 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20  *buf, int nBuf, 
e0b0: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
e0c0: 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75  ile_format){.  u
e0d0: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  32 serial_type =
e0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e0f0: 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c  alType(pMem, fil
e100: 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74  e_format);.  int
e110: 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
e120: 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
e130: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
e140: 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
e150: 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
e160: 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   v;.    int i;. 
e170: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
e180: 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
e190: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
e1a0: 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
e1b0: 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
e1c0: 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
e1d0: 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
e1e0: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
e1f0: 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
e200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
e210: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
e220: 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
e230: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e240: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
e250: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
e260: 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  ( len<=nBuf );. 
e270: 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
e280: 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
e290: 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
e2a0: 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20  v >>= 8;.    }. 
e2b0: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
e2c0: 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
e2d0: 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
e2e0: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
e2f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e300: 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
e310: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
e320: 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29  ro)?pMem->u.i:0)
e330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
e340: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e350: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
e360: 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
e370: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
e380: 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
e390: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
e3a0: 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
e3b0: 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
e3c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
e3d0: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
e3e0: 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
e3f0: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  i;.      if( len
e400: 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  >nBuf ){.       
e410: 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20   len = nBuf;.   
e420: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
e430: 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
e440: 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
e450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
e460: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
e470: 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
e480: 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
e490: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
e4a0: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
e4b0: 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
e4c0: 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
e4d0: 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
e4e0: 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
e4f0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
e500: 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
e510: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
e520: 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
e530: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e540: 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
e550: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
e560: 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
e570: 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
e580: 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
e590: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e5b0: 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
e5c0: 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
e5d0: 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e5f0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
e600: 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
e610: 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
e620: 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
e630: 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
e640: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
e650: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
e660: 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
e670: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
e680: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
e690: 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
e6a0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
e6b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
e6c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e6d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
e6e0: 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
e6f0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
e700: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
e710: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
e720: 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
e730: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e740: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
e750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e760: 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
e770: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e780: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
e790: 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
e7a0: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
e7b0: 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
e7c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e7d0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e7e0: 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
e7f0: 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
e800: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
e810: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
e820: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
e830: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
e840: 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
e850: 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
e860: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e870: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
e880: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
e890: 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
e8a0: 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
e8b0: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
e8c0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
e8d0: 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
e8e0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
e8f0: 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
e900: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e910: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e920: 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
e930: 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
e940: 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
e950: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
e960: 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
e970: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
e980: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
e990: 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
e9a0: 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
e9b0: 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
e9c0: 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
e9d0: 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
e9e0: 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
e9f0: 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
ea00: 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
ea10: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ea20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
ea30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ea40: 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
ea50: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
ea60: 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
ea70: 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
ea80: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
ea90: 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
eaa0: 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
eab0: 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
eac0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ead0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
eae0: 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
eaf0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
eb00: 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
eb10: 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
eb20: 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
eb30: 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
eb40: 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
eb50: 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
eb60: 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
eb70: 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
eb80: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
eb90: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
eba0: 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
ebb0: 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
ebc0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
ebd0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
ebe0: 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
ebf0: 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
ec00: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
ec10: 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
ec20: 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
ec30: 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
ec40: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
ec50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ec60: 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
ec70: 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
ec80: 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
ec90: 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
eca0: 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
ecb0: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
ecc0: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
ecd0: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
ece0: 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
ecf0: 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
ed00: 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
ed10: 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
ed20: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
ed30: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
ed40: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
ed50: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
ed60: 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
ed70: 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
ed80: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
ed90: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
eda0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
edb0: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
edc0: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
edd0: 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
ede0: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
edf0: 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
ee00: 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
ee10: 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
ee20: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
ee30: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
ee40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
ee50: 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
ee60: 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
ee70: 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
ee80: 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
ee90: 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
eea0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
eeb0: 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
eec0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
eed0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
eee0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
eef0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
ef00: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28       int len = (
ef10: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
ef20: 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
ef30: 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
ef40: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
ef50: 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
ef60: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
ef70: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
ef80: 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
ef90: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
efa0: 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
efb0: 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
efc0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
efd0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
efe0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
eff0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
f000: 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
f010: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f020: 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65 72  /*.** The header
f030: 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f 6e   of a record con
f040: 73 69 73 74 73 20 6f 66 20 61 20 73 65 71 75 65  sists of a seque
f050: 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  nce variable-len
f060: 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a  gth integers..**
f070: 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73 20   These integers 
f080: 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
f090: 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20  s small and are 
f0a0: 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69 6e  encoded as a sin
f0b0: 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65  gle byte..** The
f0c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
f0d0: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
f0e0: 20 74 68 69 73 20 66 61 63 74 20 74 6f 20 70 72   this fact to pr
f0f0: 6f 76 69 64 65 20 61 20 66 61 73 74 20 64 65 63  ovide a fast dec
f100: 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  ode.** of the in
f110: 74 65 67 65 72 73 20 69 6e 20 61 20 72 65 63 6f  tegers in a reco
f120: 72 64 20 68 65 61 64 65 72 2e 20 20 49 74 20 69  rd header.  It i
f130: 73 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  s faster for the
f140: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20   common case.** 
f150: 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 67 65  where the intege
f160: 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62 79  r is a single by
f170: 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69 74  te.  It is a lit
f180: 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e 20  tle slower when 
f190: 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  the.** integer i
f1a0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79  s two or more by
f1b0: 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61 6c  tes.  But overal
f1c0: 6c 20 69 74 20 69 73 20 66 61 73 74 65 72 2e 0a  l it is faster..
f1d0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
f1e0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ing expressions 
f1f0: 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a  are equivalent:.
f200: 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73 71  **.**     x = sq
f210: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
f220: 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a  ( A, &B );.**.**
f230: 20 20 20 20 20 78 20 3d 20 47 65 74 56 61 72 69       x = GetVari
f240: 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a  nt( A, B );.**.*
f250: 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56 61 72  /.#define GetVar
f260: 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20 3d 20  int(A,B)  ((B = 
f270: 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20 31 20  *(A))<=0x7f ? 1 
f280: 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  : sqlite3GetVari
f290: 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a  nt32(A, &B))../*
f2a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f2b0: 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
f2c0: 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
f2d0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 73   index records s
f2e0: 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  pecified by .** 
f2f0: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
f300: 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32  nd {nKey2, pKey2
f310: 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e  }, returning a n
f320: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
f330: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
f340: 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20  eger if {nKey1, 
f350: 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74  pKey1} is less t
f360: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
f370: 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
f380: 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d  n {nKey2, pKey2}
f390: 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e 64  .  Both Key1 and
f3a0: 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62 79   Key2 must be by
f3b0: 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f  te strings.** co
f3c0: 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f 50  mposed by the OP
f3d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
f3e0: 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a  de of the VDBE..
f3f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f400: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
f410: 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74  .  void *userDat
f420: 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  a,.  int nKey1, 
f430: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
f440: 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  1, .  int nKey2,
f450: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
f460: 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  y2.){.  KeyInfo 
f470: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79  *pKeyInfo = (Key
f480: 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a  Info*)userData;.
f490: 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20 20    u32 d1, d2;   
f4a0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f4b0: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
f4c0: 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
f4d0: 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 2c  t */.  u32 idx1,
f4e0: 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f   idx2;      /* O
f4f0: 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
f500: 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
f510: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
f520: 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72 32  2 szHdr1, szHdr2
f530: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
f540: 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
f550: 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
f560: 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
f570: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
f580: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f590: 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
f5a0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f5b0: 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74  *)pKey1;.  const
f5c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f5d0: 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75  aKey2 = (const u
f5e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
f5f0: 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d  Key2;..  Mem mem
f600: 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20  1;.  Mem mem2;. 
f610: 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
f620: 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
f630: 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
f640: 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20  >db;.  mem2.enc 
f650: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
f660: 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70 4b 65  .  mem2.db = pKe
f670: 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a 20 20  yInfo->db;.  .  
f680: 69 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e 74  idx1 = GetVarint
f690: 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
f6a0: 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
f6b0: 20 20 69 64 78 32 20 3d 20 47 65 74 56 61 72 69    idx2 = GetVari
f6c0: 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72 32  nt(aKey2, szHdr2
f6d0: 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72 32  );.  d2 = szHdr2
f6e0: 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65  ;.  nField = pKe
f6f0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20  yInfo->nField;. 
f700: 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
f710: 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48 64  dr1 && idx2<szHd
f720: 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  r2 ){.    u32 se
f730: 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20  rial_type1;.    
f740: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 32  u32 serial_type2
f750: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
f760: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
f770: 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
f780: 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
f790: 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
f7a0: 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79   GetVarint( aKey
f7b0: 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
f7c0: 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
f7d0: 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
f7e0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f7f0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
f800: 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  e1)>0 ) break;. 
f810: 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56 61     idx2 += GetVa
f820: 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78 32  rint( aKey2+idx2
f830: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29  , serial_type2 )
f840: 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b  ;.    if( d2>=nK
f850: 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey2 && sqlite3Vd
f860: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
f870: 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20  serial_type2)>0 
f880: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
f890: 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
f8a0: 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
f8b0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
f8c0: 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
f8d0: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
f8e0: 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
f8f0: 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  e1, &mem1);.    
f900: 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d2 += sqlite3Vdb
f910: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
f920: 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79  2[d2], serial_ty
f930: 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20  pe2, &mem2);..  
f940: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
f950: 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
f960: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
f970: 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
f980: 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20  &mem2, i<nField 
f990: 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
f9a0: 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
f9b0: 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20  f( mem1.flags & 
f9c0: 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65  MEM_Dyn ) sqlite
f9d0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
f9e0: 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20  &mem1);.    if( 
f9f0: 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45 4d  mem2.flags & MEM
fa00: 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64  _Dyn ) sqlite3Vd
fa10: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
fa20: 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  m2);.    if( rc!
fa30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
fa40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
fa50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20  ;.  }..  /* One 
fa60: 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
fa70: 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62  out of fields, b
fa80: 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ut all the field
fa90: 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
faa0: 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75  nt.  ** were equ
fab0: 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b  al. If the incrK
fac0: 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ey flag is true,
fad0: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
fae0: 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65   key is.  ** tre
faf0: 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a  ated as larger..
fb00: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30    */.  if( rc==0
fb10: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   ){.    if( pKey
fb20: 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b  Info->incrKey ){
fb30: 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
fb40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
fb50: 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69 78 49  KeyInfo->prefixI
fb60: 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  sEqual ){.      
fb70: 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a  if( d1<nKey1 ){.
fb80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
fb90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fba0: 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20  d2<nKey2 ){.    
fbb0: 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
fbc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
fbd0: 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
fbe0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69  >aSortOrder && i
fbf0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
fc00: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
fc10: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
fc20: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
fc30: 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d     rc = -rc;.  }
fc40: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
fc50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
fc60: 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78  ment is an index
fc70: 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20   entry composed 
fc80: 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
fc90: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
fca0: 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72  ** The last entr
fcb0: 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64  y in this record
fcc0: 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
fcd0: 74 65 67 65 72 20 28 73 70 65 63 69 66 69 63 61  teger (specifica
fce0: 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65  lly.** an intege
fcf0: 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20  r rowid).  This 
fd00: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
fd10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
fd20: 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69  tes in.** that i
fd30: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
fd40: 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
fd50: 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a  idLen(const u8 *
fd60: 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48  aKey){.  u32 szH
fd70: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
fd80: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
fd90: 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
fda0: 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
fdb0: 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
fdc0: 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  wid */..  sqlite
fdd0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65  3GetVarint32(aKe
fde0: 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71  y, &szHdr);.  sq
fdf0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
fe00: 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c  (&aKey[szHdr-1],
fe10: 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20   &typeRowid);.  
fe20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
fe30: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
fe40: 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20  typeRowid);.}.  
fe50: 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
fe60: 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
fe70: 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
fe80: 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
fe90: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
fea0: 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
feb0: 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
fec0: 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
fed0: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
fee0: 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
fef0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
ff00: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
ff10: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
ff20: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
ff30: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
ff40: 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  xRowid(BtCursor 
ff50: 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
ff60: 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
ff70: 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
ff80: 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
ff90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ffa0: 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
ffb0: 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
ffc0: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
ffd0: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
ffe0: 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
fff0: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
10000 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
10010 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c  Mem m, v;..  sql
10020 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
10030 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
10040 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
10050 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y<=0 ){.    retu
10060 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10070 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
10080 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
10090 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
100a0 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
100b0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
100c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
100d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65  .  }.  sqlite3Ge
100e0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
100f0 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  .z, &szHdr);.  s
10100 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
10110 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
10120 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
10130 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
10140 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10150 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
10160 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
10170 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
10180 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
10190 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
101a0 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
101b0 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
101c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
101d0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
101e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
101f0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
10200 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
10210 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
10220 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
10230 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
10240 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
10250 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
10260 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
10270 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
10280 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
10290 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
102a0 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
102b0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
102c0 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
102d0 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
102e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
102f0 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
10300 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
10310 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
10320 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
10330 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
10340 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
10350 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
10360 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
10370 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
10380 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
10390 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
103a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
103b0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
103c0 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20  (.  Cursor *pC, 
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
103f0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
10400 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
10410 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20  const u8 *pKey, 
10420 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20    /* The key to 
10430 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74  compare */.  int
10440 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
10450 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
10460 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
10470 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
10480 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
10490 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
104a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
104b0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
104c0 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b  .  int lenRowid;
104d0 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c  .  Mem m;..  sql
104e0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
104f0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
10500 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
10510 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73  y<=0 ){.    *res
10520 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
10530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10550 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
10560 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e  C->pCursor, 0, n
10570 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
10580 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
10590 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
105a0 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
105b0 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
105c0 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20  Len((u8*)m.z);. 
105d0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
105e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
105f0 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d  (pC->pKeyInfo, m
10600 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a  .n-lenRowid, m.z
10610 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
10620 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
10630 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
10640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10650 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
10660 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
10670 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
10680 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
10690 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
106a0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
106b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
106c0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
106d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
106e0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
106f0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
10700 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
10710 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10720 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
10730 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
10740 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
10750 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
10760 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
10770 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
10780 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
10790 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
107a0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
107b0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
107c0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
107d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
107e0 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
107f0 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
10800 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
10810 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
10820 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
10830 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10840 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
10850 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
10860 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
10870 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
10880 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
10890 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
108a0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
108b0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
108c0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
108d0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
108e0 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
108f0 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
10900 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
10910 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
10920 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
10930 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
10940 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
10950 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
10960 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
10970 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
10980 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
10990 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
109a0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
109b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
109c0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
109d0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
109e0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
109f0 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
10a00 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
10a10 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
10a20 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
10a30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
10a40 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
10a50 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
10a60 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
10a70 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
10a80 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
10a90 3e 64 62 3b 0a 7d 0a                             >db;.}.