/ Hex Artifact Content
Login

Artifact 53cc9e2d3a870fe64f23c43b9417f28118e58d8f:


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 76 61 6c 3e 3d 30 20   assert( val>=0 
2a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  );.  assert( p==
2a30: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2a40: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2a50: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64  ;.  if( p && add
2a60: 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61  r>=0 && p->nOp>a
2a70: 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ddr && p->aOp ){
2a80: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
2a90: 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p2 = val;.  }.
2aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2ab0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2ac0: 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P3 operand for 
2ad0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
2ae0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
2af0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2b00: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP3(Vdbe *p, int
2b10: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2b20: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2b30: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2b40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2b50: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
2b60: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
2b70: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
2b80: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
2b90: 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p3 = val;.  }.}.
2ba0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2bb0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2bc0: 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68  5 operand for th
2bd0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a  e most recently.
2be0: 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69  ** added operati
2bf0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2c00: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2c10: 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29  Vdbe *p, u8 val)
2c20: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2c30: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2c40: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2c50: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61  .  if( p && p->a
2c60: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
2c70: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
2c80: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
2c90: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d  1].p5 = val;.  }
2ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2cb0: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
2cc0: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
2cd0: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
2ce0: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
2cf0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
2d00: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
2d10: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
2d20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2d30: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
2d40: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
2d50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2d60: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
2d70: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
2d80: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
2d90: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
2da0: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
2db0: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
2dc0: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
2dd0: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
2de0: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
2df0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2e00: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
2e10: 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a 70 44 65  ion(FuncDef *pDe
2e20: 66 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26  f){.  if( pDef &
2e30: 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  & (pDef->flags &
2e40: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
2e50: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
2e60: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 66 29  lite3_free(pDef)
2e70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
2e80: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
2e90: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
2ea0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2eb0: 65 65 50 34 28 69 6e 74 20 70 34 74 79 70 65 2c  eeP4(int p4type,
2ec0: 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69 66   void *p3){.  if
2ed0: 28 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69 74  ( p3 ){.    swit
2ee0: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
2ef0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
2f00: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2f10: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
2f20: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20  e P4_MPRINTF:.  
2f30: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
2f40: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
2f50: 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20  P4_KEYINFO:.    
2f60: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
2f70: 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20  O_HANDOFF: {.   
2f80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2f90: 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62  e(p3);.        b
2fa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2fb0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45      case P4_VDBE
2fc0: 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20  FUNC: {.        
2fd0: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
2fe0: 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20  unc = (VdbeFunc 
2ff0: 2a 29 70 33 3b 0a 20 20 20 20 20 20 20 20 66 72  *)p3;.        fr
3000: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3010: 69 6f 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e 70  ion(pVdbeFunc->p
3020: 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73  Func);.        s
3030: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
3040: 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e  AuxData(pVdbeFun
3050: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  c, 0);.        s
3060: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 64 62  qlite3_free(pVdb
3070: 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  eFunc);.        
3080: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3090: 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e       case P4_FUN
30a0: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  CDEF: {.        
30b0: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
30c0: 63 74 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a 29  ction((FuncDef*)
30d0: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
30e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
30f0: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74  ValueFree((sqlit
3120: 65 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20  e3_value*)p3);. 
3130: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3140: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3150: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  }.../*.** Change
3160: 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74   N opcodes start
3170: 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e  ing at addr to N
3180: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  o-ops..*/.void s
3190: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
31a0: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
31b0: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29  int addr, int N)
31c0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  {.  if( p && p->
31d0: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
31e0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
31f0: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 77 68 69 6c  [addr];.    whil
3200: 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( N-- ){.      
3210: 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79  freeP4(pOp->p4ty
3220: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
3230: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70        memset(pOp
3240: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
3250: 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  0]));.      pOp-
3260: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
3270: 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a  p;.      pOp++;.
3280: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3290: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
32a0: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
32b0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
32c0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
32d0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
32e0: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
32f0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
3300: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
3310: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
3320: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
3330: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
3340: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
3350: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
3360: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
3370: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
3380: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
3390: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
33a0: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
33b0: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
33c0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
33d0: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
33e0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
33f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
3400: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
3410: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
3420: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
3430: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
3440: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
3450: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
3460: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
3470: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20  s of zP4..**.** 
3480: 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  If n==P4_KEYINFO
3490: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a   it means that z
34a0: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
34b0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
34c0: 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70  ucture..** A cop
34d0: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
34e0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
34f0: 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  re into memory o
3500: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
3510: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20  sqlite3_malloc, 
3520: 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e  to be freed when
3530: 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e   the Vdbe is fin
3540: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34  alized..** n==P4
3550: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3560: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
3570: 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  zP4 points to a 
3580: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3590: 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d  e.** stored in m
35a0: 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63  emory that the c
35b0: 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e  aller has obtain
35c0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
35d0: 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20  malloc. The .** 
35e0: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f  caller should no
35f0: 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63  t free the alloc
3600: 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ation, it will b
3610: 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65  e freed when the
3620: 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61   Vdbe is.** fina
3630: 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74  lized..** .** Ot
3640: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20  her values of n 
3650: 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43  (P4_STATIC, P4_C
3660: 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64  OLLSEQ etc.) ind
3670: 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70  icate that zP4 p
3680: 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74  oints.** to a st
3690: 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72  ring or structur
36a0: 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e  e that is guaran
36b0: 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f  teed to exist fo
36c0: 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  r the lifetime o
36d0: 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49  f.** the Vdbe. I
36e0: 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65  n these cases we
36f0: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
3700: 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  he pointer..**.*
3710: 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e  * If addr<0 then
3720: 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68   change P4 on th
3730: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3740: 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63  inserted instruc
3750: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3760: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3770: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
3780: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
3790: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
37a0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
37b0: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
37c0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
37d0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d  INIT );.  if( p=
37e0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  =0 || p->aOp==0 
37f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3800: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
3810: 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e 46   (n != P4_KEYINF
3820: 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50  O) {.      freeP
3830: 34 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  4(n, (void*)*(ch
3840: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
3850: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
3860: 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c  }.  if( addr<0 |
3870: 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29  | addr>=p->nOp )
3880: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
3890: 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  nOp - 1;.    if(
38a0: 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e   addr<0 ) return
38b0: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
38c0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66  ->aOp[addr];.  f
38d0: 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70  reeP4(pOp->p4typ
38e0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
38f0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
3900: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
3910: 32 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  2 ){.    pOp->p4
3920: 2e 69 20 3d 20 28 69 6e 74 29 7a 50 34 3b 0a 20  .i = (int)zP4;. 
3930: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3940: 20 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   n;.  }else if( 
3950: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
3960: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
3970: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3980: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
3990: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
39a0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
39b0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
39c0: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e     int nField, n
39d0: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c  Byte;..    nFiel
39e0: 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a  d = ((KeyInfo*)z
39f0: 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20  P4)->nField;.   
3a00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
3a10: 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46  *pKeyInfo) + (nF
3a20: 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70  ield-1)*sizeof(p
3a30: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
3a40: 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ]) + nField;.   
3a50: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
3a60: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  te3_malloc( nByt
3a70: 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  e );.    pOp->p4
3a80: 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  .pKeyInfo = pKey
3a90: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3aa0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3ab0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3ac0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3ad0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3ae0: 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP4, nByte);. 
3af0: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3b00: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3b10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3b20: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3b30: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3b40: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
3b50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3b60: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3b70: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
3b80: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3b90: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
3ba0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3bb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3bc0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3bd0: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  4_KEYINFO;.    }
3be0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
3bf0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3c00: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
3c10: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3c20: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
3c30: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
3c40: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
3c50: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
3c60: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
3c70: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3c80: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
3c90: 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20  e if( n<0 ){.   
3ca0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
3cb0: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
3cc0: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
3cd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
3ce0: 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e  ==0 ) n = strlen
3cf0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
3d00: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
3d10: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
3d20: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
3d30: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
3d40: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  AMIC;.  }.}..#if
3d50: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
3d60: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
3d70: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20  ment on the the 
3d80: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
3d90: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
3da0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3db0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
3dc0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
3dd0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
3de0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3df0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
3e00: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
3e10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
3e20: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
3e30: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
3e40: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
3e50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3e60: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
3e70: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
3e80: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 70 2d  zFormat);.    p-
3e90: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
3ea0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
3eb0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
3ec0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
3ed0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
3ee0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
3ef0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
3f00: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
3f10: 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62   address..*/.Vdb
3f20: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
3f30: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
3f40: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
3f50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3f60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3f70: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
3f80: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
3f90: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
3fa0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
3fb0: 72 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30  return ((addr>=0
3fc0: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
3fd0: 3f 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29  ?(&p->aOp[addr])
3fe0: 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  :0);.}..#if !def
3ff0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4000: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
4010: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
4020: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
4030: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
4040: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4050: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
4060: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
4070: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
4080: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
4090: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
40a0: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
40b0: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
40c0: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
40d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
40e0: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
40f0: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
4100: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
4110: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
4120: 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  mp;.  assert( nT
4130: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69  emp>=20 );.  swi
4140: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
4150: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
4160: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
4170: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
4180: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
4190: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
41a0: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c  yInfo;.      sql
41b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
41c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79  emp, zTemp, "key
41d0: 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e  info(%d", pKeyIn
41e0: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
41f0: 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54     i = strlen(zT
4200: 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  emp);.      for(
4210: 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d  j=0; j<pKeyInfo-
4220: 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20  >nField; j++){. 
4230: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
4240: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
4250: 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  ->aColl[j];.    
4260: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
4270: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
4280: 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d   = strlen(pColl-
4290: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
42a0: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
42b0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
42c0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
42d0: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
42e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
42f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4300: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
4310: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ] = ',';.       
4320: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
4330: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70  >aSortOrder && p
4340: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
4350: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
4360: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
4370: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
4380: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
4390: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
43a0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
43b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
43c0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
43d0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
43e0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
43f0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
4400: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
4410: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
4420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4430: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
4440: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
4450: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
4460: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
4470: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
4480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4490: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
44a0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
44b0: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
44c0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
44d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
44e0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
44f0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
4500: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
4510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4520: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
4530: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
4540: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
4550: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
4560: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4570: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4580: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
4590: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
45a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
45b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
45c0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
45d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
45e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
45f0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
4600: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
4610: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4620: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
4630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4640: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4650: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
4660: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
4670: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4680: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
4690: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
46a0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
46b0: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
46c0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
46d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
46e0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
46f0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
4700: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
4710: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
4720: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
4730: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
4740: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
4750: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
4760: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
4770: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
4780: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4790: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
47a0: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
47b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
47c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
47d0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
47e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
47f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4800: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
4810: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
4820: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
4830: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
4840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
4850: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4860: 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  Temp, "NULL");. 
4870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4880: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
4890: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
48a0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
48b0: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
48c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
48d0: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
48e0: 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  p4.pVtab;.      
48f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4900: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4910: 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74  vtab:%p:%p", pVt
4920: 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ab, pVtab->pModu
4930: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
4940: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4950: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4960: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
4970: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
4980: 50 34 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70  P4==0 || pOp->op
4990: 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  code==OP_Noop ){
49a0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
49b0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
49c0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
49d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
49e0: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
49f0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
4a00: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4a10: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
4a20: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
4a30: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
4a40: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
4a50: 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .**.*/.void sqli
4a60: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
4a70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29  (Vdbe *p, int i)
4a80: 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20  {.  int mask;.  
4a90: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
4aa0: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  i<p->db->nDb );.
4ab0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 69 7a 65    assert( i<size
4ac0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
4ad0: 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31  *8 );.  mask = 1
4ae0: 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62  <<i;.  if( (p->b
4af0: 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  treeMask & mask)
4b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74  ==0 ){.    p->bt
4b10: 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  reeMask |= mask;
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
4b30: 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72  eMutexArrayInser
4b40: 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d  t(&p->aMutex, p-
4b50: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
4b60: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65  ;.  }.}...#if de
4b70: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
4b80: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
4b90: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4ba0: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
4bb0: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
4bc0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4bd0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
4be0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
4bf0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
4c00: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
4c10: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
4c20: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
4c30: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
4c40: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
4c50: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
4c60: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
4c70: 64 20 25 2d 34 73 20 25 2e 32 58 5c 6e 22 3b 0a  d %-4s %.2X\n";.
4c80: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
4c90: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
4ca0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
4cb0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
4cc0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
4cd0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
4ce0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
4cf0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
4d00: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
4d10: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
4d20: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
4d30: 70 4f 70 2d 3e 70 35 29 3b 0a 20 20 66 66 6c 75  pOp->p5);.  fflu
4d40: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
4d50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
4d60: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
4d70: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
4d80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4d90: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
4da0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
4db0: 28 20 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ( p ){.    while
4dc0: 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20  ( N-->0 ){.     
4dd0: 20 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20   assert( N<2 || 
4de0: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
4df0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4e00: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
4e10: 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p++);.    }.  }.
4e20: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4e30: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
4e40: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
4e50: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
4e60: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
4e70: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
4e80: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
4e90: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
4ea0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
4eb0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
4ec0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
4ed0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
4ee0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
4ef0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
4f00: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
4f10: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
4f20: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
4f30: 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20  XPLAIN"..*/.int 
4f40: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
4f50: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f70: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
4f80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4f90: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
4fa0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4fb0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
4fc0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
4fd0: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
4fe0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72  BE_MAGIC_RUN ) r
4ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
5000: 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64  USE;.  assert( d
5010: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
5020: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20  _MAGIC_BUSY );. 
5030: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
5040: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
5050: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
5060: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
5070: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
5080: 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79   does not put dy
5090: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e  namic strings on
50a0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
50b0: 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20  stack, they may 
50c0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
50d0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
50e0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
50f0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
5100: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
5110: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
5120: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
5130: 69 66 28 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  if( p->pResultSe
5140: 74 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  t ){.    release
5150: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 70 52 65 73  MemArray(p->pRes
5160: 75 6c 74 53 65 74 2c 20 35 29 3b 0a 20 20 20 20  ultSet, 5);.    
5170: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
5180: 30 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  0;.  }..  do{.  
5190: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
51a0: 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f   }while( i<p->nO
51b0: 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  p && p->explain=
51c0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
51d0: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
51e0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  in );.  if( i>=p
51f0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->nOp ){.    p->
5200: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5210: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5220: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
5230: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
5240: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
5250: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
5260: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
5270: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5280: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
5290: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
52a0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
52b0: 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  ->rc), (char*)0)
52c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
52d0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
52e0: 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  [i];.    Mem *pM
52f0: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
5300: 65 74 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a  et = p->aStack;.
5310: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
5320: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
5330: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5340: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
5350: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5360: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
5370: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
53a0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
53b0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
53c0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
53d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
53e0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
53f0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
5400: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
5410: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
5420: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
5430: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
5440: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
5450: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
5460: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
5470: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
5480: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5490: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
54a0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
54b0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
54c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ++;.    }..    p
54d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
54e0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
54f0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
5520: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
5530: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5540: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5550: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5560: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
5570: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
5580: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
5590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
55a0: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
55b0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
55c0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
55d0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
55e0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
55f0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5600: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
5610: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5620: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5640: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
5650: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5660: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
5670: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
5680: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5690: 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74  MEM_Ephem|MEM_St
56a0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 20 20  r|MEM_Term;     
56b0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P4 */.    pMe
56c0: 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 34  m->z = displayP4
56d0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f  (pOp, pMem->zSho
56e0: 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  rt, sizeof(pMem-
56f0: 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 61  >zShort));.    a
5700: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5710: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
5720: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5730: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
5740: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5750: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
5760: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
5770: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5780: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
5790: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
57a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
57b0: 7c 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 68  |MEM_Term|MEM_Sh
57c0: 6f 72 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ort;.      pMem-
57d0: 3e 6e 20 3d 20 73 70 72 69 6e 74 66 28 70 4d 65  >n = sprintf(pMe
57e0: 6d 2d 3e 7a 53 68 6f 72 74 2c 20 22 25 2e 32 78  m->zShort, "%.2x
57f0: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
5800: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P5 */.      pM
5810: 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 53  em->z = pMem->zS
5820: 68 6f 72 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  hort;.      pMem
5830: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5840: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
5850: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
5860: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
5870: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
5880: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
5890: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
58a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
58b0: 6d 65 6e 74 20 2a 2f 0a 23 69 66 64 65 66 20 53  ment */.#ifdef S
58c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
58d0: 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d    if( pOp->zComm
58e0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ent ){.        p
58f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5900: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
5910: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d         pMem->z =
5920: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a   pOp->zComment;.
5930: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
5940: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5950: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
5960: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5970: 46 38 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  F8;.      }.#end
5980: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  if.    }..    p-
5990: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
59a0: 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 5*(p->explain-
59b0: 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20  1);.    p->pTos 
59c0: 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72  = pMem;.    p->r
59d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
59e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
59f0: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
5a00: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
5a10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
5a20: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
5a30: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
5a40: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
5a50: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
5a60: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
5a70: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
5a80: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
5a90: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
5aa0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
5ab0: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
5ac0: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
5ad0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
5ae0: 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d  = &p->aOp[nOp-1]
5af0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
5b00: 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20  ode==OP_Noop && 
5b10: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
5b20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5b30: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
5b40: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
5b50: 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b  e(*(u8*)z) ) z++
5b60: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51  ;.    printf("SQ
5b70: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
5b80: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
5b90: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5ba0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
5bb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5bc0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a  ENABLE_IOTRACE).
5bd0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49  /*.** Print an I
5be0: 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73  OTRACE message s
5bf0: 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65  howing SQL conte
5c00: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
5c10: 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71  te3VdbeIOTraceSq
5c20: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
5c30: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
5c40: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
5c50: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f   if( sqlite3_io_
5c60: 74 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  trace==0 ) retur
5c70: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
5c80: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
5c90: 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b   &p->aOp[nOp-1];
5ca0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
5cb0: 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70  de==OP_Noop && p
5cc0: 4f 70 2d 3e 70 34 2e 70 21 3d 30 20 29 7b 0a 20  Op->p4.p!=0 ){. 
5cd0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
5ce0: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
5cf0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5d00: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
5d10: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
5d20: 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  p);.    for(i=0;
5d30: 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e   isspace((unsign
5d40: 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b 20 69  ed char)z[i]); i
5d50: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
5d60: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
5d70: 20 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65       if( isspace
5d80: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
5d90: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
5da0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
5db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
5dc0: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
5dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
5de0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
5df0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
5e00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
5e10: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
5e20: 33 5f 69 6f 5f 74 72 61 63 65 28 22 53 51 4c 20  3_io_trace("SQL 
5e30: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
5e40: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
5e50: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
5e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
5e70: 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  OTRACE */.../*.*
5e80: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
5e90: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
5ea0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73  execution.  This
5eb0: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
5ec0: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
5ed0: 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61  cating stack spa
5ee0: 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ce and initializ
5ef0: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
5f00: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
5f10: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
5f20: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
5f30: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
5f40: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
5f50: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
5f60: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
5f70: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
5f80: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
5f90: 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42   a VDBE from VDB
5fa0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a  E_MAGIC_INIT to.
5fb0: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  ** VDBE_MAGIC_RU
5fc0: 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  N..*/.void sqlit
5fd0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
5fe0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
6010: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
6040: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
6050: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
6060: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
6090: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
60a0: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
60b0: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
60c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
60d0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
60e0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
60f0: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6110: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
6120: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
6130: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
6140: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
6150: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
6160: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
6170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6180: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6190: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
61a0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
61b0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
61c0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
61d0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
61e0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
61f0: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
6200: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
6210: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
6220: 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63  This.   * is bec
6230: 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
6240: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29   resizeOpArray()
6250: 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e   below may shrin
6260: 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f  k the.   * p->aO
6270: 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76  p[] array to sav
6280: 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c  e memory if call
6290: 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f  ed when in VDBE_
62a0: 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20  MAGIC_RUN .   * 
62b0: 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70  state..   */.  p
62c0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
62d0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20  AGIC_RUN;..  /* 
62e0: 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  No instruction e
62f0: 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20  ver pushes more 
6300: 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c  than a single el
6310: 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20  ement onto the. 
6320: 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20   ** stack.  And 
6330: 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20  the stack never 
6340: 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73  grows on success
6350: 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f  ive executions o
6360: 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  f the.  ** same 
6370: 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f  loop.  So the to
6380: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
6390: 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e  structions is an
63a0: 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a   upper bound.  *
63b0: 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  * on the maximum
63c0: 20 73 74 61 63 6b 20 64 65 70 74 68 20 72 65 71   stack depth req
63d0: 75 69 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c  uired.  (Added l
63e0: 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a  ater:)  The.  **
63f0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
6400: 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73  () call computes
6410: 20 61 20 74 69 67 68 74 65 72 20 75 70 70 65 72   a tighter upper
6420: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20   bound on the.  
6430: 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20  ** stack size.. 
6440: 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   **.  ** Allocat
6450: 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63  ion all the stac
6460: 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20  k space we will 
6470: 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a  ever need..  */.
6480: 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d    if( p->aStack=
6490: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  =0 ){.    int nA
64a0: 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  rg;       /* Max
64b0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
64c0: 72 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20  rgs passed to a 
64d0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  user function. *
64e0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b  /.    int nStack
64f0: 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  ;     /* Maximum
6500: 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b   number of stack
6510: 20 65 6e 74 72 69 65 73 20 72 65 71 75 69 72 65   entries require
6520: 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65  d */.    resolve
6530: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
6540: 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20  g, &nStack);.   
6550: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
6560: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61  , p->nOp);.    a
6570: 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29  ssert( nVar>=0 )
6580: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53  ;.    assert( nS
6590: 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  tack<p->nOp );. 
65a0: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
65b0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 61 63 6b   ){.      nStack
65c0: 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 20 20 20   = 16;.    }.   
65d0: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c   p->aStack = sql
65e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
65f0: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 53 74  (db,.        nSt
6600: 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53  ack*sizeof(p->aS
6610: 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61  tack[0])    /* a
6620: 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b  Stack */.      +
6630: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
6640: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
6650: 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20  /* apArg */.    
6660: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6670: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6680: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
6690: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
66a0: 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20  f(char*)        
66b0: 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f       /* azVar */
66c0: 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69  .      + nMem*si
66d0: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
66e0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20          /* aMem 
66f0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73  */.      + nCurs
6700: 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72  or*sizeof(Cursor
6710: 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20 61 70 43  *) + 1    /* apC
6720: 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20  sr */.    );.   
6730: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
6740: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
6750: 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53  p->aMem = &p->aS
6760: 74 61 63 6b 5b 6e 53 74 61 63 6b 2d 31 5d 3b 20  tack[nStack-1]; 
6770: 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20   /* aMem[] goes 
6780: 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a  from 1..nMem */.
6790: 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
67a0: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
67b0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
67c0: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
67d0: 2d 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61  -1 */.      p->a
67e0: 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e  Var = &p->aMem[n
67f0: 4d 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d  Mem+1];.      p-
6800: 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20  >nVar = nVar;.  
6810: 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30      p->okVar = 0
6820: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67  ;.      p->apArg
6830: 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56   = (Mem**)&p->aV
6840: 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20  ar[nVar];.      
6850: 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72  p->azVar = (char
6860: 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72  **)&p->apArg[nAr
6870: 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  g];.      p->apC
6880: 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26  sr = (Cursor**)&
6890: 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a  p->azVar[nVar];.
68a0: 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72        p->nCursor
68b0: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
68c0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
68d0: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; n++){.       
68e0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
68f0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
6900: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
6910: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
6920: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b  }.      for(n=0;
6930: 20 6e 3c 6e 53 74 61 63 6b 3b 20 6e 2b 2b 29 7b   n<nStack; n++){
6940: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61  .        p->aSta
6950: 63 6b 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ck[n].db = db;. 
6960: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6970: 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 70  .  for(n=1; n<=p
6980: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
6990: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
69a0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
69b0: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
69c0: 20 3d 20 64 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d   = db;.  }..  p-
69d0: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
69e0: 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20  ck[-1];.  p->pc 
69f0: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
6a00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
6a10: 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20  uniqueCnt = 0;. 
6a20: 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20   p->returnDepth 
6a30: 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  = 0;.  p->errorA
6a40: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
6a50: 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20  ;.  p->popStack 
6a60: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
6a70: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
6a80: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
6a90: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
6aa0: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
6ab0: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
6ac0: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
6ad0: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
6ae0: 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61  ;.  p->openedSta
6af0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64  tement = 0;.#ifd
6b00: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
6b10: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
6b20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
6b30: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
6b40: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
6b50: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
6b60: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
6b70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6b80: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
6b90: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
6ba0: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
6bb0: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
6bc0: 74 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73  t cursor happens
6bd0: 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  .** to hold..*/.
6be0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6bf0: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
6c00: 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29  *p, Cursor *pCx)
6c10: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
6c20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
6c30: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75  }.  if( pCx->pCu
6c40: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
6c50: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
6c60: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
6c70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  );.  }.  if( pCx
6c80: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
6c90: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
6ca0: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69  Cx->pBt);.  }.#i
6cb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6cc0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
6cd0: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
6ce0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
6cf0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
6d00: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
6d10: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
6d20: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
6d30: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
6d40: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
6d50: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
6d60: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
6d70: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
6d80: 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d  f(p->db);.    pM
6d90: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
6da0: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
6db0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
6dc0: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69  p->db);.    p->i
6dd0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
6de0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
6df0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e  lite3_free(pCx->
6e00: 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  pData);.  sqlite
6e10: 33 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70  3_free(pCx->aTyp
6e20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
6e30: 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(pCx);.}../*.*
6e40: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
6e50: 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72 20 56  ors except for V
6e60: 54 61 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  Tab cursors that
6e70: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
6e80: 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  * in use..*/.sta
6e90: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
6ea0: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
6eb0: 74 69 76 65 56 74 61 62 73 28 56 64 62 65 20 2a  tiveVtabs(Vdbe *
6ec0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
6ed0: 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29  f( p->apCsr==0 )
6ee0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
6ef0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
6f00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73  ; i++){.    Curs
6f10: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
6f20: 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  r[i];.    if( pC
6f30: 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d   && (!p->inVtabM
6f40: 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56  ethod || !pC->pV
6f50: 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  tabCursor) ){.  
6f60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
6f70: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
6f80: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
6f90: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
6fa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
6fb0: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
6fc0: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
6fd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6fe0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
6ff0: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
7000: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
7010: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
7020: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
7030: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
7040: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
7050: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
7060: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
7070: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
7080: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
7090: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
70a0: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29   if( p->aStack )
70b0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
70c0: 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c  Array(p->aStack,
70d0: 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20   1 + (p->pTos - 
70e0: 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20  p->aStack));.   
70f0: 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61   p->pTos = &p->a
7100: 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20  Stack[-1];.  }. 
7110: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
7120: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
7130: 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  s(p);.  releaseM
7140: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d  emArray(&p->aMem
7150: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  [1], p->nMem);. 
7160: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
7170: 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29  Clear(&p->sFifo)
7180: 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65  ;.  if( p->conte
7190: 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66  xtStack ){.    f
71a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e  or(i=0; i<p->con
71b0: 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b  textStackTop; i+
71c0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
71d0: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
71e0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
71f0: 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d  i].sFifo);.    }
7200: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7210: 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  e(p->contextStac
7220: 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e  k);.  }.  p->con
7230: 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20  textStack = 0;. 
7240: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
7250: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
7260: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20  contextStackTop 
7270: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
7280: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
7290: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
72a0: 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  0;.  p->pResultS
72b0: 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et = 0;.}../*.**
72c0: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
72d0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
72e0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
72f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
7300: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
7310: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
7320: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
7330: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
7340: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
7350: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
7360: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
7370: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
7380: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
7390: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
73a0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
73b0: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
73c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
73d0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
73e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
73f0: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
7400: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
7410: 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65   n;..  releaseMe
7420: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
7430: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
7440: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
7450: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
7460: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
7470: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
7480: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
7490: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c  Column = nResCol
74a0: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
74b0: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
74c0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
74d0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c  allocZero(p->db,
74e0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
74f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
7500: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
7510: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
7520: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
7530: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
7540: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
7550: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
7560: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
7570: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
7580: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7590: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
75a0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
75b0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
75c0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
75d0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
75e0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
75f0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
7600: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
7610: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
7620: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
7630: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
7640: 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f 53  **.** If N==P4_S
7650: 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20  TATIC  it means 
7660: 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20  that zName is a 
7670: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e  pointer to a con
7680: 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20  stant static.** 
7690: 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61  string and we ca
76a0: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
76b0: 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69  pointer. If it i
76c0: 73 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 74 68  s P4_DYNAMIC, th
76d0: 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e  en .** the strin
76e0: 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e 67  g is freed using
76f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
7700: 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
7710: 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a   finished with.*
7720: 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  * it. Otherwise,
7730: 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d   N bytes of zNam
7740: 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f  e are copied..*/
7750: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
7760: 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20  SetColName(Vdbe 
7770: 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
7780: 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72   var, const char
7790: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b   *zName, int N){
77a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
77b0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73   *pColName;.  as
77c0: 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65  sert( idx<p->nRe
77d0: 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  sColumn );.  ass
77e0: 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45  ert( var<COLNAME
77f0: 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  _N );.  if( p->d
7800: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7810: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7820: 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28  NOMEM;.  assert(
7830: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
7840: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
7850: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
7860: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
7870: 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d  umn]);.  if( N==
7880: 50 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d  P4_DYNAMIC || N=
7890: 3d 50 34 5f 53 54 41 54 49 43 20 29 7b 0a 20 20  =P4_STATIC ){.  
78a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
78b0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
78c0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
78d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
78e0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
78f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
7900: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
7910: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
7920: 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f  Name, N, SQLITE_
7930: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e  UTF8,SQLITE_TRAN
7940: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66  SIENT);.  }.  if
7950: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7960: 26 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43  && N==P4_DYNAMIC
7970: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
7980: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e  ->flags = (pColN
7990: 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d  ame->flags&(~MEM
79a0: 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79  _Static))|MEM_Dy
79b0: 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  n;.    pColName-
79c0: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  >xDel = 0;.  }. 
79d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
79e0: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
79f0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
7a00: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
7a10: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
7a20: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
7a30: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
7a40: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
7a50: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
7a60: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
7a70: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
7a80: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
7a90: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
7aa0: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
7ab0: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
7ac0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
7ad0: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
7ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
7af0: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
7b00: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
7b10: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
7b20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
7b30: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
7b40: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
7b50: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
7b60: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7b70: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
7b80: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  mmit = 0;..  /* 
7b90: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
7ba0: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
7bb0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
7bc0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
7bd0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
7be0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
7bf0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
7c00: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
7c10: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
7c20: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
7c30: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
7c40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7c50: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
7c60: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
7c70: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
7c80: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
7c90: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
7ca0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
7cb0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
7cc0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
7cd0: 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rc);.  if( rc!=S
7ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7cf0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
7d00: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
7d10: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
7d20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
7d30: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
7d40: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
7d50: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
7d60: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
7d70: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
7d80: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
7d90: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
7da0: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
7db0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
7dc0: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
7dd0: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
7de0: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
7df0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
7e00: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
7e10: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
7e20: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
7e30: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
7e40: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
7e50: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
7e60: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
7e70: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
7e80: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
7e90: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
7ea0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
7eb0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
7ec0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
7ed0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
7ee0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
7ef0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
7f00: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
7f10: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
7f20: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
7f30: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
7f40: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
7f50: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
7f60: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
7f70: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20  SafetyOff(db);. 
7f80: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
7f90: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
7fa0: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
7fb0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
7fc0: 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
7fd0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7fe0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
7ff0: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NT;.    }.  }.. 
8000: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
8010: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
8020: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
8030: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
8040: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
8050: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
8060: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
8070: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
8080: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
8090: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
80a0: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
80b0: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
80c0: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
80d0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
80e0: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
80f0: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
8100: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
8110: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
8120: 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63  ory:.  In that c
8130: 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e  ase we do.  ** n
8140: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
8150: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
8160: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
8170: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
8180: 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f  n.  ** too..  */
8190: 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e  .  if( 0==strlen
81a0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
81b0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
81c0: 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72  [0].pBt)) || nTr
81d0: 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f  ans<=1 ){.    fo
81e0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
81f0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
8200: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
8210: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8220: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8230: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
8240: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8250: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8260: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
8270: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8280: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
8290: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
82a0: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
82b0: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
82c0: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
82d0: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
82e0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
82f0: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
8300: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
8310: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
8320: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
8330: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
8340: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
8350: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
8360: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
8370: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
8380: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
8390: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
83a0: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
83b0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
83c0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
83d0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
83e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
83f0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8400: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8410: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
8420: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8430: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
8440: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
8450: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
8460: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8470: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
8480: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
8490: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
84a0: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
84b0: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
84c0: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
84d0: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
84e0: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
84f0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
8500: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
8510: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8520: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
8530: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
8540: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8550: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
8560: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
8570: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
8580: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
8590: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
85a0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
85b0: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
85c0: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
85d0: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
85e0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
85f0: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
8600: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
8610: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
8620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
8630: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
8640: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
8650: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  = 0;..    /* Sel
8660: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
8670: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
8680: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
8690: 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20   u32 random;.   
86a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
86b0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
86c0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
86d0: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
86e0: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
86f0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
8700: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
8710: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
8720: 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78  nFile, random&0x
8730: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
8740: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
8750: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8770: 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
8780: 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  ( sqlite3OsAcces
8790: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
87a0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
87b0: 58 49 53 54 53 29 20 29 3b 0a 0a 20 20 20 20 2f  XISTS) );..    /
87c0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
87d0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
87e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
87f0: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
8800: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
8810: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c  er, .        SQL
8820: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
8830: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
8840: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 53  REATE|.        S
8850: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
8860: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
8870: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
8880: 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66   0.    );.    if
8890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
88a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
88b0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
88c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
88d0: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
88e0: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
88f0: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
8900: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
8910: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
8920: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
8930: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8940: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
8950: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
8960: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
8970: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
8980: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8990: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
89a0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
89b0: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
89c0: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
89d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
89e0: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
89f0: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
8a00: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
8a10: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
8a20: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
8a30: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
8a40: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8a50: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
8a60: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
8a70: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  pBt;.      if( i
8a80: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==1 ) continue; 
8a90: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
8aa0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
8ab0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
8ac0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
8ad0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
8ae0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
8af0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
8b00: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
8b10: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
8b20: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
8b30: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
8b40: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
8b50: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
8b60: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
8b70: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
8b80: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
8b90: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
8ba0: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
8bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
8bd0: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
8be0: 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  le, strlen(zFile
8bf0: 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
8c00: 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
8c10: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b  strlen(zFile)+1;
8c20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
8c30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
8c50: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
8c60: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
8c70: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8c80: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
8c90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
8ca0: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
8cc0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
8cd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8ce0: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
8cf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8d00: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
8d10: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
8d20: 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
8d30: 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
8d40: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
8d50: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69    */.    zMainFi
8d60: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
8d70: 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e  eGetDirname(db->
8d80: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
8d90: 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a   if( (needSync .
8da0: 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c       && (0==(sql
8db0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
8dc0: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
8dd0: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
8de0: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20  P_SEQUENTIAL)). 
8df0: 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74      && (rc=sqlit
8e00: 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
8e10: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
8e20: 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f  RMAL))!=SQLITE_O
8e30: 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  K) ){.      sqli
8e40: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
8e50: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
8e60: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8e70: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
8e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8e90: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
8ea0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
8ec0: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
8ed0: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
8ee0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8ef0: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
8f00: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
8f10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
8f20: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
8f30: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
8f40: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
8f50: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
8f60: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
8f70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8f80: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
8f90: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
8fa0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
8fb0: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
8fc0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
8fd0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8fe0: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
8ff0: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
9000: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
9010: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9020: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
9030: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
9040: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
9050: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
9060: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9070: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
9080: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9090: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
90a0: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
90b0: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a  ailure occured..
90c0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
90d0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
90e0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
90f0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
9100: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
9110: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
9120: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
9130: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
9140: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
9150: 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
9160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9170: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9180: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
9190: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
91a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
91b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
91c0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
91d0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
91e0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
91f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9200: 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
9210: 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
9220: 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
9230: 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
9240: 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
9250: 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
9260: 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
9270: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
9280: 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
9290: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
92a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
92b0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
92c0: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
92d0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
92e0: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
92f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
9300: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9310: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
9320: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
9330: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
9340: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
9350: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
9360: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
9370: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
9380: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
9390: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
93a0: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
93b0: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
93c0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
93d0: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
93e0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
93f0: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
9400: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
9410: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
9420: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
9430: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
9440: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
9450: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
9460: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
9470: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
9480: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
9490: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
94a0: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
94b0: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
94c0: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
94d0: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
94e0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
94f0: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
9500: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9510: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
9520: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
9530: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
9540: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
9550: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9560: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
9570: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9580: 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
9590: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
95a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
95b0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
95c0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
95d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
95e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
95f0: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
9600: 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e  te3.activeVdbeCn
9610: 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  t count variable
9620: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
9630: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
9640: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
9650: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
9660: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
9670: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
9680: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
9690: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
96a0: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
96b0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
96c0: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
96d0: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
96e0: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
96f0: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
9700: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
9710: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
9720: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
9730: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
9740: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
9750: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
9760: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
9770: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
9780: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
9790: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
97a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
97b0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
97c0: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
97d0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
97e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
97f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
9800: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
9810: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
9820: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
9830: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
9840: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
9850: 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42  *.** For every B
9860: 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74  tree that in dat
9870: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9880: 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61   db which .** ha
9890: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c  s been modified,
98a0: 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c   "trip" or inval
98b0: 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f  idate each curso
98c0: 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72  r in.** that Btr
98d0: 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ee might have be
98e0: 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  en modified so t
98f0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
9900: 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75  * can never be u
9910: 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73  sed again.  This
9920: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20   happens when a 
9930: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63  rollback.*** occ
9940: 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  urs.  We have to
9950: 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74   trip all the ot
9960: 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65  her cursors, eve
9970: 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d  n.** cursor from
9980: 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69   other VMs in di
9990: 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65  fferent database
99a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a   connections,.**
99b0: 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66   so that none of
99c0: 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65   them try to use
99d0: 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69   the data at whi
99e0: 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20  ch they.** were 
99f0: 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69  pointing and whi
9a00: 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20  ch now may have 
9a10: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65  been changed due
9a20: 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  .** to the rollb
9a30: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d  ack..**.** Remem
9a40: 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62  ber that a rollb
9a50: 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74  ack can delete t
9a60: 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61  ables complete a
9a70: 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f  nd.** reorder ro
9a80: 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20  otpages.  So it 
9a90: 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
9aa0: 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a  t just to save.*
9ab0: 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  * the state of t
9ac0: 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68  he cursor.  We h
9ad0: 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  ave to invalidat
9ae0: 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  e the cursor.** 
9af0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65  so that it is ne
9b00: 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a  ver used again..
9b10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
9b20: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
9b30: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
9b40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9b50: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
9b60: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
9b70: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
9b80: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9b90: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20  t;.    if( p && 
9ba0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
9bb0: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
9bc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
9bd0: 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
9be0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20  SQLITE_ABORT);. 
9bf0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9c00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9c10: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
9c20: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
9c30: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
9c40: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
9c50: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
9c60: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
9c70: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
9c80: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
9c90: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
9ca0: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
9cb0: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
9cc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9cd0: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
9ce0: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
9cf0: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
9d00: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
9d10: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
9d20: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
9d30: 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
9d40: 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
9d50: 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
9d60: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
9d70: 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
9d80: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
9d90: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
9da0: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
9db0: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
9dc0: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
9dd0: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
9de0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
9df0: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
9e00: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
9e10: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
9e20: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
9e30: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
9e40: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
9e50: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
9e60: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
9e70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
9e80: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
9e90: 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65  t (*xFunc)(Btree
9ea0: 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20   *pBt) = 0;  /* 
9eb0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
9ec0: 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20 62   on each btree b
9ed0: 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ackend */.  int 
9ee0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
9ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
9f00: 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c  t to true if SQL
9f10: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45  ITE_NOMEM or IOE
9f20: 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  RR */..  /* This
9f30: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
9f40: 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
9f50: 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
9f60: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
9f70: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
9f80: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
9f90: 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
9fa0: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
9fb0: 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
9fc0: 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
9fd0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
9fe0: 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
9ff0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
a000: 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
a010: 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
a020: 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
a030: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
a040: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
a050: 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
a060: 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
a070: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
a080: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
a090: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
a0a0: 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
a0b0: 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
a0c0: 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
a0d0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
a0e0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
a0f0: 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
a100: 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
a110: 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
a120: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
a130: 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
a140: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
a150: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
a160: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a170: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
a180: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c  _NOMEM;.  }.  cl
a190: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63  oseAllCursorsExc
a1a0: 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28 70  eptActiveVtabs(p
a1b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
a1c0: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
a1d0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
a1e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
a1f0: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
a200: 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
a210: 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
a220: 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
a230: 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
a240: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66   started */.  if
a250: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
a260: 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
a270: 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
a280: 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
a290: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
a2a0: 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
a2b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
a2c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
a2d0: 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65  eeMutexArrayEnte
a2e0: 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a  r(&p->aMutex);..
a2f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
a300: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
a310: 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
a320: 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
a330: 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
a340: 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
a350: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
a360: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
a370: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
a380: 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
a390: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
a3a0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
a3b0: 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
a3c0: 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
a3d0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f       /* This loo
a3e0: 70 20 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e  p does static an
a3f0: 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 71 75  alysis of the qu
a400: 65 72 79 20 74 6f 20 73 65 65 20 77 68 69 63 68  ery to see which
a410: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
a420: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
a430: 20 63 61 74 65 67 6f 72 69 65 73 20 69 74 20 66   categories it f
a440: 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20  alls into:.     
a450: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
a460: 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20   Read-only.     
a470: 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77 69   **     Query wi
a480: 74 68 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  th statement jou
a490: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20  rnal.      **   
a4a0: 20 20 51 75 65 72 79 20 77 69 74 68 6f 75 74 20    Query without 
a4b0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a4c0: 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  l.      **.     
a4d0: 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20   ** We could do 
a4e0: 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65  something more e
a4f0: 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73  legant than this
a500: 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73   static analysis
a510: 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20   (i.e..      ** 
a520: 73 74 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f  store the type o
a530: 66 20 71 75 65 72 79 20 61 73 20 70 61 72 74 20  f query as part 
a540: 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69  of the compliati
a550: 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a  on phase), but .
a560: 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e        ** handlin
a570: 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  g malloc() or IO
a580: 20 66 61 69 6c 75 72 65 20 69 73 20 61 20 66 61   failure is a fa
a590: 69 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67  irly obscure edg
a5a0: 65 20 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20  e case so .     
a5b0: 20 2a 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62   ** this is prob
a5c0: 61 62 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64  ably easier. Tod
a5d0: 6f 3a 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f  o: Might be an o
a5e0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
a5f0: 64 75 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  duce .      ** c
a600: 6f 64 65 20 73 69 7a 65 20 61 20 76 65 72 79 20  ode size a very 
a610: 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f  small amount tho
a620: 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ugh....      */.
a630: 20 20 20 20 20 20 69 6e 74 20 6e 6f 74 52 65 61        int notRea
a640: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
a650: 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74   int isStatement
a660: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
a670: 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e  rt(p->aOp || p->
a680: 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66  nOp==0);.      f
a690: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
a6a0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
a6b0: 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b   switch( p->aOp[
a6c0: 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  i].opcode ){.   
a6d0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54         case OP_T
a6e0: 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20  ransaction:.    
a6f0: 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61 64 4f          notReadO
a700: 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d  nly |= p->aOp[i]
a710: 2e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .p2;.           
a720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a730: 20 20 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d    case OP_Statem
a740: 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ent:.           
a750: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31   isStatement = 1
a760: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
a770: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a780: 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20       }..   .    
a790: 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
a7a0: 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  y was read-only,
a7b0: 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72   we need do no r
a7c0: 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20  ollback at all. 
a7d0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
a7e0: 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68   ** proceed with
a7f0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e   the special han
a800: 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  dling..      */.
a810: 20 20 20 20 20 20 69 66 28 20 6e 6f 74 52 65 61        if( notRea
a820: 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
a830: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
a840: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
a850: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc==SQLITE_IOER
a860: 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53  R_BLOCKED && isS
a870: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
a880: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
a890: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
a8a0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  ckStmt;.        
a8b0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
a8c0: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
a8d0: 20 65 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d   else if( (mrc==
a8e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
a8f0: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
a900: 29 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74  ) && isStatement
a910: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
a920: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
a930: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
a940: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a950: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
a960: 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
a970: 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
a980: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
a990: 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
a9a0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
a9b0: 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
a9c0: 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
a9d0: 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
a9e0: 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
a9f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
aa00: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
aa10: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
aa20: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
aa30: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
aa40: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
aa50: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
aa60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
aa70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
aa80: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
aa90: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
aaa0: 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
aab0: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
aac0: 74 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a  tive vdbe, then.
aad0: 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74      ** we do eit
aae0: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
aaf0: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
ab00: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
ab10: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
ab20: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
ab30: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
ab40: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
ab50: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
ab60: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
ab70: 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a  e has occured. .
ab80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
ab90: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26  b->autoCommit &&
aba0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
abb0: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  nt==1 ){.      i
abc0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
abd0: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
abe0: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
abf0: 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
ac00: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  or) ){.        /
ac10: 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
ac20: 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
ac30: 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72 6f  and the vdbe pro
ac40: 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20  gram was .      
ac50: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
ac60: 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
ac70: 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  IL' constraint. 
ac80: 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
ac90: 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mit .        ** 
aca0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
acb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
acc0: 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d  int rc = vdbeCom
acd0: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20  mit(db);.       
ace0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
acf0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
ad00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
ad10: 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70  texArrayLeave(&p
ad20: 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  ->aMutex);.     
ad30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ad40: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
ad50: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
ad60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ad70: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
ad80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ad90: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
ada0: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
adb0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
adc0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
add0: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
ade0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
adf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ae00: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
ae10: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
ae20: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75    }else if( !xFu
ae30: 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nc ){.      if( 
ae40: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
ae50: 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
ae60: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
ae70: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
ae80: 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b  enedStatement ){
ae90: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
aea0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
aeb0: 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20  ommitStmt;.     
aec0: 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
aed0: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
aee0: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
aef0: 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20  {.        xFunc 
af00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
af10: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
af20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
af30: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
af40: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
af50: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
af60: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
af70: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
af80: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
af90: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
afa0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78  }.  .    /* If x
afb0: 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Func is not NULL
afc0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65  , then it is one
afd0: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
afe0: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a  RollbackStmt or.
aff0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
b000: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43  reeCommitStmt. C
b010: 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65  all it once on e
b020: 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20  ach backend. If 
b030: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  an error occurs.
b040: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72      ** and the r
b050: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74  eturn code is st
b060: 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73  ill SQLITE_OK, s
b070: 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
b080: 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20  de to the new.  
b090: 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65    ** error value
b0a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
b0b0: 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20  ert(!xFunc ||.  
b0c0: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
b0d0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
b0e0: 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63  t ||.      xFunc
b0f0: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  ==sqlite3BtreeRo
b100: 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29  llbackStmt.    )
b110: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78  ;.    for(i=0; x
b120: 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44  Func && i<db->nD
b130: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
b140: 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74  int rc;.      Bt
b150: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
b160: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
b170: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
b180: 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70      rc = xFunc(p
b190: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
b1a0: 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53   rc && (p->rc==S
b1b0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
b1c0: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
b1d0: 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20  AINT) ){.       
b1e0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
b1f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b200: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
b210: 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20  rrMsg, 0);.     
b220: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b230: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
b240: 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
b250: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
b260: 4c 45 54 45 20 61 6e 64 20 74 68 65 20 73 74 61  LETE and the sta
b270: 74 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69  tement was commi
b280: 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65  tted, .    ** se
b290: 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  t the change cou
b2a0: 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
b2b0: 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
b2c0: 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  ntOn && p->pc>=0
b2d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78   ){.      if( !x
b2e0: 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73  Func || xFunc==s
b2f0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
b300: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  tStmt ){.       
b310: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
b320: 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
b330: 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
b340: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
b350: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
b360: 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
b370: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
b380: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nge = 0;.    }. 
b390: 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   .    /* Rollbac
b3a0: 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20  k or commit any 
b3b0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74  schema changes t
b3c0: 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f  hat occurred. */
b3d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  .    if( p->rc!=
b3e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d  SQLITE_OK && db-
b3f0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
b400: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
b410: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
b420: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
b430: 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62  db, 0);.      db
b440: 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66  ->flags = (db->f
b450: 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e  lags | SQLITE_In
b460: 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20  ternChanges);.  
b470: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
b480: 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
b490: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
b4a0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
b4b0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
b4c0: 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
b4d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
b4e0: 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
b4f0: 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
b500: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
b510: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
b520: 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62     db->activeVdb
b530: 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt--;.  }.  p-
b540: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
b550: 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
b560: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
b570: 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
b580: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b590: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
b5a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
b5b0: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
b5c0: 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75  Cnt(db);..  retu
b5d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b5e0: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
b5f0: 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
b600: 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
b610: 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
b620: 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
b630: 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
b640: 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
b650: 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
b660: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
b670: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
b680: 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
b690: 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
b6a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b6b0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
b6c0: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
b6d0: 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
b6e0: 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
b6f0: 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
b700: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
b710: 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
b720: 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
b730: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
b740: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
b750: 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
b760: 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
b770: 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
b780: 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
b790: 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
b7a0: 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
b7b0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
b7c0: 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
b7d0: 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
b7e0: 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
b7f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
b800: 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
b810: 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
b820: 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
b830: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
b840: 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
b850: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b860: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
b870: 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
b880: 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
b890: 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
b8a0: 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
b8b0: 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
b8c0: 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
b8d0: 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
b8e0: 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
b8f0: 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
b900: 2f 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  /.  sqlite3Safet
b910: 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  yOn(db);.  sqlit
b920: 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20  e3VdbeHalt(p);. 
b930: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
b940: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
b950: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
b960: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
b970: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
b980: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
b990: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
b9a0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
b9b0: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
b9c0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
b9d0: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
b9e0: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
b9f0: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
ba00: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
ba10: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
ba20: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
ba30: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
ba40: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
ba50: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
ba60: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
ba70: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
ba80: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
ba90: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
baa0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
bab0: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
bac0: 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73  Err,-1,p->zErrMs
bad0: 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 73 71  g,SQLITE_UTF8,sq
bae0: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
baf0: 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
bb00: 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d   p->rc;.      p-
bb10: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
bb20: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
bb30: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
bb40: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
bb50: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
bb60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
bb70: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
bb80: 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  OK, 0);.    }.  
bb90: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
bba0: 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
bbb0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
bbc0: 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
bbd0: 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
bbe0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
bbf0: 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
bc00: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
bc10: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
bc20: 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
bc30: 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
bc40: 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
bc50: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
bc60: 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
bc70: 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
bc80: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
bc90: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
bca0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
bcb0: 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
bcc0: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
bcd0: 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33  TE_UTF8, sqlite3
bce0: 5f 66 72 65 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  _free);.    p->z
bcf0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
bd00: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
bd10: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
bd20: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
bd30: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
bd40: 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
bd50: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
bd60: 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
bd70: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
bd80: 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74   p->pTos<&p->aSt
bd90: 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d  ack[p->pc<0?0:p-
bda0: 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61 53 74 61  >pc] || !p->aSta
bdb0: 63 6b 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42  ck );.#ifdef VDB
bdc0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
bdd0: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
bde0: 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
bdf0: 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
be00: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
be10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
be20: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
be30: 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
be40: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
be50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
be60: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
be70: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
be80: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
be90: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
bea0: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
beb0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
bec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
bed0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
bee0: 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
bef0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
bf00: 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
bf10: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
bf20: 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
bf30: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
bf40: 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
bf50: 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
bf60: 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
bf70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bf80: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
bf90: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
bfa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bfb0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
bfc0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
bfd0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
bfe0: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70  _MAGIC_INIT;.  p
bff0: 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20  ->aborted = 0;. 
c000: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
c010: 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
c020: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
c030: 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
c040: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
c050: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
c060: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
c070: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
c080: 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
c090: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
c0a0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
c0b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c0c0: 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
c0d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
c0e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
c0f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
c100: 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
c110: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
c120: 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
c130: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
c140: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
c150: 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
c160: 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
c170: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
c180: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
c190: 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72  IC_INIT ){.    r
c1a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
c1b0: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
c1c0: 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
c1d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c1e0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
c1f0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
c200: 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
c210: 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
c220: 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
c230: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
c240: 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
c250: 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
c260: 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
c270: 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
c280: 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
c290: 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
c2a0: 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
c2b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
c2c0: 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
c2d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
c2e0: 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
c2f0: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
c300: 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
c310: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
c320: 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
c330: 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
c340: 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
c350: 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
c360: 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
c370: 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
c380: 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70  sk&(1<<i))) && p
c390: 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
c3a0: 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
c3b0: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
c3c0: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
c3d0: 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
c3e0: 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
c3f0: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
c400: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
c410: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
c420: 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
c430: 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
c440: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
c450: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
c460: 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70  urn;.  Cleanup(p
c470: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
c480: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
c490: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
c4a0: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
c4b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
c4c0: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
c4d0: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20   p->db->pVdbe = 
c4e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
c4f0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
c500: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
c510: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
c520: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70    }.  if( p->aOp
c530: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20   ){.    Op *pOp 
c540: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f  = p->aOp;.    fo
c550: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
c560: 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i++, pOp++){.  
c570: 20 20 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e      freeP4(pOp->
c580: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
c590: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
c5a0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71  E_DEBUG.      sq
c5b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 2d 3e  lite3_free(pOp->
c5c0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
c5d0: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20  f     .    }.   
c5e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
c5f0: 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  >aOp);.  }.  rel
c600: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
c610: 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
c620: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c630: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
c640: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 53 74  ite3_free(p->aSt
c650: 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  ack);.  releaseM
c660: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
c670: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
c680: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
c690: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
c6a0: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
c6b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53  lite3_free(p->zS
c6c0: 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ql);.  p->magic 
c6d0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
c6e0: 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  D;.  sqlite3_fre
c6f0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(p);.}../*.** I
c700: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
c710: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
c720: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
c730: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
c740: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
c750: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
c760: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
c770: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
c780: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
c790: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
c7a0: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
c7b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
c7c0: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
c7d0: 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b  veto(Cursor *p){
c7e0: 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
c7f0: 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
c800: 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
c810: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
c820: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
c830: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
c840: 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
c850: 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
c860: 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
c870: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
c880: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
c890: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
c8a0: 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
c8b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c8c0: 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63  rc;.    *p->pInc
c8d0: 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rKey = 0;.    p-
c8e0: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79  >lastRowid = key
c8f0: 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54  ToInt(p->movetoT
c900: 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72  arget);.    p->r
c910: 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65  owidIsValid = re
c920: 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65  s==0;.    if( re
c930: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  s<0 ){.      rc 
c940: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
c950: 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  xt(p->pCursor, &
c960: 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
c970: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c980: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
c990: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
c9a0: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
c9b0: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
c9c0: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
c9d0: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
c9e0: 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
c9f0: 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72  E_STALE;.  }.  r
ca00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ca10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
ca20: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
ca30: 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
ca40: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
ca50: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
ca60: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
ca70: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
ca80: 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c  ialRead().** sql
ca90: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
caa0: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
cab0: 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a  beSerialWrite().
cac0: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
cad0: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
cae0: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
caf0: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
cb00: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
cb10: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
cb20: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
cb30: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
cb40: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
cb50: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
cb60: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
cb70: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
cb80: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
cb90: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
cba0: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
cbb0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
cbc0: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
cbd0: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
cbe0: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
cbf0: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
cc00: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
cc10: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
cc20: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
cc30: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
cc40: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
cc50: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
cc60: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
cc70: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
cc80: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
cc90: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
cca0: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
ccb0: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
ccc0: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
ccd0: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
cce0: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
ccf0: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
cd00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
cd10: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
cd20: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
cd30: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
cd40: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
cd50: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
cd60: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
cd70: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
cda0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
cdb0: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
cde0: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
ce10: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
ce20: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
ce30: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
ce40: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
ce50: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
ce80: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
ce90: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
ceb0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
cec0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
ced0: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
cee0: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
cef0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
cf00: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
cf30: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
cf40: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
cf60: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
cf70: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
cfa0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
cfb0: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
cfe0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
cff0: 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
d020: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
d030: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
d040: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
d050: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
d060: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
d070: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
d080: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
d090: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
d0a0: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
d0b0: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
d0c0: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
d0d0: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
d0e0: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
d0f0: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
d100: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
d110: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
d120: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
d130: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
d140: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
d150: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
d160: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
d170: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
d180: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
d190: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
d1a0: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
d1b0: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
d1c0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
d1d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
d1e0: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
d1f0: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
d200: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
d210: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
d220: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
d230: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
d240: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
d250: 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  1000)<<32)-1).  
d260: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
d270: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
d280: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
d290: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
d2a0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
d2b0: 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20  rn 8+i;.    }.  
d2c0: 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a    u = i<0 ? -i :
d2d0: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
d2e0: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
d2f0: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
d300: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
d310: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
d320: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
d330: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
d340: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
d350: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
d360: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
d370: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
d380: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
d390: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
d3a0: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
d3b0: 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53  rt( flags&(MEM_S
d3c0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
d3d0: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
d3e0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
d3f0: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
d400: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d  = pMem->u.i;.  }
d410: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
d420: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
d430: 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
d440: 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
d450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d460: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
d470: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
d480: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
d490: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
d4a0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d4b0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
d4c0: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
d4d0: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
d4e0: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
d4f0: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
d500: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
d510: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
d520: 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
d530: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
d540: 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
d550: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
d560: 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
d570: 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
d580: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
d590: 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
d5a0: 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
d5b0: 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
d5c0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
d5d0: 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
d5e0: 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
d5f0: 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
d600: 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
d610: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
d620: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
d630: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
d640: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
d650: 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
d660: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
d670: 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
d680: 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
d690: 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
d6a0: 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
d6b0: 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
d6c0: 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
d6d0: 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
d6e0: 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
d6f0: 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
d700: 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
d710: 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
d720: 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
d730: 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
d740: 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
d750: 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
d760: 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
d770: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
d780: 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
d790: 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
d7a0: 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
d7b0: 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
d7c0: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
d7d0: 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
d7e0: 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
d7f0: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
d800: 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
d810: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
d820: 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
d830: 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
d840: 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
d850: 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
d860: 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
d870: 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
d880: 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
d890: 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
d8a0: 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
d8b0: 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
d8c0: 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
d8d0: 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
d8e0: 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
d8f0: 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
d900: 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
d910: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
d920: 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
d930: 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
d940: 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
d950: 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
d960: 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
d970: 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
d980: 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
d990: 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
d9a0: 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
d9b0: 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
d9c0: 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
d9d0: 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
d9e0: 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
d9f0: 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
da00: 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
da10: 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
da20: 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
da30: 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
da40: 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
da50: 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
da60: 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
da70: 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
da80: 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
da90: 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
daa0: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
dab0: 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
dac0: 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
dad0: 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
dae0: 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
daf0: 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
db00: 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
db10: 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
db20: 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
db30: 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
db40: 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
db50: 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
db60: 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
db70: 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
db80: 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
db90: 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
dba0: 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
dbb0: 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
dbc0: 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
dbd0: 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
dbe0: 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
dbf0: 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
dc00: 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
dc10: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
dc20: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
dc30: 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
dc40: 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
dc50: 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
dc60: 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
dc70: 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
dc80: 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
dc90: 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
dca0: 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
dcb0: 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
dcc0: 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
dcd0: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
dce0: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
dcf0: 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
dd00: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
dd10: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
dd20: 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
dd30: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
dd40: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
dd50: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
dd60: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
dd70: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
dd80: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
dd90: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
dda0: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
ddb0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
ddc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
ddd0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
dde0: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
ddf0: 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
de00: 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
de10: 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
de20: 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
de30: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
de40: 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
de50: 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
de60: 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
de70: 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
de80: 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
de90: 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
dea0: 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
deb0: 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
dec0: 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
ded0: 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
dee0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
def0: 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
df00: 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
df10: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
df20: 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
df30: 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
df40: 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
df50: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
df60: 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
df70: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
df80: 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
df90: 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
dfa0: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
dfb0: 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
dfc0: 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
dfd0: 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
dfe0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
dff0: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
e000: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
e010: 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
e020: 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
e030: 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
e040: 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
e050: 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
e060: 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
e070: 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
e080: 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
e090: 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  []..*/ .int sqli
e0a0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
e0b0: 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
e0c0: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
e0d0: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
e0e0: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
e0f0: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
e100: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
e110: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
e120: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
e130: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
e140: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
e150: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
e160: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
e170: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
e180: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
e190: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
e1a0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e1b0: 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
e1c0: 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
e1d0: 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
e1e0: 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
e1f0: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
e200: 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
e210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e220: 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
e230: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
e240: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
e250: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
e260: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
e270: 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20  sert( len<=nBuf 
e280: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
e290: 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
e2a0: 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20  ] = (v&0xFF);.  
e2b0: 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
e2c0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
e2d0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
e2e0: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
e2f0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e300: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
e310: 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
e320: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
e330: 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
e340: 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  i:0).           
e350: 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65    == sqlite3Vdbe
e360: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
e370: 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
e380: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
e390: 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
e3a0: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
e3b0: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
e3c0: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
e3d0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
e3e0: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
e3f0: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
e400: 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28  ->u.i;.      if(
e410: 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20   len>nBuf ){.   
e420: 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b       len = nBuf;
e430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
e440: 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
e450: 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
e460: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
e470: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
e480: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
e490: 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
e4a0: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
e4b0: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
e4c0: 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
e4d0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
e4e0: 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
e4f0: 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
e500: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
e510: 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
e520: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
e530: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
e540: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
e550: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
e560: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
e570: 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
e580: 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
e590: 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
e5a0: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
e5b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e5c0: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
e5d0: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
e5e0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
e610: 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
e620: 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
e630: 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
e640: 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
e650: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
e660: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
e670: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
e680: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
e690: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
e6a0: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
e6b0: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
e6c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
e6d0: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
e6e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e6f0: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
e700: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e710: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
e720: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
e730: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
e740: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e750: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e760: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
e770: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
e780: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
e790: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
e7a0: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
e7b0: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
e7c0: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
e7d0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e7e0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e7f0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
e800: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
e810: 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
e820: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
e830: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
e840: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
e850: 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
e860: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
e870: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e880: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e890: 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
e8a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
e8b0: 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
e8c0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e8d0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
e8e0: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
e8f0: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
e900: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
e910: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
e920: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
e940: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
e950: 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
e960: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
e970: 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
e980: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
e990: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
e9a0: 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
e9b0: 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
e9c0: 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
e9d0: 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
e9e0: 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
e9f0: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
ea00: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
ea10: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
ea20: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ea30: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
ea40: 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
ea50: 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
ea60: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
ea70: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
ea80: 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
ea90: 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
eaa0: 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
eab0: 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
eac0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
ead0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
eae0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
eaf0: 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
eb00: 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
eb10: 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
eb20: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
eb30: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
eb40: 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
eb50: 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
eb60: 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
eb70: 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
eb80: 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
eb90: 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
eba0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
ebb0: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
ebc0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
ebd0: 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
ebe0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
ebf0: 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
ec00: 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
ec10: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
ec20: 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
ec30: 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
ec40: 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
ec50: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
ec60: 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
ec70: 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
ec80: 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
ec90: 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
eca0: 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
ecb0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
ecc0: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
ecd0: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
ece0: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
ecf0: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
ed00: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
ed10: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
ed20: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
ed30: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
ed40: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
ed50: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
ed60: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
ed70: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
ed80: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
ed90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
eda0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
edb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
edc0: 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
edd0: 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
ede0: 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
edf0: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
ee00: 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
ee10: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
ee20: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
ee30: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
ee40: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65  ->flags = MEM_Re
ee50: 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
ee60: 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
ee70: 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
ee80: 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
ee90: 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
eea0: 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
eeb0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
eec0: 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
eed0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
eee0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
eef0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ef00: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
ef10: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e   {.      int len
ef20: 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
ef30: 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
ef40: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
ef50: 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
ef60: 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
ef70: 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
ef80: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
ef90: 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20  type&0x01 ){.   
efa0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
efb0: 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d   = MEM_Str | MEM
efc0: 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65  _Ephem;.      }e
efd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
efe0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
eff0: 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  lob | MEM_Ephem;
f000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f010: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
f020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65  .}../*.** The he
f040: 61 64 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64  ader of a record
f050: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
f060: 65 71 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65  equence variable
f070: 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73  -length integers
f080: 2e 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67  ..** These integ
f090: 65 72 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  ers are almost a
f0a0: 6c 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20  lways small and 
f0b0: 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61  are encoded as a
f0c0: 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a   single byte..**
f0d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
f0e0: 61 63 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e  acro takes advan
f0f0: 74 61 67 65 20 74 68 69 73 20 66 61 63 74 20 74  tage this fact t
f100: 6f 20 70 72 6f 76 69 64 65 20 61 20 66 61 73 74  o provide a fast
f110: 20 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68   decode.** of th
f120: 65 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20  e integers in a 
f130: 72 65 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20  record header.  
f140: 49 74 20 69 73 20 66 61 73 74 65 72 20 66 6f 72  It is faster for
f150: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
f160: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e  .** where the in
f170: 74 65 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c  teger is a singl
f180: 65 20 62 79 74 65 2e 20 20 49 74 20 69 73 20 61  e byte.  It is a
f190: 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77   little slower w
f1a0: 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67  hen the.** integ
f1b0: 65 72 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72  er is two or mor
f1c0: 65 20 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76  e bytes.  But ov
f1d0: 65 72 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74  erall it is fast
f1e0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  er..**.** The fo
f1f0: 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
f200: 6f 6e 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ons are equivale
f210: 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20  nt:.**.**     x 
f220: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
f230: 6e 74 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a  nt32( A, &B );.*
f240: 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74  *.**     x = Get
f250: 56 61 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a  Varint( A, B );.
f260: 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65  **.*/.#define Ge
f270: 74 56 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28  tVarint(A,B)  ((
f280: 42 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20  B = *(A))<=0x7f 
f290: 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74  ? 1 : sqlite3Get
f2a0: 56 61 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29  Varint32(A, &B))
f2b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f2c0: 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
f2d0: 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
f2e0: 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
f2f0: 64 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ds specified by 
f300: 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  .** {nKey1, pKey
f310: 31 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70  1} and {nKey2, p
f320: 4b 65 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67  Key2}, returning
f330: 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
f340: 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
f350: 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65   integer if {nKe
f360: 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65  y1, pKey1} is le
f370: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
f380: 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
f390: 20 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b   than {nKey2, pK
f3a0: 65 79 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31  ey2}.  Both Key1
f3b0: 20 61 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62   and Key2 must b
f3c0: 65 20 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a  e byte strings.*
f3d0: 2a 20 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68  * composed by th
f3e0: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
f3f0: 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
f400: 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  BE..*/.int sqlit
f410: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
f420: 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65  are(.  void *use
f430: 72 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65  rData,.  int nKe
f440: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
f450: 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b  pKey1, .  int nK
f460: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
f470: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49  *pKey2.){.  KeyI
f480: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
f490: 28 4b 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61  (KeyInfo*)userDa
f4a0: 74 61 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32  ta;.  u32 d1, d2
f4b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
f4c0: 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
f4d0: 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
f4e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
f4f0: 64 78 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20  dx1, idx2;      
f500: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
f510: 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
f520: 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
f530: 20 20 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a    u32 szHdr1, sz
f540: 48 64 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Hdr2;  /* Number
f550: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
f560: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
f570: 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
f580: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
f590: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
f5a0: 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
f5b0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f5c0: 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63  har *)pKey1;.  c
f5d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f5e0: 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e  ar *aKey2 = (con
f5f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f600: 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d   *)pKey2;..  Mem
f610: 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d   mem1;.  Mem mem
f620: 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  2;.  mem1.enc = 
f630: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
f640: 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
f650: 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e  nfo->db;.  mem2.
f660: 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
f670: 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 64 62 20 3d  enc;.  mem2.db =
f680: 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
f690: 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56 61   .  idx1 = GetVa
f6a0: 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64  rint(aKey1, szHd
f6b0: 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
f6c0: 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74  r1;.  idx2 = Get
f6d0: 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a  Varint(aKey2, sz
f6e0: 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a  Hdr2);.  d2 = sz
f6f0: 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  Hdr2;.  nField =
f700: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
f710: 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
f720: 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c  <szHdr1 && idx2<
f730: 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33  szHdr2 ){.    u3
f740: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
f750: 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
f760: 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype2;..    /* Re
f770: 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
f780: 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
f790: 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
f7a0: 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
f7b0: 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20  1 += GetVarint( 
f7c0: 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
f7d0: 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
f7e0: 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
f7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
f800: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
f810: 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
f820: 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47  k;.    idx2 += G
f830: 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b  etVarint( aKey2+
f840: 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx2, serial_typ
f850: 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32  e2 );.    if( d2
f860: 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74  >=nKey2 && sqlit
f870: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
f880: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32  Len(serial_type2
f890: 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
f8a0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
f8b0: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
f8c0: 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
f8d0: 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
f8e0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
f8f0: 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
f900: 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
f910: 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65      d2 += sqlite
f920: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
f930: 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61  aKey2[d2], seria
f940: 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b  l_type2, &mem2);
f950: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
f960: 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
f970: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
f980: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
f990: 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69  m1, &mem2, i<nFi
f9a0: 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld ? pKeyInfo->
f9b0: 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20  aColl[i] : 0);. 
f9c0: 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67     if( mem1.flag
f9d0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71  s & MEM_Dyn ) sq
f9e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
f9f0: 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20  ase(&mem1);.    
fa00: 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26  if( mem2.flags &
fa10: 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74   MEM_Dyn ) sqlit
fa20: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
fa30: 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28  (&mem2);.    if(
fa40: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
fa50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fa60: 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
fa70: 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  One of the keys 
fa80: 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
fa90: 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66  s, but all the f
faa0: 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
fab0: 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65   point.  ** were
fac0: 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69   equal. If the i
fad0: 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74  ncrKey flag is t
fae0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65  rue, then the se
faf0: 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a  cond key is.  **
fb00: 20 74 72 65 61 74 65 64 20 61 73 20 6c 61 72 67   treated as larg
fb10: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
fb20: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
fb30: 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65  pKeyInfo->incrKe
fb40: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
fb50: 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  -1;.    }else if
fb60: 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65  ( !pKeyInfo->pre
fb70: 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20  fixIsEqual ){.  
fb80: 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31      if( d1<nKey1
fb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fba0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
fbb0: 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a  if( d2<nKey2 ){.
fbc0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
fbd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fbe0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
fbf0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
fc00: 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
fc10: 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20  Field.          
fc20: 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f       && pKeyInfo
fc30: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
fc40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
fc50: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
fc60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
fc70: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69  argument is an i
fc80: 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f  ndex entry compo
fc90: 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  sed using the OP
fca0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
fcb0: 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  de..** The last 
fcc0: 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65  entry in this re
fcd0: 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61  cord should be a
fce0: 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69  n integer (speci
fcf0: 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  fically.** an in
fd00: 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54  teger rowid).  T
fd10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
fd20: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
fd30: 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68  f bytes in.** th
fd40: 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  at integer..*/.i
fd50: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
fd60: 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20  xRowidLen(const 
fd70: 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
fd80: 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
fd90: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
fda0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
fdb0: 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
fdc0: 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
fdd0: 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71  e rowid */..  sq
fde0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
fdf0: 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a  (aKey, &szHdr);.
fe00: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
fe10: 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72  nt32(&aKey[szHdr
fe20: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
fe30: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
fe40: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
fe50: 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
fe60: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  }.  ../*.** pCur
fe70: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
fe80: 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
fe90: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
fea0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
feb0: 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
fec0: 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
fed0: 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
fee0: 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
fef0: 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
ff00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
ff10: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
ff20: 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
ff30: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
ff40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ff50: 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72  beIdxRowid(BtCur
ff60: 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
ff70: 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
ff80: 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
ff90: 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
ffa0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
ffb0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
ffc0: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
ffd0: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
ffe0: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
fff0: 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
10000 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
10010 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
10020 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
10030 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
10040 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
10050 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
10060 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
10070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10080 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
10090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
100a0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
100b0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
100c0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
100d0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
100e0 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   rc;.  }.  sqlit
100f0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
10100 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b  8*)m.z, &szHdr);
10110 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
10120 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
10130 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52  szHdr-1], &typeR
10140 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69  owid);.  lenRowi
10150 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
10160 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
10170 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  eRowid);.  sqlit
10180 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
10190 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
101a0 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
101b0 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
101c0 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
101d0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
101e0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
101f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10200 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
10210 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
10220 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
10230 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20  sor pC is point 
10240 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
10250 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
10260 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20  pKey (of length 
10270 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e  nKey).  Write in
10280 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
10290 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
102a0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
102b0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
102c0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
102d0 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
102e0 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20  ater than pKey. 
102f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10300 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
10310 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68  .** pKey is eith
10320 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
10330 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
10340 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
10350 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
10360 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
10370 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
10380 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10390 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
103a0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
103b0 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ell..*/.int sqli
103c0 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
103d0 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a  pare(.  Cursor *
103e0 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
103f0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
10400 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
10410 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  inst */.  int nK
10420 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ey, const u8 *pK
10430 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  ey,   /* The key
10440 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
10450 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10470 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
10480 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
10490 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
104a0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
104b0 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
104c0 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
104d0 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f  sor;.  int lenRo
104e0 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  wid;.  Mem m;.. 
104f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
10500 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
10510 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
10520 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
10530 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
10540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10550 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
10560 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
10570 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
10580 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
10590 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
105a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
105b0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
105c0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
105d0 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a  owidLen((u8*)m.z
105e0 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
105f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10600 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66  pare(pC->pKeyInf
10610 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c  o, m.n-lenRowid,
10620 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79   m.z, nKey, pKey
10630 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10640 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
10650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10660 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
10670 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
10680 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
10690 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
106a0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
106b0 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
106c0 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
106d0 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
106e0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
106f0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
10700 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
10710 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
10720 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10730 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
10740 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
10750 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
10760 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
10770 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
10780 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
10790 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
107a0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
107b0 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
107c0 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
107d0 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
107e0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
107f0 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
10800 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
10810 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
10820 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
10830 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
10840 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
10850 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
10860 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
10870 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
10880 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
10890 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
108a0 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
108b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
108c0 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
108d0 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
108e0 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
108f0 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
10900 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
10910 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
10920 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
10930 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
10940 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
10950 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
10960 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
10970 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
10980 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
10990 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
109a0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
109b0 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
109c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
109d0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
109e0 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
109f0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
10a00 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
10a10 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
10a20 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
10a30 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
10a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
10a50 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
10a60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
10a70 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
10a80 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
10a90 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
10aa0 6e 20 76 2d 3e 64 62 3b 0a 7d 0a                 n v->db;.}.