/ Hex Artifact Content
Login

Artifact cd0a3f702bb90a76adba3581005a9dc7853565f9:


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 52 65 74 75 72  }.}../*.** Retur
1770: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1780: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1790: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
17a0: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
17b0: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
17c0: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
17d0: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
17e0: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
17f0: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
1800: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
1810: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
1820: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
1830: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
1840: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
1850: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
1860: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
1870: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1880: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1890: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
18a0: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
18b0: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
18c0: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
18d0: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
18e0: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
18f0: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
1900: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
1910: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
1920: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
1930: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
1940: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
1950: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
1960: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
1970: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1980: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1990: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
19a0: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
19b0: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
19c0: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
19d0: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
19e0: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
19f0: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
1a00: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
1a10: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
1a20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
1a30: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
1a40: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
1a50: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
1a60: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
1a70: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1a80: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1a90: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1aa0: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1ab0: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1ac0: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1ad0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
1ae0: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
1af0: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
1b00: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
1b10: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
1b20: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
1b30: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
1b40: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
1b50: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
1b60: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
1b70: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1b80: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1b90: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1ba0: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1bb0: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1bc0: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1bd0: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
1be0: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
1bf0: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
1c00: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 28 28 75  SH_MASK_0 + (((u
1c10: 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d  nsigned)NOPUSH_M
1c20: 41 53 4b 5f 31 29 3c 3c 31 36 29 2c 0a 20 20 20  ASK_1)<<16),.   
1c30: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20 2b   NOPUSH_MASK_2 +
1c40: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1c50: 55 53 48 5f 4d 41 53 4b 5f 33 29 3c 3c 31 36 29  USH_MASK_3)<<16)
1c60: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1c70: 4b 5f 34 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_4 + (((unsigne
1c80: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 29  d)NOPUSH_MASK_5)
1c90: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1ca0: 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 28 28 75 6e  H_MASK_6 + (((un
1cb0: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1cc0: 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_7)<<16),.    
1cd0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1ce0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1cf0: 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c 31 36 29 0a  SH_MASK_9)<<16).
1d00: 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f    };.  assert( o
1d10: 70 3c 33 32 2a 35 20 29 3b 0a 20 20 72 65 74 75  p<32*5 );.  retu
1d20: 72 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d  rn (masks[op>>5]
1d30: 20 26 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29   & (1<<(op&0x1F)
1d40: 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ));.}..#ifndef N
1d50: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1d60: 33 56 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73  3VdbeOpcodeNoPus
1d70: 68 28 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75  h(u8 op){.  retu
1d80: 72 6e 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28  rn opcodeNoPush(
1d90: 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  op);.}.#endif../
1da0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
1db0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
1dc0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
1dd0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
1de0: 61 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73  ative..** Each s
1df0: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1e00: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1e10: 68 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  he label by sett
1e20: 69 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61  ing the P2.** va
1e30: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
1e40: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
1e50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1e60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1e70: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
1e80: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
1e90: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
1ea0: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1eb0: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1ec0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1ed0: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1ee0: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1ef0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
1f00: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
1f10: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
1f20: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
1f30: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
1f40: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
1f50: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
1f60: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
1f70: 54 68 65 20 69 6e 74 65 67 65 72 20 2a 70 4d 61  The integer *pMa
1f80: 78 53 74 61 63 6b 20 69 73 20 73 65 74 20 74 6f  xStack is set to
1f90: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
1fa0: 62 65 72 20 6f 66 20 76 64 62 65 20 73 74 61 63  ber of vdbe stac
1fb0: 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  k.** entries tha
1fc0: 74 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  t static analysi
1fd0: 73 20 72 65 76 65 61 6c 73 20 74 68 69 73 20 70  s reveals this p
1fe0: 72 6f 67 72 61 6d 20 6d 69 67 68 74 20 6e 65 65  rogram might nee
1ff0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2000: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
2010: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  the following op
2020: 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20  timization:  It 
2030: 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73  scans for.** ins
2040: 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  tructions that m
2050: 69 67 68 74 20 63 61 75 73 65 20 61 20 73 74 61  ight cause a sta
2060: 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  tement rollback.
2070: 20 20 53 75 63 68 20 69 6e 73 74 72 75 63 74 69    Such instructi
2080: 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a  ons.** are:.**.*
2090: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77  *   *  OP_Halt w
20a0: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
20b0: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
20c0: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
20d0: 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20    OP_Destroy.** 
20e0: 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a    *  OP_VUpdate.
20f0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61  **   *  OP_VRena
2100: 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  me.**.** If no s
2110: 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  uch instruction 
2120: 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65  is found, then e
2130: 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74 20 69  very Statement i
2140: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69  nstruction .** i
2150: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e  s changed to a N
2160: 6f 6f 70 2e 20 20 49 6e 20 74 68 69 73 20 77 61  oop.  In this wa
2170: 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65 61  y, we avoid crea
2180: 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ting the stateme
2190: 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  nt .** journal f
21a0: 69 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c  ile unnecessaril
21b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
21c0: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
21d0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
21e0: 70 4d 61 78 46 75 6e 63 41 72 67 73 2c 20 69 6e  pMaxFuncArgs, in
21f0: 74 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20  t *pMaxStack){. 
2200: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d   int i;.  int nM
2210: 61 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e  axArgs = 0;.  in
2220: 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d  t nMaxStack = p-
2230: 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b  >nOp;.  Op *pOp;
2240: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
2250: 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e   p->aLabel;.  in
2260: 74 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52  t doesStatementR
2270: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69  ollback = 0;.  i
2280: 6e 74 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  nt hasStatementB
2290: 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  egin = 0;.  for(
22a0: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d  pOp=p->aOp, i=p-
22b0: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >nOp-1; i>=0; i-
22c0: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75  -, pOp++){.    u
22d0: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  8 opcode = pOp->
22e0: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28  opcode;..    if(
22f0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
2300: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
2310: 4f 50 5f 41 67 67 53 74 65 70 20 0a 23 69 66 6e  OP_AggStep .#ifn
2320: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2330: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2340: 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d       || opcode==
2350: 4f 50 5f 56 55 70 64 61 74 65 0a 23 65 6e 64 69  OP_VUpdate.#endi
2360: 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  f.    ){.      i
2370: 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41  f( pOp->p2>nMaxA
2380: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2390: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 0a   pOp->p2;.    }.
23a0: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
23b0: 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20 20  OP_Halt ){.     
23c0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51   if( pOp->p1==SQ
23d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23e0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
23f0: 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
2400: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
2410: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
2420: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2430: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74   opcode==OP_Stat
2440: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68  ement ){.      h
2450: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
2460: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
2470: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
2480: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
2490: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
24a0: 6c 62 61 63 6b 20 3d 20 31 3b 0a 23 69 66 6e 64  lback = 1;.#ifnd
24b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
24c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
24d0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
24e0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
24f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
2500: 6d 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73  me ){.      does
2510: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
2520: 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  k = 1;.    }else
2530: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2540: 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  VFilter ){.     
2550: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73   int n;.      as
2560: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
2570: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61   >= 3 );.      a
2580: 73 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e 6f  ssert( pOp[-2].o
2590: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65  pcode==OP_Intege
25a0: 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70  r );.      n = p
25b0: 4f 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-2].p1;.     
25c0: 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20   if( n>nMaxArgs 
25d0: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a  ) nMaxArgs = n;.
25e0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
25f0: 20 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73   if( opcodeNoPus
2600: 68 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20  h(opcode) ){.   
2610: 20 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a     nMaxStack--;.
2620: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2630: 4f 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74  Op->p2>=0 ) cont
2640: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2650: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
2660: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f  nLabel );.    pO
2670: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
2680: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a  1-pOp->p2];.  }.
2690: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26a0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
26b0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
26c0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
26d0: 4d 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78  MaxArgs;.  *pMax
26e0: 53 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63  Stack = nMaxStac
26f0: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e  k;..  /* If we n
2700: 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20  ever rollback a 
2710: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2720: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74  ction, then stat
2730: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
2740: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
2750: 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e  needed.  So chan
2760: 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74  ge every OP_Stat
2770: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64  ement.  ** opcod
2780: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  e into an OP_Noo
2790: 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61  p.  This avoid a
27a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
27b0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
27c0: 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e  ).  ** which can
27d0: 20 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e   be expensive on
27e0: 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e   some platforms.
27f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53  .  */.  if( hasS
2800: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26  tatementBegin &&
2810: 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52   !doesStatementR
2820: 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66  ollback ){.    f
2830: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
2840: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
2850: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
2860: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2870: 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e  ode==OP_Statemen
2880: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  t ){.        pOp
2890: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
28a0: 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
28b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
28c0: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
28d0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
28e0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
28f0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
2900: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2910: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
2920: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
2930: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2940: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
2950: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
2960: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
2970: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
2980: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
2990: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
29a0: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
29b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
29c0: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
29d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
29e0: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
29f0: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
2a00: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
2a10: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
2a20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2a30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2a40: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
2a50: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
2a60: 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  nOpAlloc ){.    
2a70: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
2a80: 20 70 2d 3e 6e 4f 70 2a 32 20 2b 20 6e 4f 70 29   p->nOp*2 + nOp)
2a90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64  ;.  }.  if( p->d
2aa0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ab0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2ac0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
2ad0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e  >nOp;.  if( nOp>
2ae0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
2af0: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
2b00: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
2b10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b20: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
2b30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
2b40: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
2b50: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
2b60: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
2b70: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
2b80: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
2b90: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
2ba0: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
2bb0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c    pOut->p2 = p2<
2bc0: 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28  0 ? addr + ADDR(
2bd0: 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20  p2) : p2;.      
2be0: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
2bf0: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
2c00: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
2c10: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
2c20: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
2c30: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
2c40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c50: 55 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  UG.      if( sql
2c60: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
2c70: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  trace ){.       
2c80: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
2c90: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
2ca0: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
2cb0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2cc0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
2cd0: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
2ce0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2cf0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2d00: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
2d10: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
2d20: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
2d30: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
2d40: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
2d50: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
2d60: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
2d70: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
2d80: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
2d90: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
2da0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
2db0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
2dc0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
2dd0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
2de0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2df0: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69  ngeP1(Vdbe *p, i
2e00: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
2e10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
2e20: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2e30: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2e40: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64  ;.  if( p && add
2e50: 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61  r>=0 && p->nOp>a
2e60: 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ddr && p->aOp ){
2e70: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
2e80: 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p1 = val;.  }.
2e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2ea0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2eb0: 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P2 operand for 
2ec0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
2ed0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2ee0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2ef0: 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20  l for setting a 
2f00: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
2f10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f20: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
2f30: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2f40: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2f50: 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20  ert( val>=0 );. 
2f60: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2f70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2f80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2f90: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2fa0: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2fb0: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2fc0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
2fd0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2fe0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2ff0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
3000: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
3010: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
3020: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
3030: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3040: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
3050: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
3060: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3070: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
3080: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
3090: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
30a0: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
30b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
30c0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
30d0: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
30e0: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
30f0: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
3100: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
3110: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
3120: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
3130: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
3140: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46  emeralFunction(F
3150: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
3160: 20 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44   if( pDef && (pD
3170: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
3180: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
3190: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
31a0: 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d  _free(pDef);.  }
31b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
31c0: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
31d0: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
31e0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
31f0: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
3200: 20 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20   *p3){.  if( p3 
3210: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
3220: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  4type ){.      c
3230: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
3240: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
3250: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3260: 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63  MPRINTF:.      c
3270: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
3280: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
3290: 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73  YINFO:.      cas
32a0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  e P4_KEYINFO_HAN
32b0: 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  DOFF: {.        
32c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29  sqlite3_free(p3)
32d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
32f0: 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a  ase P4_VDBEFUNC:
3300: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46   {.        VdbeF
3310: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d  unc *pVdbeFunc =
3320: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b   (VdbeFunc *)p3;
3330: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3340: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70  emeralFunction(p
3350: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
3360: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3370: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
3380: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
3390: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33a0: 33 5f 66 72 65 65 28 70 56 64 62 65 46 75 6e 63  3_free(pVdbeFunc
33b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
33c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33d0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
33e0: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
33f0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
3400: 28 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a  ((FuncDef*)p3);.
3410: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3430: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
3440: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
3450: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
3460: 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20  lue*)p3);.      
3470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3480: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
3490: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
34a0: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
34b0: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
34c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
34d0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
34e0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
34f0: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
3500: 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29  f( p && p->aOp )
3510: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
3520: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3530: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  ];.    while( N-
3540: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
3550: 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  4(pOp->p4type, p
3560: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20  Op->p4.p);.     
3570: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
3580: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
3590: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  .      pOp->opco
35a0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
35b0: 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d      pOp++;.    }
35c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
35d0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
35e0: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
35f0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3600: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3610: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3620: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
3630: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
3640: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
3650: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
3660: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
3670: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
3680: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
3690: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
36a0: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
36b0: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
36c0: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
36d0: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
36e0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
36f0: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
3700: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
3710: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
3720: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
3730: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
3740: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
3750: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
3760: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
3770: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
3780: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
3790: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
37a0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
37b0: 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP4..**.** If n=
37c0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P4_KEYINFO it m
37d0: 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73  eans that zP4 is
37e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
37f0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3800: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
3810: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
3820: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
3830: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
3840: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
3850: 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  e3_malloc, to be
3860: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3870: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
3880: 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49  d..** n==P4_KEYI
3890: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
38a0: 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70  cates that zP4 p
38b0: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
38c0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
38d0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
38e0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
38f0: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
3900: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3910: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
3920: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
3930: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
3940: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
3950: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
3960: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
3970: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
3980: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
3990: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
39a0: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
39b0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
39c0: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
39d0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
39e0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
39f0: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
3a00: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
3a10: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
3a20: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
3a30: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
3a40: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
3a50: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
3a60: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
3a70: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
3a80: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
3a90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3aa0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
3ab0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
3ad0: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
3ae0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  Op;.  assert( p=
3af0: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
3b00: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3b10: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
3b20: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
3b30: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3b40: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20 21  d ){.    if (n !
3b50: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a  = P4_KEYINFO) {.
3b60: 20 20 20 20 20 20 66 72 65 65 50 34 28 6e 2c 20        freeP4(n, 
3b70: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
3b80: 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &zP4);.    }.   
3b90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
3ba0: 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64  f( addr<0 || add
3bb0: 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  r>=p->nOp ){.   
3bc0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
3bd0: 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72   1;.    if( addr
3be0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  <0 ) return;.  }
3bf0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
3c00: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
3c10: 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f  (pOp->p4type, pO
3c20: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
3c30: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28  >p4.p = 0;.  if(
3c40: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP4==0 ){.    p
3c50: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
3c60: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3c70: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P4_NOTUSED;.  }e
3c80: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
3c90: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
3ca0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
3cb0: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
3cc0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
3cd0: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
3ce0: 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP4)->nField;.  
3cf0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
3d00: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
3d10: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
3d20: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3d30: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
3d40: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
3d50: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
3d60: 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  te );.    pOp->p
3d70: 34 2e 70 20 3d 20 28 63 68 61 72 2a 29 70 4b 65  4.p = (char*)pKe
3d80: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
3d90: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
3da0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3db0: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3dc0: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
3dd0: 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a  o, zP4, nByte);.
3de0: 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72        aSortOrder
3df0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
3e00: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69  rtOrder;.      i
3e10: 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b  f( aSortOrder ){
3e20: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
3e30: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
3e40: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
3e50: 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  &pKeyInfo->aColl
3e60: 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20  [nField];.      
3e70: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
3e80: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61  o->aSortOrder, a
3e90: 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c  SortOrder, nFiel
3ea0: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
3eb0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3ec0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20  P4_KEYINFO;.    
3ed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
3ee0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3ef0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d   = 1;.      pOp-
3f00: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
3f10: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
3f20: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
3f30: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
3f40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3f50: 20 28 63 68 61 72 2a 29 7a 50 34 3b 0a 20 20 20   (char*)zP4;.   
3f60: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3f70: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c  4_KEYINFO;.  }el
3f80: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
3f90: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 63    pOp->p4.p = (c
3fa0: 68 61 72 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  har*)zP4;.    pO
3fb0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20  p->p4type = n;. 
3fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3fd0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65  n==0 ) n = strle
3fe0: 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  n(zP4);.    pOp-
3ff0: 3e 70 34 2e 70 20 3d 20 73 71 6c 69 74 65 33 44  >p4.p = sqlite3D
4000: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
4010: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
4020: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
4030: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
4040: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
4050: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
4060: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65  mment on the the
4070: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
4080: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
4090: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
40a0: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
40b0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
40c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
40d0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
40e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
40f0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
4100: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
4110: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
4120: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
4130: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
4140: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4150: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
4160: 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 61 4f  Format);.  p->aO
4170: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4180: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d  ment = sqlite3VM
4190: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
41a0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
41b0: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64  _end(ap);.}.#end
41c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
41d0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
41e0: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
41f0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
4200: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
4210: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
4220: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
4230: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
4240: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
4250: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
4260: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
4270: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4280: 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  d );.  return ((
4290: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
42a0: 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70  p->nOp)?(&p->aOp
42b0: 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23  [addr]):0);.}..#
42c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
42d0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
42e0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45   || !defined(NDE
42f0: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64  BUG) \.     || d
4300: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
4310: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
4320: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
4330: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
4340: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
4350: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
4360: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
4370: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
4380: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
4390: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
43a0: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
43b0: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
43c0: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
43d0: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
43e0: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
43f0: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 69 6e 74  4 = zTemp;.  int
4400: 20 6e 50 34 3b 0a 20 20 61 73 73 65 72 74 28 20   nP4;.  assert( 
4410: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
4420: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
4430: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
4440: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
4450: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
4460: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
4470: 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a  Info = (KeyInfo*
4480: 29 70 4f 70 2d 3e 70 34 2e 70 3b 0a 20 20 20 20  )pOp->p4.p;.    
4490: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
44a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
44b0: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
44c0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
44d0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c  ;.      i = strl
44e0: 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  en(zTemp);.     
44f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
4500: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
4510: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
4520: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
4530: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
4540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
4550: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
4560: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
4570: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
4580: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
4590: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
45a0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
45b0: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
45c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
45d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
45e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  }.          zTem
45f0: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
4600: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
4610: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
4620: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
4630: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
4640: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
4650: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
4660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4670: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
4680: 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  [i], pColl->zNam
4690: 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  e,n+1);.        
46a0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
46b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c    }else if( i+4<
46c0: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
46d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
46e0: 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b  mp[i],",nil",4);
46f0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
4700: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
4710: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
4720: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
4730: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
4740: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
4750: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
4760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4770: 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51   case P4_COLLSEQ
4780: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
4790: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
47a0: 53 65 71 2a 29 70 4f 70 2d 3e 70 34 2e 70 3b 0a  Seq*)pOp->p4.p;.
47b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
47c0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
47d0: 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e  emp, "collseq(%.
47e0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
47f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
4800: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4810: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
4820: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
4830: 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  Def = (FuncDef*)
4840: 70 4f 70 2d 3e 70 34 2e 70 3b 0a 20 20 20 20 20  pOp->p4.p;.     
4850: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4860: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4870: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
4880: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
4890: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
48a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
48b0: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
48c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
48d0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
48e0: 20 22 25 6c 6c 64 22 2c 20 2a 28 73 71 6c 69 74   "%lld", *(sqlit
48f0: 65 33 5f 69 6e 74 36 34 2a 29 70 4f 70 2d 3e 70  e3_int64*)pOp->p
4900: 34 2e 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.p);.      brea
4910: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4920: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
4930: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4940: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4950: 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
4960: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
4970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4980: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
4990: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
49a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
49b0: 20 22 25 2e 31 36 67 22 2c 20 2a 28 64 6f 75 62   "%.16g", *(doub
49c0: 6c 65 2a 29 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  le*)pOp->p4.p);.
49d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
49e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
49f0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
4a00: 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 4f  *pMem = (Mem*)pO
4a10: 70 2d 3e 70 34 2e 70 3b 0a 20 20 20 20 20 20 69  p->p4.p;.      i
4a20: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4a30: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
4a40: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
4a50: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
4a60: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4a70: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
4a80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4a90: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4aa0: 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  p, "%lld", pMem-
4ab0: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
4ac0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
4ad0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
4ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4af0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4b00: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
4b10: 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20   pMem->r);.     
4b20: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
4b30: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
4b40: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
4b50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4b60: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
4b70: 4c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  L");.      }.   
4b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4b90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4ba0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4bb0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
4bc0: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
4bd0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
4be0: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
4bf0: 70 4f 70 2d 3e 70 34 2e 70 3b 0a 20 20 20 20 20  pOp->p4.p;.     
4c00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4c10: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4c20: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
4c30: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
4c40: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
4c50: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4c60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4c70: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
4c80: 70 34 2e 70 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.p;.      if( 
4c90: 7a 50 34 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f  zP4==0 || pOp->o
4ca0: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  pcode==OP_Noop )
4cb0: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
4cc0: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
4cd0: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
4ce0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4cf0: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
4d00: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4d10: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70  _DEBUG.  if( pOp
4d20: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 26 26 20 7a 50  ->zComment && zP
4d30: 34 3d 3d 7a 54 65 6d 70 20 26 26 20 28 6e 50 34  4==zTemp && (nP4
4d40: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34 29 29 3c   = strlen(zP4))<
4d50: 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c  nTemp ){.    sql
4d60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4d70: 65 6d 70 2d 6e 50 34 2c 20 26 7a 50 34 5b 6e 50  emp-nP4, &zP4[nP
4d80: 34 5d 2c 20 22 25 73 23 20 25 73 22 2c 0a 20 20  4], "%s# %s",.  
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 6e 50 34 3e 30 20 3f 20 22 20 22 20 3a     nP4>0 ? " " :
4db0: 20 22 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   "", pOp->zComme
4dc0: 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nt);.  }.#endif.
4dd0: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
4de0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
4df0: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
4e00: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
4e10: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
4e20: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
4e30: 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  *.*/.void sqlite
4e40: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
4e50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
4e60: 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73    int mask;.  as
4e70: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4e80: 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p->db->nDb );.  
4e90: 61 73 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66  assert( i<sizeof
4ea0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38  (p->btreeMask)*8
4eb0: 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c   );.  mask = 1<<
4ec0: 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72  i;.  if( (p->btr
4ed0: 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  eeMask & mask)==
4ee0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65  0 ){.    p->btre
4ef0: 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
4f00: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
4f10: 75 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 28  utexArrayInsert(
4f20: 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64  &p->aMutex, p->d
4f30: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
4f40: 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69    }.}...#if defi
4f50: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
4f60: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4f70: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
4f80: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
4f90: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
4fa0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
4fb0: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
4fc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4fd0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
4fe0: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
4ff0: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
5000: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
5010: 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69  Ptr[50];.  stati
5020: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
5030: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
5040: 31 33 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e  13s %4d %4d %s\n
5050: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
5060: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
5070: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
5080: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
5090: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
50a0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
50b0: 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20 20 70 63  ormat1,.      pc
50c0: 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  , sqlite3OpcodeN
50d0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
50e0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
50f0: 70 32 2c 20 7a 50 34 29 3b 0a 20 20 66 66 6c 75  p2, zP4);.  fflu
5100: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
5110: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
5120: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
5130: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
5140: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
5150: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
5160: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
5170: 28 20 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ( p ){.    while
5180: 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20  ( N-->0 ){.     
5190: 20 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20   assert( N<2 || 
51a0: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
51b0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
51c0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
51d0: 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p++);.    }.  }.
51e0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
51f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
5200: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
5210: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
5220: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
5230: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
5240: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
5250: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
5260: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
5270: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
5280: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
5290: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
52a0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
52b0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
52c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
52d0: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
52e0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
52f0: 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20  XPLAIN"..*/.int 
5300: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
5310: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5330: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
5340: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5350: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
5360: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
5370: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
5380: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
5390: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
53a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72  BE_MAGIC_RUN ) r
53b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
53c0: 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64  USE;.  assert( d
53d0: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
53e0: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20  _MAGIC_BUSY );. 
53f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
5400: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
5410: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
5420: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
5430: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
5440: 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79   does not put dy
5450: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e  namic strings on
5460: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
5470: 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20  stack, they may 
5480: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
5490: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
54a0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
54b0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
54c0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
54d0: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
54e0: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
54f0: 69 66 28 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  if( p->pResultSe
5500: 74 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  t ){.    release
5510: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 70 52 65 73  MemArray(p->pRes
5520: 75 6c 74 53 65 74 2c 20 35 29 3b 0a 20 20 20 20  ultSet, 5);.    
5530: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
5540: 30 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  0;.  }..  do{.  
5550: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
5560: 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f   }while( i<p->nO
5570: 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  p && p->explain=
5580: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
5590: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
55a0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  in );.  if( i>=p
55b0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->nOp ){.    p->
55c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
55d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
55e0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
55f0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
5600: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
5610: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
5620: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
5630: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5640: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
5650: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
5660: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
5670: 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  ->rc), (char*)0)
5680: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
5690: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
56a0: 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  [i];.    Mem *pM
56b0: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
56c0: 65 74 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a  et = p->aStack;.
56d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
56e0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
56f0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5700: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
5710: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5740: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
5750: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
5760: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
5770: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
5780: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
5790: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
57a0: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
57b0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
57c0: 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20  de);  /* Opcode 
57d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
57e0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
57f0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
5800: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
5810: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5820: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
5830: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
5840: 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d 2b  _UTF8;.    pMem+
5850: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
5860: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5870: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
5880: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
58b0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
58c0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
58d0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
58e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
58f0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
5900: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
5930: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5940: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
5950: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5960: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5970: 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c  M_Ephem|MEM_Str|
5980: 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 20 20 2f 2a  MEM_Term;     /*
5990: 20 50 34 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P4 */.    pMem-
59a0: 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  >z = displayP4(p
59b0: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74  Op, pMem->zShort
59c0: 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a  , sizeof(pMem->z
59d0: 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 61 73 73  Short));.    ass
59e0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
59f0: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  );.    pMem->n =
5a00: 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29   strlen(pMem->z)
5a10: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  ;.    pMem->type
5a20: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
5a30: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
5a40: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20  SQLITE_UTF8;..  
5a50: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
5a60: 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c  = 5 - 2*(p->expl
5a70: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70  ain-1);.    p->p
5a80: 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20  Tos = pMem;.    
5a90: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
5aa0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
5ab0: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
5ac0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
5ad0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5ae0: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
5af0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5b00: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
5b10: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
5b20: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
5b30: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
5b40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5b50: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
5b60: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
5b70: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
5b80: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
5b90: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
5ba0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f  pOp = &p->aOp[nO
5bb0: 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p-1];.  if( pOp-
5bc0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70  >opcode==OP_Noop
5bd0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 70 21 3d 30   && pOp->p4.p!=0
5be0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
5bf0: 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
5c00: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  p;.    while( is
5c10: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29  space(*(u8*)z) )
5c20: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
5c30: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
5c40: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
5c50: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5c60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5c70: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5c80: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
5c90: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
5ca0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
5cb0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
5cc0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
5cd0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
5ce0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
5cf0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
5d00: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
5d10: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
5d20: 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29 20 72  _io_trace==0 ) r
5d30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
5d40: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
5d50: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70  Op = &p->aOp[nOp
5d60: 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  -1];.  if( pOp->
5d70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20  opcode==OP_Noop 
5d80: 26 26 20 70 4f 70 2d 3e 70 34 2e 70 21 3d 30 20  && pOp->p4.p!=0 
5d90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
5da0: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
5db0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
5dc0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5dd0: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
5de0: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.p);.    for(
5df0: 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75 6e  i=0; isspace((un
5e00: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d  signed char)z[i]
5e10: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
5e20: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
5e30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 73  ){.      if( iss
5e40: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
5e50: 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  har)z[i]) ){.   
5e60: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
5e70: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
5e80: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
5e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
5eb0: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
5ec0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5ed0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
5ee0: 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 28 22  lite3_io_trace("
5ef0: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
5f00: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
5f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
5f20: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
5f30: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a  LE_IOTRACE */...
5f40: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
5f50: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
5f60: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  for execution.  
5f70: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
5f80: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
5f90: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
5fa0: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
5fb0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
5fc0: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
5fd0: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
5fe0: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
5ff0: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
6000: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
6010: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
6020: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
6030: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20   .**.** This is 
6040: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
6050: 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d  move a VDBE from
6060: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
6070: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
6080: 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  C_RUN..*/.void s
6090: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
60a0: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
60d0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c  E */.  int nVar,
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6100: 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68  of '?' see in th
6110: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
6120: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20  */.  int nMem,  
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6150: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f   memory cells to
6160: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
6170: 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20  nt nCursor,     
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6190: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
61a0: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
61b0: 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69  /.  int isExplai
61c0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
61d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
61e0: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
61f0: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ds is present */
6200: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  .){.  int n;.  s
6210: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
6220: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
6230: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6240: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6250: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
6260: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
6270: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
6280: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
6290: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
62a0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
62b0: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
62c0: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
62d0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
62e0: 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73  er. This.   * is
62f0: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
6300: 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72  l to resizeOpArr
6310: 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73  ay() below may s
6320: 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70  hrink the.   * p
6330: 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f  ->aOp[] array to
6340: 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20   save memory if 
6350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56  called when in V
6360: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20  DBE_MAGIC_RUN . 
6370: 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f    * state..   */
6380: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
6390: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
63a0: 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69   /* No instructi
63b0: 6f 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d  on ever pushes m
63c0: 6f 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c  ore than a singl
63d0: 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74  e element onto t
63e0: 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20  he.  ** stack.  
63f0: 41 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65  And the stack ne
6400: 76 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63  ver grows on suc
6410: 63 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f  cessive executio
6420: 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ns of the.  ** s
6430: 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68  ame loop.  So th
6440: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
6450: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  f instructions i
6460: 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64  s an upper bound
6470: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78  .  ** on the max
6480: 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68  imum stack depth
6490: 20 72 65 71 75 69 72 65 64 2e 20 20 28 41 64 64   required.  (Add
64a0: 65 64 20 6c 61 74 65 72 3a 29 20 20 54 68 65 0a  ed later:)  The.
64b0: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56 61    ** resolveP2Va
64c0: 6c 75 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70  lues() call comp
64d0: 75 74 65 73 20 61 20 74 69 67 68 74 65 72 20 75  utes a tighter u
64e0: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
64f0: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a  e.  ** stack siz
6500: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c  e..  **.  ** All
6510: 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20  ocation all the 
6520: 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20 77  stack space we w
6530: 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20  ill ever need.. 
6540: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   */.  if( p->aSt
6550: 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ack==0 ){.    in
6560: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a  t nArg;       /*
6570: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
6580: 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20 74  of args passed t
6590: 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  o a user functio
65a0: 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  n. */.    int nS
65b0: 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78  tack;     /* Max
65c0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
65d0: 74 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65 71  tack entries req
65e0: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65 73  uired */.    res
65f0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
6600: 26 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b  &nArg, &nStack);
6610: 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72  .    resizeOpArr
6620: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  ay(p, p->nOp);. 
6630: 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e     assert( nVar>
6640: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
6650: 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20  ( nStack<p->nOp 
6660: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78 70  );.    if( isExp
6670: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 6e 53  lain ){.      nS
6680: 74 61 63 6b 20 3d 20 31 30 3b 0a 20 20 20 20 7d  tack = 10;.    }
6690: 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d  .    p->aStack =
66a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
66b0: 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
66c0: 20 6e 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70   nStack*sizeof(p
66d0: 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20  ->aStack[0])    
66e0: 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20  /* aStack */.   
66f0: 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66     + nArg*sizeof
6700: 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20  (Mem*)          
6710: 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a      /* apArg */.
6720: 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a        + nVar*siz
6730: 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20  eof(Mem)        
6740: 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a         /* aVar *
6750: 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73  /.      + nVar*s
6760: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20  izeof(char*)    
6770: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61           /* azVa
6780: 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65  r */.      + nMe
6790: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20  m*sizeof(Mem)   
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
67b0: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Mem */.      + n
67c0: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75  Cursor*sizeof(Cu
67d0: 72 73 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a  rsor*)        /*
67e0: 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b   apCsr */.    );
67f0: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
6800: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
6810: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26 70      p->aMem = &p
6820: 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b 5d  ->aStack[nStack]
6830: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  ;.      p->nMem 
6840: 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 2d  = nMem;.      p-
6850: 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d  >aVar = &p->aMem
6860: 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70 2d  [nMem];.      p-
6870: 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20  >nVar = nVar;.  
6880: 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30      p->okVar = 0
6890: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67  ;.      p->apArg
68a0: 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56   = (Mem**)&p->aV
68b0: 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20  ar[nVar];.      
68c0: 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72  p->azVar = (char
68d0: 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72  **)&p->apArg[nAr
68e0: 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  g];.      p->apC
68f0: 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26  sr = (Cursor**)&
6900: 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a  p->azVar[nVar];.
6910: 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72        p->nCursor
6920: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
6930: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
6940: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; n++){.       
6950: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
6960: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
6970: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
6980: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
6990: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b  }.      for(n=0;
69a0: 20 6e 3c 6e 53 74 61 63 6b 3b 20 6e 2b 2b 29 7b   n<nStack; n++){
69b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61  .        p->aSta
69c0: 63 6b 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ck[n].db = db;. 
69d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
69e0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d  .  for(n=0; n<p-
69f0: 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  >nMem; n++){.   
6a00: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
6a10: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
6a20: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20    p->aMem[n].db 
6a30: 3d 20 64 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  = db;.  }..  p->
6a40: 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63  pTos = &p->aStac
6a50: 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d  k[-1];.  p->pc =
6a60: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
6a70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75  QLITE_OK;.  p->u
6a80: 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20  niqueCnt = 0;.  
6a90: 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d  p->returnDepth =
6aa0: 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63   0;.  p->errorAc
6ab0: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
6ac0: 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d  .  p->popStack =
6ad0: 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69    0;.  p->explai
6ae0: 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a  n |= isExplain;.
6af0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
6b00: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
6b10: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
6b20: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
6b30: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
6b40: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
6b50: 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74  .  p->openedStat
6b60: 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  ement = 0;.#ifde
6b70: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
6b80: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
6b90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6ba0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
6bb0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
6bc0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70   0;.      p->aOp
6bd0: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
6be0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6c00: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
6c10: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
6c20: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
6c30: 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a   cursor happens.
6c40: 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ** to hold..*/.v
6c50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
6c60: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
6c70: 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  p, Cursor *pCx){
6c80: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
6c90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6ca0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
6cb0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
6cc0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
6cd0: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
6ce0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
6cf0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
6d00: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
6d10: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66  x->pBt);.  }.#if
6d20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6d30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6d40: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
6d50: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
6d60: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
6d70: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
6d80: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
6d90: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
6da0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
6db0: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
6dc0: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
6dd0: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
6de0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
6df0: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f  (p->db);.    pMo
6e00: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
6e10: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  abCursor);.    s
6e20: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
6e30: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ->db);.    p->in
6e40: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
6e50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
6e60: 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70  ite3_free(pCx->p
6e70: 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
6e80: 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65  _free(pCx->aType
6e90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6ea0: 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(pCx);.}../*.**
6eb0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
6ec0: 72 73 20 65 78 63 65 70 74 20 66 6f 72 20 56 54  rs except for VT
6ed0: 61 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ab cursors that 
6ee0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
6ef0: 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
6f00: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
6f10: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
6f20: 69 76 65 56 74 61 62 73 28 56 64 62 65 20 2a 70  iveVtabs(Vdbe *p
6f30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
6f40: 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20  ( p->apCsr==0 ) 
6f50: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
6f60: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
6f70: 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73 6f   i++){.    Curso
6f80: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
6f90: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20  [i];.    if( pC 
6fa0: 26 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65  && (!p->inVtabMe
6fb0: 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74  thod || !pC->pVt
6fc0: 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  abCursor) ){.   
6fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
6fe0: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
6ff0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b  .      p->apCsr[
7000: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
7010: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
7020: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
7030: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
7040: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
7050: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
7060: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
7070: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
7080: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
7090: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
70a0: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
70b0: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
70c0: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
70d0: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
70e0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
70f0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
7100: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7110: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b  if( p->aStack ){
7120: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
7130: 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20  rray(p->aStack, 
7140: 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70  1 + (p->pTos - p
7150: 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20  ->aStack));.    
7160: 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53  p->pTos = &p->aS
7170: 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20  tack[-1];.  }.  
7180: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
7190: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
71a0: 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  (p);.  releaseMe
71b0: 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
71c0: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  p->nMem);.  sqli
71d0: 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72  te3VdbeFifoClear
71e0: 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69  (&p->sFifo);.  i
71f0: 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  f( p->contextSta
7200: 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ck ){.    for(i=
7210: 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53  0; i<p->contextS
7220: 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20  tackTop; i++){. 
7230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7240: 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f  FifoClear(&p->co
7250: 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46  ntextStack[i].sF
7260: 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ifo);.    }.    
7270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
7280: 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20  contextStack);. 
7290: 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53   }.  p->contextS
72a0: 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  tack = 0;.  p->c
72b0: 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74 68  ontextStackDepth
72c0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65   = 0;.  p->conte
72d0: 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a  xtStackTop = 0;.
72e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
72f0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
7300: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
7310: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
7320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
7330: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
7340: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
7350: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
7360: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
7370: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
7380: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
7390: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
73a0: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
73b0: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
73c0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
73d0: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
73e0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
73f0: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
7400: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
7410: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
7420: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
7430: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7440: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
7450: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
7460: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
7470: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  Name;.  int n;..
7480: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
7490: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
74a0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
74b0: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
74c0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e  e3_free(p->aColN
74d0: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
74e0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
74f0: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
7500: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  n = nResColumn;.
7510: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
7520: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
7530: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
7540: 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73 69 7a 65  Zero(p->db, size
7550: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
7560: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
7570: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
7580: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
7590: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
75a0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
75b0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
75c0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
75d0: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
75e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
75f0: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
7600: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
7610: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
7620: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
7630: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
7640: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
7650: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
7660: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
7670: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
7680: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
7690: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
76a0: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
76b0: 20 49 66 20 4e 3d 3d 50 34 5f 53 54 41 54 49 43   If N==P4_STATIC
76c0: 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20    it means that 
76d0: 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74  zName is a point
76e0: 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74  er to a constant
76f0: 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e   static.** strin
7700: 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73  g and we can jus
7710: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
7720: 65 72 2e 20 49 66 20 69 74 20 69 73 20 50 34 5f  er. If it is P4_
7730: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a  DYNAMIC, then .*
7740: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
7750: 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69  freed using sqli
7760: 74 65 33 5f 66 72 65 65 28 29 20 77 68 65 6e 20  te3_free() when 
7770: 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e 69  the vdbe is fini
7780: 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e  shed with.** it.
7790: 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79   Otherwise, N by
77a0: 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65  tes of zName are
77b0: 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20   copied..*/.int 
77c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
77d0: 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69  lName(Vdbe *p, i
77e0: 6e 74 20 69 64 78 2c 20 69 6e 74 20 76 61 72 2c  nt idx, int var,
77f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7800: 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  me, int N){.  in
7810: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
7820: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
7830: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
7840: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
7850: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
7860: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
7870: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
7880: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7890: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
78a0: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
78b0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
78c0: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
78d0: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
78e0: 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 34 5f 44 59  ;.  if( N==P4_DY
78f0: 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 34 5f 53  NAMIC || N==P4_S
7900: 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20  TATIC ){.    rc 
7910: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
7920: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
7930: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
7940: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
7950: 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
7960: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7970: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
7980: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
7990: 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   N, SQLITE_UTF8,
79a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
79b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
79c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d  =SQLITE_OK && N=
79d0: 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P4_DYNAMIC ){. 
79e0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
79f0: 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  gs = (pColName->
7a00: 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74  flags&(~MEM_Stat
7a10: 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20  ic))|MEM_Dyn;.  
7a20: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c    pColName->xDel
7a30: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
7a40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7a50: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
7a60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
7a70: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
7a80: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
7a90: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
7aa0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
7ab0: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
7ac0: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
7ad0: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
7ae0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
7af0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
7b00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
7b10: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
7b20: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
7b30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7b40: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
7b50: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
7b60: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
7b70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7b80: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
7b90: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
7ba0: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
7bb0: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
7bc0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
7bd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7be0: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
7bf0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  = 0;..  /* Befor
7c00: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
7c10: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
7c20: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
7c30: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
7c40: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
7c50: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
7c60: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
7c70: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
7c80: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
7c90: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
7ca0: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
7cb0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
7cc0: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
7cd0: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
7ce0: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
7cf0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
7d00: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
7d10: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
7d20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
7d30: 61 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a  abSync(db, rc);.
7d40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7d50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
7d60: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
7d70: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
7d80: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
7d90: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
7da0: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
7db0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
7dc0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
7dd0: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
7de0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
7df0: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
7e00: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
7e10: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
7e20: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
7e30: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
7e40: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
7e50: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
7e60: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
7e70: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
7e80: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
7e90: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
7ea0: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
7eb0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
7ec0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
7ed0: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
7ee0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
7ef0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
7f00: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
7f10: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
7f20: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
7f30: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
7f40: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
7f50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
7f60: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
7f70: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
7f80: 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
7f90: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
7fa0: 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
7fb0: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
7fc0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
7fd0: 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74      sqlite3Safet
7fe0: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
7ff0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
8000: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
8010: 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  itArg);.    sqli
8020: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
8030: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
8040: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8050: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
8060: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
8070: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
8080: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
8090: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
80a0: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
80b0: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
80c0: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
80d0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
80e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
80f0: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
8100: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
8110: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
8120: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
8130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8140: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
8150: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
8160: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
8170: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
8180: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e  ase is :memory:.
8190: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77    In that case w
81a0: 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75  e do.  ** not su
81b0: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
81c0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
81d0: 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70   so use the simp
81e0: 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a  le case then.  *
81f0: 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  * too..  */.  if
8200: 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69  ( 0==strlen(sqli
8210: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
8220: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
8230: 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  Bt)) || nTrans<=
8240: 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  1 ){.    for(i=0
8250: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
8260: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
8270: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
8280: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8290: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
82a0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
82b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
82c0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
82d0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
82e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
82f0: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
8300: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
8310: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
8320: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
8330: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
8340: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
8350: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
8360: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
8370: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
8380: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
8390: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
83a0: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
83b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
83c0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
83d0: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
83e0: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
83f0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
8400: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
8410: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
8420: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
8430: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8440: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
8450: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8460: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8470: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
8480: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8490: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
84a0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
84b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
84c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
84d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
84e0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
84f0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
8500: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
8510: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
8520: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
8530: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
8540: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
8550: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
8560: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8570: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
8580: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
8590: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
85a0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
85b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
85c0: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
85d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
85e0: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
85f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
8600: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
8610: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
8620: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
8630: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
8640: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
8650: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
8660: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
8670: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
8680: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
8690: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
86a0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
86b0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
86c0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
86d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
86e0: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
86f0: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
8700: 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71  random;.      sq
8710: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
8720: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8730: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
8740: 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61  eof(random), &ra
8750: 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61  ndom);.      zMa
8760: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
8770: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
8780: 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  %08X", zMainFile
8790: 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66 66  , random&0x7ffff
87a0: 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fff);.      if( 
87b0: 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !zMaster ){.    
87c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
87d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
87e0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71 6c  .    }while( sql
87f0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
8800: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
8810: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
8820: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  ) );..    /* Ope
8830: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
8840: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63 20  rnal. */.    rc 
8850: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
8860: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
8870: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
8880: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8890: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
88a0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
88b0: 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
88c0: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
88d0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
88e0: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
88f0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
8900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8910: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8920: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
8930: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8940: 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
8950: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
8960: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
8970: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
8980: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
8990: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
89a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
89b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
89c0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
89d0: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
89e0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
89f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
8a00: 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
8a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
8a20: 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
8a30: 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
8a40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
8a50: 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
8a60: 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
8a70: 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
8a80: 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
8a90: 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
8aa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
8ab0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
8ac0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8ad0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8ae0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29        if( i==1 )
8af0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20   continue;   /* 
8b00: 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20  Ignore the TEMP 
8b10: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
8b20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
8b30: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
8b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
8b50: 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
8b60: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
8b70: 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
8b80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
8b90: 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  le[0]==0 ) conti
8ba0: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
8bb0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
8bc0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  es */.        if
8bd0: 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21  ( !needSync && !
8be0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
8bf0: 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b  Disabled(pBt) ){
8c00: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
8c10: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
8c20: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
8c30: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
8c40: 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
8c50: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20  trlen(zFile)+1, 
8c60: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
8c70: 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c 65   offset += strle
8c80: 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  n(zFile)+1;.    
8c90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8ca0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
8cb0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8cc0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
8cd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8ce0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
8cf0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
8d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
8d10: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8d20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
8d30: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
8d40: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8d50: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
8d60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8d70: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
8d80: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
8d90: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
8da0: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
8db0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
8dc0: 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20      zMainFile = 
8dd0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
8de0: 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  irname(db->aDb[0
8df0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
8e00: 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20  (needSync .     
8e10: 26 26 20 28 30 3d 3d 28 73 71 6c 69 74 65 33 4f  && (0==(sqlite3O
8e20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
8e30: 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
8e40: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
8e50: 55 45 4e 54 49 41 4c 29 29 0a 20 20 20 20 20 26  UENTIAL)).     &
8e60: 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53  & (rc=sqlite3OsS
8e70: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
8e80: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
8e90: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  )!=SQLITE_OK) ){
8ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8eb0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
8ec0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
8ed0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
8ee0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
8ef0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8f00: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
8f10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
8f20: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
8f30: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
8f40: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
8f50: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
8f60: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
8f70: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
8f80: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
8f90: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
8fa0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
8fb0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
8fc0: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
8fd0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
8fe0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8ff0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
9000: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
9010: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
9020: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
9030: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
9040: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
9050: 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
9060: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
9070: 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
9080: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
9090: 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
90a0: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
90b0: 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
90c0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
90d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
90e0: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
90f0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
9100: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
9110: 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
9120: 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a  e occured..    *
9130: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
9140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9150: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9160: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
9170: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
9180: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
9190: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
91a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
91b0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
91c0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
91d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
91e0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
91f0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
9200: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9210: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
9220: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
9230: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9240: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9250: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
9260: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9270: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
9280: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
9290: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
92a0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
92b0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
92c0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
92d0: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
92e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
92f0: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
9300: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
9310: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9320: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
9330: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
9340: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
9350: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
9360: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
9370: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9380: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
9390: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
93a0: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
93b0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
93c0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
93d0: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
93e0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
93f0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
9400: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
9410: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
9420: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
9430: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
9440: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
9450: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
9460: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
9470: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
9480: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
9490: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
94a0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
94b0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
94c0: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
94d0: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
94e0: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
94f0: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
9500: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
9510: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
9520: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
9530: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
9540: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
9550: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
9560: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
9570: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
9580: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
9590: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
95a0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
95b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
95c0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
95d0: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
95e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 61   }.    }.    ena
95f0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
9600: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
9610: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
9620: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
9630: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
9640: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
9650: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
9660: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  at the sqlite3.a
9670: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75  ctiveVdbeCnt cou
9680: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
9690: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
96a0: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
96b0: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
96c0: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
96d0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
96e0: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
96f0: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
9700: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
9710: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
9720: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
9730: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
9740: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
9750: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
9760: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
9770: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
9780: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
9790: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
97a0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
97b0: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
97c0: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
97d0: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
97e0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
97f0: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
9800: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
9810: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
9820: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
9830: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
9840: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
9850: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
9860: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
9870: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
9880: 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65  eVdbeCnt );.}.#e
9890: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
98a0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
98b0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
98c0: 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20  For every Btree 
98d0: 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65  that in database
98e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77   connection db w
98f0: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65  hich .** has bee
9900: 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69  n modified, "tri
9910: 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65  p" or invalidate
9920: 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a   each cursor in.
9930: 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69  ** that Btree mi
9940: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  ght have been mo
9950: 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74  dified so that t
9960: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
9970: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
9980: 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70  gain.  This happ
9990: 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  ens when a rollb
99a0: 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20  ack.*** occurs. 
99b0: 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70   We have to trip
99c0: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
99d0: 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20  ursors, even.** 
99e0: 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65  cursor from othe
99f0: 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65  r VMs in differe
9a00: 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  nt database conn
9a10: 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74  ections,.** so t
9a20: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d  hat none of them
9a30: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
9a40: 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68  data at which th
9a50: 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74  ey.** were point
9a60: 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f  ing and which no
9a70: 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  w may have been 
9a80: 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74  changed due.** t
9a90: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
9aa0: 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  **.** Remember t
9ab0: 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63  hat a rollback c
9ac0: 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73  an delete tables
9ad0: 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a   complete and.**
9ae0: 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67   reorder rootpag
9af0: 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f  es.  So it is no
9b00: 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73  t sufficient jus
9b10: 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65  t to save.** the
9b20: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
9b30: 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74  rsor.  We have t
9b40: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  o invalidate the
9b50: 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68   cursor.** so th
9b60: 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75  at it is never u
9b70: 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74  sed again..*/.st
9b80: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
9b90: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
9ba0: 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69  ifiedBtrees(sqli
9bb0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
9bc0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
9bd0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
9be0: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
9bf0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
9c00: 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74    if( p && sqlit
9c10: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
9c20: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
9c30: 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
9c40: 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54  Cursors(p, SQLIT
9c50: 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a  E_ABORT);.    }.
9c60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9c70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9c80: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
9c90: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
9ca0: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
9cb0: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
9cc0: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
9cd0: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
9ce0: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
9cf0: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
9d00: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
9d10: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
9d20: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
9d30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9d40: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
9d50: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
9d60: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
9d70: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
9d80: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
9d90: 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
9da0: 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
9db0: 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
9dc0: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
9dd0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
9de0: 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
9df0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
9e00: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
9e10: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
9e20: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
9e30: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
9e40: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
9e50: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
9e60: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
9e70: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
9e80: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
9e90: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
9ea0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
9eb0: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
9ec0: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
9ed0: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
9ee0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
9ef0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78  int i;.  int (*x
9f00: 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74  Func)(Btree *pBt
9f10: 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74  ) = 0;  /* Funct
9f20: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65  ion to call on e
9f30: 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e  ach btree backen
9f40: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65  d */.  int isSpe
9f50: 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
9f60: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
9f70: 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e  true if SQLITE_N
9f80: 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f  OMEM or IOERR */
9f90: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
9fa0: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
9fb0: 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
9fc0: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
9fd0: 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
9fe0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
9ff0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
a000: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
a010: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
a020: 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
a030: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
a040: 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
a050: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
a060: 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
a070: 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
a080: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
a090: 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
a0a0: 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
a0b0: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
a0c0: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
a0d0: 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
a0e0: 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
a0f0: 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
a100: 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
a110: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
a120: 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
a130: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
a140: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
a150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
a160: 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
a170: 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
a180: 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
a190: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
a1a0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
a1b0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
a1c0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
a1d0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
a1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a1f0: 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  M;.  }.  closeAl
a200: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
a210: 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20  tiveVtabs(p);.  
a220: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
a230: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
a240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a250: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
a260: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
a270: 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
a280: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
a290: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
a2a0: 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
a2b0: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
a2c0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  pc>=0 ){.    int
a2d0: 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
a2e0: 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
a2f0: 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20  om p->rc */..   
a300: 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
a310: 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
a320: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
a330: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
a340: 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d  exArrayEnter(&p-
a350: 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >aMutex);..    /
a360: 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
a370: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
a380: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
a390: 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
a3a0: 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
a3b0: 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
a3c0: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
a3d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
a400: 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
a410: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
a420: 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
a430: 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
a440: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65  /* This loop doe
a450: 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  s static analysi
a460: 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 74  s of the query t
a470: 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66 20 74  o see which of t
a480: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  he.      ** foll
a490: 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61 74 65  owing three cate
a4a0: 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73 20  gories it falls 
a4b0: 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  into:.      **. 
a4c0: 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61 64       **     Read
a4d0: 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20  -only.      **  
a4e0: 20 20 20 51 75 65 72 79 20 77 69 74 68 20 73 74     Query with st
a4f0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
a500: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65        **     Que
a510: 72 79 20 77 69 74 68 6f 75 74 20 73 74 61 74 65  ry without state
a520: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ment journal.   
a530: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
a540: 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74  e could do somet
a550: 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e  hing more elegan
a560: 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61 74  t than this stat
a570: 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65  ic analysis (i.e
a580: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65  ..      ** store
a590: 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75 65   the type of que
a5a0: 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ry as part of th
a5b0: 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68  e compliation ph
a5c0: 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20  ase), but .     
a5d0: 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c   ** handling mal
a5e0: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c  loc() or IO fail
a5f0: 75 72 65 20 69 73 20 61 20 66 61 69 72 6c 79 20  ure is a fairly 
a600: 6f 62 73 63 75 72 65 20 65 64 67 65 20 63 61 73  obscure edge cas
a610: 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  e so .      ** t
a620: 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20  his is probably 
a630: 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69  easier. Todo: Mi
a640: 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72 74  ght be an opport
a650: 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65 20  unity to reduce 
a660: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 73  .      ** code s
a670: 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c 6c  ize a very small
a680: 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e   amount though..
a690: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a6a0: 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e 6c 79   int notReadOnly
a6b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
a6c0: 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  isStatement = 0;
a6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 2d  .      assert(p-
a6e0: 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d  >aOp || p->nOp==
a6f0: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
a700: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
a710: 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69 74  ){ .        swit
a720: 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  ch( p->aOp[i].op
a730: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
a740: 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61    case OP_Transa
a750: 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20  ction:.         
a760: 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 7c     notReadOnly |
a770: 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b 0a  = p->aOp[i].p2;.
a780: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a790: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
a7a0: 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a  e OP_Statement:.
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74              isSt
a7c0: 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20  atement = 1;.   
a7d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a7e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a7f0: 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }..   .      /* 
a800: 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
a810: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e   read-only, we n
a820: 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61  eed do no rollba
a830: 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72  ck at all. Other
a840: 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70  wise,.      ** p
a850: 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65 20  roceed with the 
a860: 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
a870: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a880: 20 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e 6c 79   if( notReadOnly
a890: 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
a8a0: 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
a8b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
a8c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
a8d0: 43 4b 45 44 20 26 26 20 69 73 53 74 61 74 65 6d  CKED && isStatem
a8e0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a8f0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a900: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a910: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
a920: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
a930: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
a940: 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
a950: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
a960: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
a970: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
a980: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
a990: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a9a0: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
a9b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a9c0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
a9d0: 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
a9e0: 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
a9f0: 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
aa00: 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
aa10: 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
aa20: 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
aa30: 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
aa40: 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
aa50: 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
aa60: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61  /.          inva
aa70: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
aa80: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
aa90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
aaa0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
aab0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
aac0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
aad0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
aae0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
aaf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
ab00: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
ab10: 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
ab20: 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
ab30: 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a  vdbe, then.    *
ab40: 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  * we do either a
ab50: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
ab60: 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
ab70: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
ab80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
ab90: 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
aba0: 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
abb0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
abc0: 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
abd0: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
abe0: 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20 2a   occured. .    *
abf0: 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75  /.    if( db->au
ac00: 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  toCommit && db->
ac10: 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31  activeVdbeCnt==1
ac20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
ac30: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
ac40: 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
ac50: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
ac60: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
ac70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
ac80: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
ac90: 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74  g is true, and t
aca0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
acb0: 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  was .        ** 
acc0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69  successful or hi
acd0: 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
ace0: 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20  onstraint. This 
acf0: 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
ad00: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
ad10: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20  quired..        
ad20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
ad30: 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
ad40: 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
ad50: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
ad60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ad70: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
ad80: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
ad90: 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tex);.          
ada0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
adb0: 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
adc0: 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
add0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
ade0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
adf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
ae00: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
ae10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ae20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
ae30: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
ae40: 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
ae50: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
ae60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ae70: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
ae80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
ae90: 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29 7b  se if( !xFunc ){
aea0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
aeb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
aec0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
aed0: 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
aee0: 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64 53    if( p->openedS
aef0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
af00: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
af10: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
af20: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 20  Stmt;.        } 
af30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
af40: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
af50: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
af60: 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c       xFunc = sql
af70: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
af80: 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c  kStmt;.      }el
af90: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61  se{.        inva
afa0: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
afb0: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
afc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
afd0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
afe0: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
aff0: 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
b000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
b010: 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63 20      /* If xFunc 
b020: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
b030: 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 73  n it is one of s
b040: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b050: 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20 2a  ackStmt or.    *
b060: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
b070: 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69  mmitStmt. Call i
b080: 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 62  t once on each b
b090: 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72  ackend. If an er
b0a0: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20 2a  ror occurs.    *
b0b0: 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  * and the return
b0c0: 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20 53   code is still S
b0d0: 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68  QLITE_OK, set th
b0e0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
b0f0: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
b100: 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20 20  error value..   
b110: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21   */.    assert(!
b120: 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20 78  xFunc ||.      x
b130: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
b140: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a  eeCommitStmt ||.
b150: 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c        xFunc==sql
b160: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
b170: 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  kStmt.    );.   
b180: 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20   for(i=0; xFunc 
b190: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
b1a0: 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
b1b0: 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  c;.      Btree *
b1c0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
b1d0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
b1e0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
b1f0: 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a  c = xFunc(pBt);.
b200: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26          if( rc &
b210: 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  & (p->rc==SQLITE
b220: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
b230: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  LITE_CONSTRAINT)
b240: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
b250: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
b260: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
b270: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
b280: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
b290: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b2a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
b2b0: 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
b2c0: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
b2d0: 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  and the statemen
b2e0: 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  t was committed,
b2f0: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
b300: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
b310: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
b320: 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
b330: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
b340: 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63 20       if( !xFunc 
b350: 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65  || xFunc==sqlite
b360: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
b370: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b380: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
b390: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
b3a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b3b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b3c0: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
b3d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b3e0: 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
b3f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
b400: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20   /* Rollback or 
b410: 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d  commit any schem
b420: 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f  a changes that o
b430: 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20  ccurred. */.    
b440: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
b450: 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67  E_OK && db->flag
b460: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
b470: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20  hanges ){.      
b480: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
b490: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
b4a0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  );.      db->fla
b4b0: 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  gs = (db->flags 
b4c0: 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  | SQLITE_InternC
b4d0: 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a  hanges);.    }..
b4e0: 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
b4f0: 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
b500: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
b510: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
b520: 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  aMutex);.  }..  
b530: 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
b540: 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
b550: 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
b560: 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
b570: 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
b580: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
b590: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d  ->activeVdbeCnt-
b5a0: 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  -;.  }.  p->magi
b5b0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
b5c0: 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
b5d0: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
b5e0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
b5f0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
b600: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
b610: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 68 65 63  OMEM;.  }.  chec
b620: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
b630: 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  b);..  return SQ
b640: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
b650: 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
b660: 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
b670: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
b680: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
b690: 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
b6a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
b6b0: 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
b6c0: 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
b6d0: 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
b6e0: 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
b6f0: 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
b700: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
b710: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b720: 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
b730: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
b740: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
b750: 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
b760: 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
b770: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
b780: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
b790: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
b7a0: 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
b7b0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
b7c0: 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
b7d0: 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
b7e0: 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
b7f0: 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
b800: 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
b810: 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
b820: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
b830: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
b840: 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
b850: 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
b860: 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
b870: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
b880: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
b890: 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
b8a0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
b8b0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
b8c0: 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
b8d0: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
b8e0: 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
b8f0: 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
b900: 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
b910: 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
b920: 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
b930: 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
b940: 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
b950: 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
b960: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
b970: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
b980: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
b990: 65 48 61 6c 74 28 70 29 3b 0a 20 20 73 71 6c 69  eHalt(p);.  sqli
b9a0: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
b9b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
b9c0: 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
b9d0: 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
b9e0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
b9f0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
ba00: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
ba10: 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
ba20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
ba30: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
ba40: 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
ba50: 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
ba60: 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
ba70: 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
ba80: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
ba90: 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
baa0: 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
bab0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
bac0: 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
bad0: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
bae0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
baf0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
bb00: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
bb10: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
bb20: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d  etStr(db->pErr,-
bb30: 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c  1,p->zErrMsg,SQL
bb40: 49 54 45 5f 55 54 46 38 2c 73 71 6c 69 74 65 33  ITE_UTF8,sqlite3
bb50: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 64 62  _free);.      db
bb60: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72  ->errCode = p->r
bb70: 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  c;.      p->zErr
bb80: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
bb90: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
bba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bbb0: 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
bbc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bbd0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
bbe0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
bbf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
bc00: 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
bc10: 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
bc20: 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
bc30: 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
bc40: 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
bc50: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
bc60: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
bc70: 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
bc80: 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
bc90: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
bca0: 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
bcb0: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
bcc0: 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
bcd0: 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
bce0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
bcf0: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
bd00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
bd10: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
bd20: 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
bd30: 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
bd40: 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  F8, sqlite3_free
bd50: 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
bd60: 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
bd70: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
bd80: 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
bd90: 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
bda0: 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
bdb0: 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
bdc0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
bdd0: 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
bde0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
bdf0: 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70  Tos<&p->aStack[p
be00: 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20  ->pc<0?0:p->pc] 
be10: 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29 3b  || !p->aStack );
be20: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
be30: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
be40: 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
be50: 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
be60: 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
be70: 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
be80: 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
be90: 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
bea0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
beb0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
bec0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
bed0: 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
bee0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
bef0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
bf00: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
bf10: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
bf20: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
bf30: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
bf40: 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
bf50: 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
bf60: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
bf70: 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
bf80: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
bf90: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
bfa0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
bfb0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
bfc0: 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
bfd0: 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
bfe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bff0: 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
c000: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
c010: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
c020: 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
c030: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
c040: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
c050: 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f  C_INIT;.  p->abo
c060: 72 74 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  rted = 0;.  retu
c070: 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
c080: 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
c090: 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
c0a0: 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
c0b0: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
c0c0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
c0d0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
c0e0: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
c0f0: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
c100: 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
c110: 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
c120: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
c130: 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
c140: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c150: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
c160: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
c170: 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
c180: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
c190: 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
c1a0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
c1b0: 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
c1c0: 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
c1d0: 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
c1e0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69  else if( p->magi
c1f0: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
c200: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
c210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
c220: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
c230: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
c240: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c250: 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
c260: 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
c270: 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
c280: 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
c290: 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
c2a0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
c2b0: 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
c2c0: 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
c2d0: 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
c2e0: 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
c2f0: 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
c300: 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
c310: 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
c320: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
c330: 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
c340: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
c350: 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
c360: 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
c370: 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
c380: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
c390: 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
c3a0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
c3b0: 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
c3c0: 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
c3d0: 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
c3e0: 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31  >31 || !(mask&(1
c3f0: 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
c400: 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
c410: 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
c420: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
c430: 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
c440: 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
c450: 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
c460: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
c470: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
c480: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
c490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c4a0: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
c4b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
c4c0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
c4d0: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20    Cleanup(p);.  
c4e0: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
c4f0: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
c500: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
c510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
c520: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
c530: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
c540: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
c550: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
c560: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
c570: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
c580: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
c590: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
c5a0: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e     Op *pOp = p->
c5b0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
c5c0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c  ; i<p->nOp; i++,
c5d0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
c5e0: 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70  reeP4(pOp->p4typ
c5f0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23  e, pOp->p4.p);.#
c600: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c610: 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
c620: 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d  _free(pOp->zComm
c630: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
c640: 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69   .    }.    sqli
c650: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70 29  te3_free(p->aOp)
c660: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
c670: 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
c680: 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c   p->nVar);.  sql
c690: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61  ite3_free(p->aLa
c6a0: 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  bel);.  sqlite3_
c6b0: 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29 3b  free(p->aStack);
c6c0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
c6d0: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
c6e0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
c6f0: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
c700: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c  te3_free(p->aCol
c710: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
c720: 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a  _free(p->zSql);.
c730: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
c740: 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
c750: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
c760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d  .}../*.** If a M
c770: 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
c780: 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
c790: 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
c7a0: 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
c7b0: 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74  MoveTo now.  Ret
c7c0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
c7d0: 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f  e.  If no MoveTo
c7e0: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69   is pending, thi
c7f0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65  s.** routine doe
c800: 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65  s nothing and re
c810: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
c820: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c830: 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
c840: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
c850: 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
c860: 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
c870: 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
c880: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
c890: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
c8a0: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
c8b0: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
c8c0: 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
c8d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c8e0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e  3BtreeMoveto(p->
c8f0: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
c900: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
c910: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
c920: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
c930: 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20     *p->pIncrKey 
c940: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74  = 0;.    p->last
c950: 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74  Rowid = keyToInt
c960: 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  (p->movetoTarget
c970: 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  );.    p->rowidI
c980: 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b  sValid = res==0;
c990: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
c9a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
c9b0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d  ite3BtreeNext(p-
c9c0: 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
c9d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
c9e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
c9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
ca00: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
ca10: 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
ca20: 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
ca30: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
ca40: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
ca50: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
ca60: 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LE;.  }.  return
ca70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ca80: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
ca90: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
caa0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
cab0: 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
cac0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
cad0: 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
cae0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52 65  ite3VdbeSerialRe
caf0: 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ad().** sqlite3V
cb00: 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
cb10: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
cb20: 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a  ialWrite().**.**
cb30: 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
cb40: 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
cb50: 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
cb60: 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
cb70: 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
cb80: 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
cb90: 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
cba0: 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
cbb0: 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
cbc0: 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
cbd0: 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
cbe0: 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
cbf0: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
cc00: 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
cc10: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
cc20: 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
cc30: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
cc40: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
cc50: 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
cc60: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
cc70: 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
cc80: 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
cc90: 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
cca0: 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
ccb0: 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
ccc0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
ccd0: 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
cce0: 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
ccf0: 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
cd00: 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
cd10: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
cd20: 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
cd30: 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
cd40: 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
cd50: 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74  ata blob seperat
cd60: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
cd70: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
cd80: 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
cd90: 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
cda0: 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
cdb0: 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
cdc0: 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
cdd0: 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
cde0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
cdf0: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
ce20: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
ce30: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
ce40: 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
ce50: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
ce60: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
ce70: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
ce80: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
ceb0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
cec0: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
cef0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
cf00: 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
cf10: 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
cf20: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
cf30: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
cf60: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
cf70: 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
cf90: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
cfa0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
cfb0: 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
cfc0: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
cfd0: 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
cfe0: 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
d000: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
d010: 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
d020: 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
d030: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
d040: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
d050: 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
d060: 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
d090: 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
d0a0: 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
d0b0: 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
d0c0: 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
d0d0: 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
d0e0: 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
d0f0: 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
d100: 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
d110: 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
d120: 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
d130: 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
d140: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
d150: 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
d160: 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
d170: 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
d180: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d190: 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
d1a0: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
d1b0: 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
d1c0: 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
d1d0: 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
d1e0: 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
d1f0: 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
d200: 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
d210: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66  ;.  int n;..  if
d220: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
d230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
d250: 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
d260: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
d270: 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
d280: 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
d290: 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
d2a0: 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
d2b0: 28 69 36 34 29 30 78 30 30 30 30 31 30 30 30 29  (i64)0x00001000)
d2c0: 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
d2d0: 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
d2e0: 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
d2f0: 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  f( file_format>=
d300: 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b  4 && (i&1)==i ){
d310: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b  .      return 8+
d320: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d  i;.    }.    u =
d330: 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20   i<0 ? -i : i;. 
d340: 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20     if( u<=127 ) 
d350: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
d360: 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74  ( u<=32767 ) ret
d370: 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75  urn 2;.    if( u
d380: 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75  <=8388607 ) retu
d390: 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 3;.    if( u<
d3a0: 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65  =2147483647 ) re
d3b0: 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20  turn 4;.    if( 
d3c0: 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72  u<=MAX_6BYTE ) r
d3d0: 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74  eturn 5;.    ret
d3e0: 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
d3f0: 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
d400: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  ){.    return 7;
d410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
d420: 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
d430: 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
d440: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
d450: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
d460: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
d470: 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61 73  m->u.i;.  }.  as
d480: 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
d490: 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
d4a0: 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
d4b0: 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
d4c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d4d0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
d4e0: 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
d4f0: 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
d500: 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
d510: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d520: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
d530: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
d540: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
d550: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
d560: 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
d570: 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
d580: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
d590: 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
d5a0: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
d5b0: 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
d5c0: 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
d5d0: 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
d5e0: 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
d5f0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
d600: 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
d610: 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
d620: 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
d630: 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
d640: 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
d650: 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
d660: 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
d670: 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
d680: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
d690: 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
d6a0: 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
d6b0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
d6c0: 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
d6d0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
d6e0: 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
d6f0: 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
d700: 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
d710: 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
d720: 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
d730: 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
d740: 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
d750: 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
d760: 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
d770: 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
d780: 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
d790: 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
d7a0: 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
d7b0: 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
d7c0: 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
d7d0: 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
d7e0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
d7f0: 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
d800: 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
d810: 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
d820: 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
d830: 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
d840: 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
d850: 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
d860: 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
d870: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
d880: 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
d890: 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
d8a0: 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
d8b0: 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
d8c0: 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
d8d0: 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
d8e0: 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
d8f0: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
d900: 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
d910: 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
d920: 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
d930: 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
d940: 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
d950: 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
d960: 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
d970: 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
d980: 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
d990: 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
d9a0: 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
d9b0: 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
d9c0: 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
d9d0: 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
d9e0: 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
d9f0: 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
da00: 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
da10: 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
da20: 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
da30: 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
da40: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
da50: 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
da60: 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
da70: 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
da80: 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
da90: 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
daa0: 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
dab0: 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
dac0: 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
dad0: 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
dae0: 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
daf0: 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
db00: 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
db10: 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
db20: 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
db30: 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
db40: 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
db50: 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
db60: 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
db70: 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
db80: 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
db90: 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
dba0: 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
dbb0: 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
dbc0: 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
dbd0: 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
dbe0: 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
dbf0: 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
dc00: 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
dc10: 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
dc20: 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
dc30: 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
dc40: 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
dc50: 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
dc60: 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
dc70: 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
dc80: 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
dc90: 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
dca0: 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
dcb0: 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
dcc0: 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
dcd0: 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
dce0: 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
dcf0: 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
dd00: 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
dd10: 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
dd20: 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
dd30: 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
dd40: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
dd50: 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
dd60: 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
dd70: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
dd80: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
dd90: 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
dda0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
ddb0: 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
ddc0: 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
ddd0: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
dde0: 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
ddf0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
de00: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
de10: 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
de20: 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
de30: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
de40: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
de50: 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
de60: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
de70: 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
de80: 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
de90: 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
dea0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
deb0: 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
dec0: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
ded0: 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
dee0: 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
def0: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
df00: 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
df10: 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
df20: 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
df30: 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
df40: 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
df50: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
df60: 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
df70: 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
df80: 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
df90: 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
dfa0: 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
dfb0: 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
dfc0: 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
dfd0: 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
dfe0: 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
dff0: 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
e000: 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
e010: 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
e020: 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
e030: 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
e040: 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
e050: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
e060: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
e070: 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
e080: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
e090: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
e0a0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
e0b0: 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
e0c0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
e0d0: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
e0e0: 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
e0f0: 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
e100: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
e110: 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
e120: 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
e130: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
e140: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
e150: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
e160: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e170: 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
e180: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20  _format);.  int 
e190: 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
e1a0: 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
e1b0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e1c0: 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
e1d0: 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
e1e0: 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  v;.    int i;.  
e1f0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
e200: 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
e210: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
e220: 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
e230: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
e240: 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
e250: 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
e260: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
e270: 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
e280: 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
e290: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
e2a0: 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
e2b0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
e2c0: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
e2d0: 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
e2e0: 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20   len<=nBuf );.  
e2f0: 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
e300: 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
e310: 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
e320: 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20   >>= 8;.    }.  
e330: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
e340: 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
e350: 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
e360: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
e370: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e380: 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
e390: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
e3a0: 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a  o)?pMem->u.i:0).
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
e3c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e3d0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
e3e0: 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73  type) );.    ass
e3f0: 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42  ert( pMem->n<=nB
e400: 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  uf );.    len = 
e410: 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
e420: 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
e430: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  , len);.    if( 
e440: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
e450: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
e460: 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69  len += pMem->u.i
e470: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e  ;.      if( len>
e480: 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
e490: 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20  len = nBuf;.    
e4a0: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
e4b0: 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20  (&buf[pMem->n], 
e4c0: 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b  0, len-pMem->n);
e4d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
e4e0: 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
e4f0: 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
e500: 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
e510: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e520: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
e530: 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
e540: 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
e550: 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
e560: 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
e570: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
e580: 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
e590: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
e5a0: 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
e5b0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
e5c0: 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
e5d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
e5e0: 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
e5f0: 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
e600: 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
e610: 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
e620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
e630: 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
e640: 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
e650: 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
e660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
e670: 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
e680: 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
e690: 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
e6a0: 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
e6b0: 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
e6c0: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
e6d0: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
e6e0: 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
e6f0: 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
e700: 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
e710: 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
e720: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
e730: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
e740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e750: 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
e760: 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
e770: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e780: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
e790: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
e7a0: 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
e7b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
e7c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
e7d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e7e0: 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
e7f0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
e800: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
e810: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
e820: 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
e830: 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
e840: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e850: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e860: 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
e870: 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
e880: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e890: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
e8a0: 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
e8b0: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
e8c0: 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
e8d0: 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
e8e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e8f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
e900: 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
e910: 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
e920: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
e930: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
e940: 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
e950: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
e960: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
e970: 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
e980: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e990: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e9a0: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
e9b0: 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
e9c0: 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
e9d0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
e9e0: 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
e9f0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
ea00: 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
ea10: 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
ea20: 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
ea30: 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
ea40: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
ea50: 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
ea60: 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
ea70: 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
ea80: 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
ea90: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
eaa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
eab0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
eac0: 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
ead0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
eae0: 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
eaf0: 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
eb00: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
eb10: 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
eb20: 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
eb30: 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
eb40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
eb50: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
eb60: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
eb70: 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
eb80: 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
eb90: 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
eba0: 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
ebb0: 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
ebc0: 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
ebd0: 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
ebe0: 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
ebf0: 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
ec00: 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
ec10: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
ec20: 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
ec30: 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
ec40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
ec50: 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
ec60: 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
ec70: 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
ec80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
ec90: 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
eca0: 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
ecb0: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
ecc0: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
ecd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ece0: 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
ecf0: 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
ed00: 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
ed10: 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
ed20: 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
ed30: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
ed40: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
ed50: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
ed60: 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
ed70: 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
ed80: 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
ed90: 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
eda0: 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
edb0: 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
edc0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
edd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
ede0: 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
edf0: 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
ee00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ee10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ee20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
ee30: 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
ee40: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
ee50: 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
ee60: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
ee70: 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
ee80: 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
ee90: 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
eea0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
eeb0: 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  gs = MEM_Real;. 
eec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
eed0: 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
eee0: 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
eef0: 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
ef00: 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
ef10: 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
ef20: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72   pMem->u.i = ser
ef30: 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20  ial_type-8;.    
ef40: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ef50: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
ef60: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
ef70: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
ef80: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73      int len = (s
ef90: 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
efa0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
efb0: 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
efc0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c       pMem->n = l
efd0: 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  en;.      pMem->
efe0: 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  xDel = 0;.      
eff0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26  if( serial_type&
f000: 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
f010: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f020: 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65  M_Str | MEM_Ephe
f030: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
f040: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
f050: 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c  ags = MEM_Blob |
f060: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
f070: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
f080: 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   len;.    }.  }.
f090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f0a0: 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65 72 20  *.** The header 
f0b0: 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f 6e 73  of a record cons
f0c0: 69 73 74 73 20 6f 66 20 61 20 73 65 71 75 65 6e  ists of a sequen
f0d0: 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67  ce variable-leng
f0e0: 74 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20  th integers..** 
f0f0: 54 68 65 73 65 20 69 6e 74 65 67 65 72 73 20 61  These integers a
f100: 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  re almost always
f110: 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20 65   small and are e
f120: 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69 6e 67  ncoded as a sing
f130: 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20  le byte..** The 
f140: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20  following macro 
f150: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
f160: 74 68 69 73 20 66 61 63 74 20 74 6f 20 70 72 6f  this fact to pro
f170: 76 69 64 65 20 61 20 66 61 73 74 20 64 65 63 6f  vide a fast deco
f180: 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74  de.** of the int
f190: 65 67 65 72 73 20 69 6e 20 61 20 72 65 63 6f 72  egers in a recor
f1a0: 64 20 68 65 61 64 65 72 2e 20 20 49 74 20 69 73  d header.  It is
f1b0: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
f1c0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77  common case.** w
f1d0: 68 65 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  here the integer
f1e0: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74   is a single byt
f1f0: 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69 74 74  e.  It is a litt
f200: 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e 20 74  le slower when t
f210: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73  he.** integer is
f220: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74   two or more byt
f230: 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61 6c 6c  es.  But overall
f240: 20 69 74 20 69 73 20 66 61 73 74 65 72 2e 0a 2a   it is faster..*
f250: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
f260: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ng expressions a
f270: 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a  re equivalent:.*
f280: 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73 71 6c  *.**     x = sql
f290: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
f2a0: 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20   A, &B );.**.** 
f2b0: 20 20 20 20 78 20 3d 20 47 65 74 56 61 72 69 6e      x = GetVarin
f2c0: 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f  t( A, B );.**.*/
f2d0: 0a 23 64 65 66 69 6e 65 20 47 65 74 56 61 72 69  .#define GetVari
f2e0: 6e 74 28 41 2c 42 29 20 20 28 28 42 20 3d 20 2a  nt(A,B)  ((B = *
f2f0: 28 41 29 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a  (A))<=0x7f ? 1 :
f300: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
f310: 74 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a  t32(A, &B))../*.
f320: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
f330: 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
f340: 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
f350: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 73 70  index records sp
f360: 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b  ecified by .** {
f370: 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
f380: 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d  d {nKey2, pKey2}
f390: 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65  , returning a ne
f3a0: 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
f3b0: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
f3c0: 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70  ger if {nKey1, p
f3d0: 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68  Key1} is less th
f3e0: 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
f3f0: 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
f400: 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e   {nKey2, pKey2}.
f410: 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20    Both Key1 and 
f420: 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62 79 74  Key2 must be byt
f430: 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d  e strings.** com
f440: 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f  posed by the OP_
f450: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
f460: 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a  e of the VDBE..*
f470: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f480: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
f490: 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61    void *userData
f4a0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
f4b0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
f4c0: 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  , .  int nKey2, 
f4d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
f4e0: 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  2.){.  KeyInfo *
f4f0: 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49  pKeyInfo = (KeyI
f500: 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20  nfo*)userData;. 
f510: 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20   u32 d1, d2;    
f520: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f530: 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
f540: 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
f550: 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20   */.  u32 idx1, 
f560: 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66  idx2;      /* Of
f570: 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
f580: 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
f590: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
f5a0: 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b   szHdr1, szHdr2;
f5b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
f5c0: 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
f5d0: 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
f5e0: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
f5f0: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
f600: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f610: 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
f620: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f630: 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20  )pKey1;.  const 
f640: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
f650: 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key2 = (const un
f660: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
f670: 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31  ey2;..  Mem mem1
f680: 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20  ;.  Mem mem2;.  
f690: 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
f6a0: 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
f6b0: 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
f6c0: 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d  db;.  mem2.enc =
f6d0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
f6e0: 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70 4b 65 79    mem2.db = pKey
f6f0: 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a 20 20 69  Info->db;.  .  i
f700: 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e 74 28  dx1 = GetVarint(
f710: 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
f720: 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
f730: 20 69 64 78 32 20 3d 20 47 65 74 56 61 72 69 6e   idx2 = GetVarin
f740: 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72 32 29  t(aKey2, szHdr2)
f750: 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72 32 3b  ;.  d2 = szHdr2;
f760: 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
f770: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
f780: 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
f790: 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48 64 72  r1 && idx2<szHdr
f7a0: 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  2 ){.    u32 ser
f7b0: 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75  ial_type1;.    u
f7c0: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b  32 serial_type2;
f7d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
f7e0: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
f7f0: 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
f800: 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
f810: 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
f820: 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 31  GetVarint( aKey1
f830: 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
f840: 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe1 );.    if( d
f850: 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69  1>=nKey1 && sqli
f860: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
f870: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
f880: 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  1)>0 ) break;.  
f890: 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56 61 72    idx2 += GetVar
f8a0: 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78 32 2c  int( aKey2+idx2,
f8b0: 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29 3b   serial_type2 );
f8c0: 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65  .    if( d2>=nKe
f8d0: 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y2 && sqlite3Vdb
f8e0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
f8f0: 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29  erial_type2)>0 )
f900: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
f910: 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
f920: 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
f930: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
f940: 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
f950: 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
f960: 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
f970: 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 64  1, &mem1);.    d
f980: 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  2 += sqlite3Vdbe
f990: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 32  SerialGet(&aKey2
f9a0: 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d2], serial_typ
f9b0: 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20  e2, &mem2);..   
f9c0: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
f9d0: 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
f9e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
f9f0: 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
fa00: 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20 3f  mem2, i<nField ?
fa10: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
fa20: 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
fa30: 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d  ( mem1.flags & M
fa40: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
fa50: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
fa60: 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20 6d  mem1);.    if( m
fa70: 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em2.flags & MEM_
fa80: 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  Dyn ) sqlite3Vdb
fa90: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
faa0: 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  2);.    if( rc!=
fab0: 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
fac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
fad0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f  .  }..  /* One o
fae0: 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
faf0: 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62 75  ut of fields, bu
fb00: 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  t all the fields
fb10: 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
fb20: 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75 61  t.  ** were equa
fb30: 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b 65  l. If the incrKe
fb40: 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  y flag is true, 
fb50: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  then the second 
fb60: 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65 61  key is.  ** trea
fb70: 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a 20  ted as larger.. 
fb80: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20   */.  if( rc==0 
fb90: 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  ){.    if( pKeyI
fba0: 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a  nfo->incrKey ){.
fbb0: 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
fbc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 4b     }else if( !pK
fbd0: 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69 78 49 73  eyInfo->prefixIs
fbe0: 45 71 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  Equal ){.      i
fbf0: 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20  f( d1<nKey1 ){. 
fc00: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
fc10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64       }else if( d
fc20: 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20  2<nKey2 ){.     
fc30: 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
fc40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
fc50: 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
fc60: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c  aSortOrder && i<
fc70: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
fc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc90: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
fca0: 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
fcb0: 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a    rc = -rc;.  }.
fcc0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fcd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
fce0: 65 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ent is an index 
fcf0: 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75  entry composed u
fd00: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
fd10: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
fd20: 2a 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79  * The last entry
fd30: 20 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20   in this record 
fd40: 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
fd50: 65 67 65 72 20 28 73 70 65 63 69 66 69 63 61 6c  eger (specifical
fd60: 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
fd70: 20 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72   rowid).  This r
fd80: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
fd90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
fda0: 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e  es in.** that in
fdb0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
fdc0: 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
fdd0: 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61  dLen(const u8 *a
fde0: 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64  Key){.  u32 szHd
fdf0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
fe00: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
fe10: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
fe20: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
fe30: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
fe40: 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  id */..  sqlite3
fe50: 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  GetVarint32(aKey
fe60: 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c  , &szHdr);.  sql
fe70: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
fe80: 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20  &aKey[szHdr-1], 
fe90: 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 72  &typeRowid);.  r
fea0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
feb0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
fec0: 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a  ypeRowid);.}.  .
fed0: 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
fee0: 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
fef0: 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
ff00: 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
ff10: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
ff20: 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
ff30: 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
ff40: 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
ff50: 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
ff60: 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
ff70: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
ff80: 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
ff90: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
ffa0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
ffb0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
ffc0: 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
ffd0: 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
ffe0: 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
fff0: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
10000 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
10010 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10020 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
10030 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
10040 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
10050 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
10060 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
10070 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10080 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
10090 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
100a0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
100b0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
100c0 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
100d0 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
100e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
100f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
10100 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
10110 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
10120 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
10130 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
10140 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10150 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74    }.  sqlite3Get
10160 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
10170 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71  z, &szHdr);.  sq
10180 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
10190 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
101a0 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
101b0 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  ;.  lenRowid = s
101c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
101d0 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
101e0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
101f0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
10200 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
10210 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
10220 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
10230 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
10240 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
10250 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10260 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10270 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
10280 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
10290 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
102a0 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
102b0 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
102c0 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
102d0 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
102e0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
102f0 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
10300 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
10310 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
10320 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
10330 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
10340 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
10350 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
10360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10370 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
10380 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72  Key is either cr
10390 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
103a0 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
103b0 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
103c0 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
103d0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
103e0 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
103f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
10400 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
10410 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a  gnored as well..
10420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
10430 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
10440 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  .  Cursor *pC,  
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10460 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
10470 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
10480 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  */.  int nKey, c
10490 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20  onst u8 *pKey,  
104a0 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63   /* The key to c
104b0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
104c0 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
104d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
104e0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
104f0 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
10500 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
10510 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
10520 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
10530 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
10540 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a    int lenRowid;.
10550 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69    Mem m;..  sqli
10560 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
10570 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
10580 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
10590 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  <=0 ){.    *res 
105a0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
105b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
105c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
105d0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
105e0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43  ->pCursor, 0, nC
105f0 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
10600 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10620 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
10630 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
10640 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20  en((u8*)m.z);.  
10650 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
10660 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10670 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e  pC->pKeyInfo, m.
10680 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c  n-lenRowid, m.z,
10690 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
106a0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
106b0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
106c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
106d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
106e0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
106f0 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
10700 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
10710 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
10720 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
10730 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
10740 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
10750 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10760 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
10770 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
10780 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
10790 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
107a0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
107b0 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
107c0 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
107d0 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
107e0 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
107f0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
10800 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
10810 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
10820 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
10830 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
10840 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
10850 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
10860 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
10870 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
10880 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
10890 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
108a0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
108b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
108c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
108d0 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
108e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
108f0 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
10900 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
10910 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
10920 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
10930 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
10940 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
10950 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
10960 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
10970 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
10980 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
10990 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
109a0 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
109b0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
109c0 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
109d0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
109e0 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
109f0 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
10a00 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
10a10 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
10a20 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
10a30 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
10a40 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
10a50 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
10a60 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
10a70 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
10a80 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
10a90 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
10aa0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
10ab0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
10ac0 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
10ad0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
10ae0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
10af0 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
10b00 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
10b10 64 62 3b 0a 7d 0a                                db;.}.