/ Hex Artifact Content
Login

Artifact bca64691ad6bb11e45b5ccf494d9f088d23b3575:


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 20 20 20 20 20  *    p1, p2     
0c20: 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20 6f       First two o
0c30: 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73 73  f the three poss
0c40: 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a 2a  ible operands..*
0c50: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
0c60: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
0c70: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
0c80: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
0c90: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
0ca0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
0cb0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
0cc0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
0cd0: 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70 65  of the P3.** ope
0ce0: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
0cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56 64  ite3VdbeAddOp(Vd
0d00: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0d10: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a  nt p1, int p2){.
0d20: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0d30: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0d40: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0d50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0d60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0d70: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0d80: 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  =i ){.    resize
0d90: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
0da0: 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30 29 3b  pAlloc*2 + 100);
0db0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
0dc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
0dd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0de0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0df0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0e00: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0e10: 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20 20  >opcode = op;.  
0e20: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
0e30: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
0e40: 70 4f 70 2d 3e 70 33 2e 70 20 3d 20 30 3b 0a 20  pOp->p3.p = 0;. 
0e50: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
0e60: 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e  3_NOTUSED;.  p->
0e70: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66  expired = 0;.#if
0e80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0e90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
0ea0: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
0eb0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0ec0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0ed0: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  Op[i]);.#endif. 
0ee0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
0ef0: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
0f00: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
0f10: 74 68 65 20 70 33 20 76 61 6c 75 65 20 61 73 20  the p3 value as 
0f20: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
0f30: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33  t sqlite3VdbeOp3
0f40: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
0f50: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0f60: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
0f70: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
0f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
0f90: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
0fa0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 69 6e 74  */.  int p1, int
0fb0: 20 70 32 2c 20 20 20 20 20 2f 2a 20 50 31 20 61   p2,     /* P1 a
0fc0: 6e 64 20 50 32 20 6f 70 65 72 61 6e 64 73 20 2a  nd P2 operands *
0fd0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0fe0: 7a 50 33 2c 20 20 20 20 2f 2a 20 54 68 65 20 50  zP3,    /* The P
0ff0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  3 operand */.  i
1000: 6e 74 20 70 33 74 79 70 65 20 20 20 20 20 20 20  nt p3type       
1010: 20 20 20 2f 2a 20 50 33 20 6f 70 65 72 61 6e 64     /* P3 operand
1020: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   type */.){.  in
1030: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
1040: 56 64 62 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c  VdbeAddOp(p, op,
1050: 20 70 31 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69   p1, p2);.  sqli
1060: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
1070: 70 2c 20 61 64 64 72 2c 20 7a 50 33 2c 20 70 33  p, addr, zP3, p3
1080: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1090: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
10a0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
10b0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
10c0: 33 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  3 value as an in
10d0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
10e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 49 6e 74 28  lite3VdbeOp3Int(
10f0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1100: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1110: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1120: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1140: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1150: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  /.  int p1, int 
1160: 70 32 2c 20 20 20 20 20 2f 2a 20 50 31 20 61 6e  p2,     /* P1 an
1170: 64 20 50 32 20 6f 70 65 72 61 6e 64 73 20 2a 2f  d P2 operands */
1180: 0a 20 20 69 6e 74 20 70 33 20 20 20 20 20 20 20  .  int p3       
1190: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
11a0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20   operand */.){. 
11b0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
11c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 2c 20  te3VdbeAddOp(p, 
11d0: 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 69  op, p1, p2);.  i
11e0: 66 28 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  f( !p->db->mallo
11f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 4f  cFailed ){.    O
1200: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
1210: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 4f 70 2d  [addr];.    pOp-
1220: 3e 70 33 2e 69 20 3d 20 70 33 3b 0a 20 20 20 20  >p3.i = p3;.    
1230: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
1240: 5f 49 4e 54 33 32 3b 0a 20 20 7d 0a 20 20 72 65  _INT32;.  }.  re
1250: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1260: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1270: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1280: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1290: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
12a0: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
12b0: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
12c0: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
12d0: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
12e0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
12f0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
1300: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
1310: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
1320: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
1330: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1340: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1350: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1360: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1370: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1380: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1390: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
13a0: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
13b0: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
13c0: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
13d0: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
13e0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
13f0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
1400: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
1410: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
1420: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
1430: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1440: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1450: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1460: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1470: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1480: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1490: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
14a0: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
14b0: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
14c0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
14d0: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
14e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
1500: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
1510: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1520: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1530: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1540: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1550: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
1560: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d  nLabelAlloc = p-
1570: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1580: 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62   10;.    p->aLab
1590: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
15a0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
15b0: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
15f0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
1600: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
1610: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
1620: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1630: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1640: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1650: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1660: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1670: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1680: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1690: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
16a0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
16b0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
16c0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
16d0: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
16e0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
16f0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
1700: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1710: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
1720: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
1730: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1740: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1750: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1760: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
1770: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
1780: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
1790: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
17a0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
17b0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
17c0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
17d0: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
17e0: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
17f0: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
1800: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
1810: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
1820: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
1830: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1840: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1850: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1860: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
1870: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
1880: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
1890: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
18a0: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
18b0: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
18c0: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
18d0: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
18e0: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
18f0: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
1900: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
1910: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
1920: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
1930: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1940: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1950: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1960: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
1970: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
1980: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
1990: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
19a0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
19b0: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
19c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
19d0: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
19e0: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
19f0: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
1a00: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
1a10: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
1a20: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
1a30: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1a40: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1a50: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1a60: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
1a70: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
1a80: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
1a90: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
1aa0: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
1ab0: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
1ac0: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1ad0: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
1ae0: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
1af0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
1b00: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
1b10: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
1b20: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
1b30: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1b40: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1b50: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1b60: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
1b70: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
1b80: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
1b90: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
1ba0: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
1bb0: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
1bc0: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1bd0: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1be0: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1bf0: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1c00: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1c10: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1c20: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1c30: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1c40: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1c50: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1c60: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1c70: 55 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29  USH_MASK_1)<<16)
1c80: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1c90: 4b 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_2 + (((unsigne
1ca0: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29  d)NOPUSH_MASK_3)
1cb0: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1cc0: 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e  H_MASK_4 + (((un
1cd0: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1ce0: 53 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_5)<<16),.    
1cf0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20  NOPUSH_MASK_6 + 
1d00: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1d10: 53 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c  SH_MASK_7)<<16),
1d20: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1d30: 5f 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _8 + (((unsigned
1d40: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c  )NOPUSH_MASK_9)<
1d50: 3c 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65  <16).  };.  asse
1d60: 72 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20  rt( op<32*5 );. 
1d70: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f   return (masks[o
1d80: 70 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26  p>>5] & (1<<(op&
1d90: 30 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e  0x1F)));.}..#ifn
1da0: 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
1db0: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1dc0: 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20  NoPush(u8 op){. 
1dd0: 20 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f   return opcodeNo
1de0: 50 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64  Push(op);.}.#end
1df0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  if../*.** Loop t
1e00: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
1e10: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
1e20: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
1e30: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45  e negative..** E
1e40: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
1e50: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
1e60: 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79  lve the label by
1e70: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a   setting the P2.
1e80: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  ** value to its 
1e90: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
1ea0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1eb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ec0: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
1ed0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
1ee0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
1ef0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
1f00: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
1f10: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1f20: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
1f30: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
1f40: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
1f50: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
1f60: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
1f70: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
1f80: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
1f90: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
1fa0: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
1fb0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
1fc0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  *.** The integer
1fd0: 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73   *pMaxStack is s
1fe0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1ff0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  m number of vdbe
2000: 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65   stack.** entrie
2010: 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e  s that static an
2020: 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74  alysis reveals t
2030: 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68  his program migh
2040: 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t need..**.** Th
2050: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
2060: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
2070: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ng optimization:
2080: 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a    It scans for.*
2090: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  * instructions t
20a0: 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65 20  hat might cause 
20b0: 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  a statement roll
20c0: 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74  back.  Such inst
20d0: 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a  ructions.** are:
20e0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
20f0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
2100: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
2110: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2120: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
2130: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
2140: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
2150: 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66  VRename.**.** If
2160: 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63   no such instruc
2170: 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  tion is found, t
2180: 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d  hen every Statem
2190: 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ent instruction 
21a0: 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74  .** is changed t
21b0: 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68  o a Noop.  In th
21c0: 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64  is way, we avoid
21d0: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73 74   creating the st
21e0: 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72  atement .** jour
21f0: 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73  nal file unneces
2200: 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sarily..*/.stati
2210: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
2220: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
2230: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
2240: 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63  s, int *pMaxStac
2250: 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  k){.  int i;.  i
2260: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b  nt nMaxArgs = 0;
2270: 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b  .  int nMaxStack
2280: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20   = p->nOp;.  Op 
2290: 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  *pOp;.  int *aLa
22a0: 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b  bel = p->aLabel;
22b0: 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65  .  int doesState
22c0: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  mentRollback = 0
22d0: 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65  ;.  int hasState
22e0: 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20  mentBegin = 0;. 
22f0: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
2300: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
2310: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
2320: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
2330: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
2340: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
2350: 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63  _Function || opc
2360: 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20  ode==OP_AggStep 
2370: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2380: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2390: 45 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63  E.        || opc
23a0: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a  ode==OP_VUpdate.
23b0: 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
23c0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
23d0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
23e0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
23f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
2400: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a  ode==OP_Halt ){.
2410: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2420: 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  1==SQLITE_CONSTR
2430: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
2440: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
2450: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
2460: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
2470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2480: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2490: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
24a0: 20 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74      hasStatement
24b0: 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  Begin = 1;.    }
24c0: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
24d0: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20  =OP_Destroy ){. 
24e0: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
24f0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
2500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2510: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2520: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2530: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
2540: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
2550: 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  VRename ){.     
2560: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
2570: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
2580: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2590: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
25a0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
25b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
25c0: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
25d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
25e0: 2d 32 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -2].opcode==OP_I
25f0: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
2600: 6e 20 3d 20 70 4f 70 5b 2d 32 5d 2e 70 31 3b 0a  n = pOp[-2].p1;.
2610: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
2620: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
2630: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
2640: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
2650: 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65 29 20 29  NoPush(opcode) )
2660: 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53 74 61 63  {.      nMaxStac
2670: 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  k--;.    }..    
2680: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  if( pOp->p2>=0 )
2690: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
26a0: 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70  ssert( -1-pOp->p
26b0: 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  2<p->nLabel );. 
26c0: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
26d0: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
26e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
26f0: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
2700: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
2710: 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ..  *pMaxFuncArg
2720: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
2730: 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d 61  *pMaxStack = nMa
2740: 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  xStack;..  /* If
2750: 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61   we never rollba
2760: 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ck a statement t
2770: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
2780: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
2790: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
27a0: 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f   not needed.  So
27b0: 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50   change every OP
27c0: 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20  _Statement.  ** 
27d0: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f  opcode into an O
27e0: 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76  P_Noop.  This av
27f0: 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  oid a call to sq
2800: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
2810: 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69 63  sive().  ** whic
2820: 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69  h can be expensi
2830: 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66  ve on some platf
2840: 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  orms..  */.  if(
2850: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
2860: 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74 65  in && !doesState
2870: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  mentRollback ){.
2880: 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61      for(pOp=p->a
2890: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
28a0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
28b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
28c0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61  ->opcode==OP_Sta
28d0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
28e0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
28f0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  OP_Noop;.      }
2900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2910: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
2920: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2930: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2940: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
2950: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2960: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
2970: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
2980: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2990: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
29a0: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
29b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
29c0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
29d0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
29e0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
29f0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
2a00: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
2a10: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
2a20: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2a30: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
2a40: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
2a50: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
2a60: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
2a70: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
2a80: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2a90: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2aa0: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
2ab0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b  > p->nOpAlloc ){
2ac0: 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72  .    resizeOpArr
2ad0: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 2a 32 20 2b  ay(p, p->nOp*2 +
2ae0: 20 6e 4f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28   nOp);.  }.  if(
2af0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
2b00: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
2b10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72  rn 0;.  }.  addr
2b20: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
2b30: 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e   nOp>0 ){.    in
2b40: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c  t i;.    VdbeOpL
2b50: 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d  ist const *pIn =
2b60: 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d   aOp;.    for(i=
2b70: 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70  0; i<nOp; i++, p
2b80: 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  In++){.      int
2b90: 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20   p2 = pIn->p2;. 
2ba0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75       VdbeOp *pOu
2bb0: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  t = &p->aOp[i+ad
2bc0: 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  dr];.      pOut-
2bd0: 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f  >opcode = pIn->o
2be0: 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75  pcode;.      pOu
2bf0: 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b  t->p1 = pIn->p1;
2c00: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20  .      pOut->p2 
2c10: 3d 20 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20  = p2<0 ? addr + 
2c20: 41 44 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20  ADDR(p2) : p2;. 
2c30: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 2e 70 20       pOut->p3.p 
2c40: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
2c50: 20 70 4f 75 74 2d 3e 70 33 74 79 70 65 20 3d 20   pOut->p3type = 
2c60: 70 49 6e 2d 3e 70 33 20 3f 20 50 33 5f 53 54 41  pIn->p3 ? P3_STA
2c70: 54 49 43 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44  TIC : P3_NOTUSED
2c80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2c90: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
2ca0: 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64  sqlite3_vdbe_add
2cb0: 6f 70 5f 74 72 61 63 65 20 29 7b 0a 20 20 20 20  op_trace ){.    
2cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
2cd0: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
2ce0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
2cf0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
2d00: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
2d10: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
2d20: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2d30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2d40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2d50: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
2d60: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2d70: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
2d80: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
2d90: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
2da0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
2db0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
2dc0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
2dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2de0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
2df0: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
2e00: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
2e10: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
2e20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2e30: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
2e40: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
2e50: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
2e60: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
2e70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2e80: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
2e90: 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f  addr>=0 && p->nO
2ea0: 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70  p>addr && p->aOp
2eb0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
2ec0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
2ed0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
2ee0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2ef0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
2f00: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2f10: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
2f20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2f30: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
2f40: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
2f50: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2f60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
2f70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2f80: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2f90: 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29  assert( val>=0 )
2fa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  ;.  assert( p==0
2fb0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2fc0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2fd0: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2fe0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2ff0: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
3000: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3010: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
3020: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3030: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
3040: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
3050: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
3060: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
3070: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
3080: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
3090: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
30a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
30b0: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
30c0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c  int addr){.  sql
30d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
30e0: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
30f0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
3100: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
3110: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
3120: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
3130: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
3140: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
3150: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
3160: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
3170: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3180: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3190: 6e 28 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  n(FuncDef *pDef)
31a0: 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26 20  {.  if( pDef && 
31b0: 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
31c0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
31d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
31e0: 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a  te3_free(pDef);.
31f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
3200: 65 74 65 20 61 20 50 33 20 76 61 6c 75 65 20 69  ete a P3 value i
3210: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
3220: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3230: 50 33 28 69 6e 74 20 70 33 74 79 70 65 2c 20 76  P3(int p3type, v
3240: 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69 66 28 20  oid *p3){.  if( 
3250: 70 33 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  p3 ){.    switch
3260: 28 20 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p3type ){.    
3270: 20 20 63 61 73 65 20 50 33 5f 52 45 41 4c 3a 0a    case P3_REAL:.
3280: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 49 4e        case P3_IN
3290: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
32a0: 50 33 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20  P3_MPRINTF:.    
32b0: 20 20 63 61 73 65 20 50 33 5f 44 59 4e 41 4d 49    case P3_DYNAMI
32c0: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 33  C:.      case P3
32d0: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
32e0: 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  case P3_KEYINFO_
32f0: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
3300: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3310: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
3320: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3330: 20 20 63 61 73 65 20 50 33 5f 56 44 42 45 46 55    case P3_VDBEFU
3340: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
3350: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
3360: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
3370: 70 33 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p3;.        free
3380: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3390: 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  n(pVdbeFunc->pFu
33a0: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nc);.        sql
33b0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
33c0: 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c  xData(pVdbeFunc,
33d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
33e0: 69 74 65 33 5f 66 72 65 65 28 70 56 64 62 65 46  ite3_free(pVdbeF
33f0: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  unc);.        br
3400: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3410: 20 20 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44     case P3_FUNCD
3420: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
3430: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3440: 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a 29 70 33  ion((FuncDef*)p3
3450: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3470: 63 61 73 65 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20  case P3_MEM: {. 
3480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
3490: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
34a0: 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20  _value*)p3);.   
34b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
34d0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e  ../*.** Change N
34e0: 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e   opcodes startin
34f0: 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d  g at addr to No-
3500: 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ops..*/.void sql
3510: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
3520: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
3530: 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a  t addr, int N){.
3540: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f    if( p && p->aO
3550: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
3560: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
3570: 64 64 72 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  ddr];.    while(
3580: 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72   N-- ){.      fr
3590: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
35a0: 2c 20 70 4f 70 2d 3e 70 33 2e 70 29 3b 0a 20 20  , pOp->p3.p);.  
35b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
35c0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
35d0: 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ));.      pOp->o
35e0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
35f0: 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20  .      pOp++;.  
3600: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3610: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3620: 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72  e of the P3 oper
3630: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3640: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3650: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3660: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
3670: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
3680: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
3690: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
36a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
36b0: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
36c0: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
36d0: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
36e0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
36f0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
3700: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33 20  >=0 then the P3 
3710: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
3720: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
3730: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
3740: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
3750: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
3760: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3770: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
3780: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
3790: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
37a0: 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e   of zP3 up to an
37b0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
37c0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
37d0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
37e0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
37f0: 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP3..**.** If
3800: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69   n==P3_KEYINFO i
3810: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33  t means that zP3
3820: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3830: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
3840: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
3850: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
3860: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3870: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
3880: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
3890: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f  lite3_malloc, to
38a0: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
38b0: 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c  he Vdbe is final
38c0: 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b  ized..** n==P3_K
38d0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
38e0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50  ndicates that zP
38f0: 33 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  3 points to a Ke
3900: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
3910: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ** stored in mem
3920: 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c  ory that the cal
3930: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
3940: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3950: 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61  lloc. The .** ca
3960: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
3970: 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  free the allocat
3980: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
3990: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
39a0: 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69  dbe is.** finali
39b0: 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zed..** .** Othe
39c0: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
39d0: 33 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f 4c  3_STATIC, P3_COL
39e0: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
39f0: 61 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f 69  ate that zP3 poi
3a00: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
3a10: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
3a20: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
3a30: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
3a40: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
3a50: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
3a60: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
3a70: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
3a80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
3a90: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
3aa0: 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20  hange P3 on the 
3ab0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
3ac0: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
3ad0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3ae0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3af0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3b00: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
3b10: 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P3, int n){.  Op
3b20: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28   *pOp;.  assert(
3b30: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
3b40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3b50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  IT );.  if( p==0
3b60: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c   || p->aOp==0 ||
3b70: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
3b80: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28  iled ){.    if (
3b90: 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 29  n != P3_KEYINFO)
3ba0: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 33 28   {.      freeP3(
3bb0: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
3bc0: 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d 0a  **)&zP3);.    }.
3bd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3be0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20    if( addr<0 || 
3bf0: 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  addr>=p->nOp ){.
3c00: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
3c10: 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61  p - 1;.    if( a
3c20: 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ddr<0 ) return;.
3c30: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
3c40: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
3c50: 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c  eP3(pOp->p3type,
3c60: 20 70 4f 70 2d 3e 70 33 2e 70 29 3b 0a 20 20 70   pOp->p3.p);.  p
3c70: 4f 70 2d 3e 70 33 2e 70 20 3d 20 30 3b 0a 20 20  Op->p3.p = 0;.  
3c80: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3c90: 20 20 70 4f 70 2d 3e 70 33 2e 70 20 3d 20 30 3b    pOp->p3.p = 0;
3ca0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
3cb0: 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P3_NOTUSED;. 
3cc0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
3cd0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
3ce0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
3cf0: 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  o;.    int nFiel
3d00: 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  d, nByte;..    n
3d10: 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66  Field = ((KeyInf
3d20: 6f 2a 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b  o*)zP3)->nField;
3d30: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
3d40: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b  eof(*pKeyInfo) +
3d50: 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65   (nField-1)*size
3d60: 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of(pKeyInfo->aCo
3d70: 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b  ll[0]) + nField;
3d80: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
3d90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
3da0: 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70  nByte );.    pOp
3db0: 2d 3e 70 33 2e 70 20 3d 20 28 63 68 61 72 2a 29  ->p3.p = (char*)
3dc0: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66  pKeyInfo;.    if
3dd0: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
3de0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
3df0: 72 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  r *aSortOrder;. 
3e00: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3e10: 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42 79 74 65  Info, zP3, nByte
3e20: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
3e30: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
3e40: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3e50: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
3e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
3e70: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3e80: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3e90: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
3ea0: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
3eb0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3ec0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3ed0: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
3ee0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
3ef0: 20 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65       pOp->p3type
3f00: 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P3_KEYINFO;. 
3f10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3f20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3f30: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
3f40: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
3f50: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3f60: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
3f70: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3f80: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 2e   ){.    pOp->p3.
3f90: 70 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a  p = (char*)zP3;.
3fa0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
3fb0: 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P3_KEYINFO;.  
3fc0: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3fd0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 2e 70 20 3d  .    pOp->p3.p =
3fe0: 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20   (char*)zP3;.   
3ff0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e   pOp->p3type = n
4000: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
4010: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74  f( n==0 ) n = st
4020: 72 6c 65 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70  rlen(zP3);.    p
4030: 4f 70 2d 3e 70 33 2e 70 20 3d 20 73 71 6c 69 74  Op->p3.p = sqlit
4040: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
4050: 62 2c 20 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20  b, zP3, n);.    
4060: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
4070: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
4080: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
4090: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
40a0: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
40b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
40c0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
40d0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
40e0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
40f0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
4100: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
4110: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
4120: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
4130: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
4140: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4150: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
4160: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
4170: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
4180: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4190: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
41a0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d  , zFormat);.  p-
41b0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
41c0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
41d0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
41e0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
41f0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23   va_end(ap);.}.#
4200: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
4210: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
4220: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
4230: 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ss..*/.VdbeOp *s
4240: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
4250: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4260: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  r){.  assert( p-
4270: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4280: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
4290: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
42a0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
42b0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
42c0: 69 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  iled );.  return
42d0: 20 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64   ((addr>=0 && ad
42e0: 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e  dr<p->nOp)?(&p->
42f0: 61 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d  aOp[addr]):0);.}
4300: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
4320: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
4330: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
4340: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
4350: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
4360: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4370: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
4380: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
4390: 63 72 69 62 65 73 20 74 68 65 20 50 33 20 70 61  cribes the P3 pa
43a0: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
43b0: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
43c0: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
43d0: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
43e0: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
43f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
4400: 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20  playP3(Op *pOp, 
4410: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
4420: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
4430: 2a 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP3 = zTemp;.  
4440: 69 6e 74 20 6e 50 33 3b 0a 20 20 61 73 73 65 72  int nP3;.  asser
4450: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
4460: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
4470: 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  3type ){.    cas
4480: 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P3_KEYINFO: {.
4490: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
44a0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
44b0: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
44c0: 66 6f 2a 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20  fo*)pOp->p3.p;. 
44d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
44e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
44f0: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
4500: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
4510: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
4520: 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20  trlen(zTemp);.  
4530: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
4540: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
4550: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
4560: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
4570: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
4580: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
4590: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
45a0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
45b0: 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  n(pColl->zName);
45c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
45d0: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
45e0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
45f0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
4600: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
4610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4620: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
4630: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
4640: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
4650: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
4660: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
4670: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
4680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
4690: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
46a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
46b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
46c0: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
46d0: 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20  Name,n+1);.     
46e0: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
46f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
4700: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
4710: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
4720: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c  zTemp[i],",nil",
4730: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  4);.          i 
4740: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
4750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
4760: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
4770: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
4780: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
4790: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
47a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
47b0: 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c      case P3_COLL
47c0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
47d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
47e0: 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 2e  ollSeq*)pOp->p3.
47f0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
4800: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4810: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
4820: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
4830: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
4840: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4850: 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a  case P3_FUNCDEF:
4860: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
4870: 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65   *pDef = (FuncDe
4880: 66 2a 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20 20  f*)pOp->p3.p;.  
4890: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
48a0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
48b0: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
48c0: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
48d0: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
48e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
48f0: 73 65 20 50 33 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P3_INT64: {. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4910: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4920: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 28 73 71  mp, "%lld", *(sq
4930: 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 4f 70  lite3_int64*)pOp
4940: 2d 3e 70 33 2e 70 29 3b 0a 20 20 20 20 20 20 62  ->p3.p);.      b
4950: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4960: 63 61 73 65 20 50 33 5f 49 4e 54 33 32 3a 20 7b  case P3_INT32: {
4970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4980: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4990: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
49a0: 3e 70 33 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p3.i);.      br
49b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
49c0: 61 73 65 20 50 33 5f 52 45 41 4c 3a 20 7b 0a 20  ase P3_REAL: {. 
49d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
49e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
49f0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 28 64  mp, "%.16g", *(d
4a00: 6f 75 62 6c 65 2a 29 70 4f 70 2d 3e 70 33 2e 70  ouble*)pOp->p3.p
4a10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4a30: 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  3_MEM: {.      M
4a40: 65 6d 20 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a  em *pMem = (Mem*
4a50: 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20 20 20 20  )pOp->p3.p;.    
4a60: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
4a70: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
4a80: 20 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4d 65         zP3 = pMe
4a90: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
4aa0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
4ab0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
4ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
4ad0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4ae0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
4af0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
4b00: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
4b10: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
4b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4b30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4b40: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
4b50: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
4b60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
4b70: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4b80: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
4b90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4ba0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4bb0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  NULL");.      }.
4bc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4bd0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4be0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4bf0: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 33 5f  BLE.    case P3_
4c00: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
4c10: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
4c20: 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
4c30: 62 2a 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20 20  b*)pOp->p3.p;.  
4c40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4c50: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4c60: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
4c70: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
4c80: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62  Module);.      b
4c90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4ca0: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
4cb0: 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f  {.      zP3 = pO
4cc0: 70 2d 3e 70 33 2e 70 3b 0a 20 20 20 20 20 20 69  p->p3.p;.      i
4cd0: 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70  f( zP3==0 || pOp
4ce0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
4cf0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 33  p ){.        zP3
4d00: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
4d10: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
4d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4d30: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 33 21  }.  assert( zP3!
4d40: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
4d50: 3e 7a 43 6f 6d 6d 65 6e 74 20 26 26 20 7a 50 33  >zComment && zP3
4d60: 3d 3d 7a 54 65 6d 70 20 26 26 20 28 6e 50 33 20  ==zTemp && (nP3 
4d70: 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 29 3c 6e  = strlen(zP3))<n
4d80: 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Temp ){.    sqli
4d90: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4da0: 6d 70 2d 6e 50 33 2c 20 26 7a 50 33 5b 6e 50 33  mp-nP3, &zP3[nP3
4db0: 5d 2c 20 22 25 73 23 20 25 73 22 2c 0a 20 20 20  ], "%s# %s",.   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 6e 50 33 3e 30 20 3f 20 22 20 22 20 3a 20    nP3>0 ? " " : 
4de0: 22 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  "", pOp->zCommen
4df0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4e00: 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP3;.}.#endif..
4e10: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
4e20: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
4e30: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
4e40: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
4e50: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69   used..**.*/.voi
4e60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
4e70: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
4e80: 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61  int i){.  int ma
4e90: 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  sk;.  assert( i>
4ea0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
4eb0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4ec0: 69 3c 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  i<sizeof(p->btre
4ed0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61  eMask)*8 );.  ma
4ee0: 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20 69 66 28  sk = 1<<i;.  if(
4ef0: 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
4f00: 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
4f10: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d   p->btreeMask |=
4f20: 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74   mask;.    sqlit
4f30: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
4f40: 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74  yInsert(&p->aMut
4f50: 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ex, p->db->aDb[i
4f60: 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ].pBt);.  }.}...
4f70: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
4f80: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
4f90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4fa0: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
4fb0: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
4fc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4fd0: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
4fe0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
4ff0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
5000: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
5010: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
5020: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a  ){.  char *zP3;.
5030: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
5040: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5050: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
5060: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
5070: 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  %4d %s\n";.  if(
5080: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
5090: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20  = stdout;.  zP3 
50a0: 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c  = displayP3(pOp,
50b0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
50c0: 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  tr));.  fprintf(
50d0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a  pOut, zFormat1,.
50e0: 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65        pc, sqlite
50f0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
5100: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
5110: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29  1, pOp->p2, zP3)
5120: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
5130: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5140: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
5150: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
5160: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
5170: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
5180: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
5190: 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  N){.  if( p ){. 
51a0: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20     while( N-->0 
51b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
51c0: 20 4e 3c 32 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d   N<2 || p[0].db=
51d0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
51e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
51f0: 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20  Release(p++);.  
5200: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
5210: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
5220: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
5230: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
5240: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
5250: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
5260: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
5270: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
5280: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
5290: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
52a0: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
52b0: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
52c0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
52d0: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
52e0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
52f0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
5300: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
5310: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
5320: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5330: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
5340: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
5350: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
5360: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
5370: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
5380: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
5390: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
53a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
53b0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  in );.  if( p->m
53c0: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
53d0: 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51  _RUN ) return SQ
53e0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61  LITE_MISUSE;.  a
53f0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63  ssert( db->magic
5400: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  ==SQLITE_MAGIC_B
5410: 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  USY );.  assert(
5420: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
5430: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
5440: 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a  TE_BUSY );..  /*
5450: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
5460: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
5470: 74 20 70 75 74 20 64 79 6e 61 6d 69 63 20 73 74  t put dynamic st
5480: 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20  rings onto the. 
5490: 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c 20 74   ** the stack, t
54a0: 68 65 79 20 6d 61 79 20 62 65 63 6f 6d 65 20 64  hey may become d
54b0: 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73  ynamic if the us
54c0: 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71  er calls.  ** sq
54d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
54e0: 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61  t16(), causing a
54f0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20   translation to 
5500: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e  UTF-16 encoding.
5510: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5520: 52 65 73 75 6c 74 53 65 74 20 29 7b 0a 20 20 20  ResultSet ){.   
5530: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
5540: 28 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  (p->pResultSet, 
5550: 35 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75  5);.    p->pResu
5560: 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  ltSet = 0;.  }..
5570: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
5580: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
5590: 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e   i<p->nOp && p->
55a0: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
55b0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
55c0: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
55d0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b  if( i>=p->nOp ){
55e0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
55f0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
5600: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
5610: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
5620: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
5630: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
5640: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
5650: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5660: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
5670: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
5680: 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33  zErrMsg, sqlite3
5690: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20 28  ErrStr(p->rc), (
56a0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73  char*)0);.  }els
56b0: 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  e{.    Op *pOp =
56c0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
56d0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
56e0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 2d 3e  pResultSet = p->
56f0: 61 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65 6d  aStack;.    pMem
5700: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
5710: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  t;.    pMem->typ
5720: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5730: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ER;.    pMem->u.
5740: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
5770: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
5780: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
5790: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
57a0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
57b0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65 6d  M_Term;.    pMem
57c0: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
57d0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
57e0: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
57f0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 61   Opcode */.    a
5800: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5810: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
5820: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5830: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
5840: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5850: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
5860: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
5870: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5880: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5890: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
58a0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
58d0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
58e0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
58f0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
5900: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5910: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
5920: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5930: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5950: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
5960: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5970: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5980: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
5990: 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68 65 6d 7c  ags = MEM_Ephem|
59a0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
59b0: 3b 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20  ;     /* P3 */. 
59c0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73     pMem->z = dis
59d0: 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d  playP3(pOp, pMem
59e0: 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66  ->zShort, sizeof
59f0: 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b  (pMem->zShort));
5a00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
5a10: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70  m->z!=0 );.    p
5a20: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5a30: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d  pMem->z);.    pM
5a40: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5a50: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
5a60: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
5a70: 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65  TF8;..    p->nRe
5a80: 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32 2a  sColumn = 5 - 2*
5a90: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
5aa0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d      p->pTos = pM
5ab0: 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  em;.    p->rc = 
5ac0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
5ad0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
5ae0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5af0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5b00: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
5b10: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
5b20: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
5b30: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
5b40: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
5b50: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
5b60: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
5b70: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
5b80: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
5b90: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
5ba0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
5bb0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
5bc0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
5bd0: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
5be0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
5bf0: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
5c00: 3e 70 33 2e 70 21 3d 30 20 29 7b 0a 20 20 20 20  >p3.p!=0 ){.    
5c10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5c20: 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20 20 20 20 77  pOp->p3.p;.    w
5c30: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
5c40: 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  u8*)z) ) z++;.  
5c50: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b    printf("SQL: [
5c60: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a  %s]\n", z);.  }.
5c70: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
5c80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5c90: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
5ca0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5cb0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
5cc0: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
5cd0: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
5ce0: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
5cf0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5d00: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
5d10: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
5d20: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
5d30: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
5d40: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63   sqlite3_io_trac
5d50: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5d60: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
5d70: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
5d80: 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69  >aOp[nOp-1];.  i
5d90: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
5da0: 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e  OP_Noop && pOp->
5db0: 70 33 2e 70 21 3d 30 20 29 7b 0a 20 20 20 20 69  p3.p!=0 ){.    i
5dc0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
5dd0: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
5de0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5df0: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
5e00: 73 22 2c 20 70 4f 70 2d 3e 70 33 2e 70 29 3b 0a  s", pOp->p3.p);.
5e10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73      for(i=0; iss
5e20: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
5e30: 68 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  har)z[i]); i++){
5e40: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
5e50: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
5e60: 20 69 66 28 20 69 73 73 70 61 63 65 28 28 75 6e   if( isspace((un
5e70: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d  signed char)z[i]
5e80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
5e90: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
5ea0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
5eb0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
5ec0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
5ed0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
5ee0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
5ef0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
5f00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f  ;.    sqlite3_io
5f10: 5f 74 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  _trace("SQL %s\n
5f20: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
5f30: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
5f40: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
5f50: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
5f60: 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72  CE */.../*.** Pr
5f70: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
5f80: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
5f90: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
5fa0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
5fb0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
5fc0: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
5fd0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
5fe0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
5ff0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
6000: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
6010: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
6020: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
6030: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
6040: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
6050: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
6060: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
6070: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
6080: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
6090: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
60a0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
60b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
60c0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
60d0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60f0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
6100: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6120: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
6130: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
6140: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
6150: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
6160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6170: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
6180: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
6190: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
61a0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
61b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
61c0: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
61d0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
61e0: 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20  isExplain       
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6200: 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49  ue if the EXPLAI
6210: 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72  N keywords is pr
6220: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  esent */.){.  in
6230: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
6240: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61  db = p->db;..  a
6250: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
6260: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
6270: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
6280: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
6290: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
62a0: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
62b0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
62c0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
62d0: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
62e0: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
62f0: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
6300: 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73  than later. This
6310: 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73 65  .   * is because
6320: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73   the call to res
6330: 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c  izeOpArray() bel
6340: 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68  ow may shrink th
6350: 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20  e.   * p->aOp[] 
6360: 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65  array to save me
6370: 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77  mory if called w
6380: 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49  hen in VDBE_MAGI
6390: 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74  C_RUN .   * stat
63a0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61  e..   */.  p->ma
63b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
63c0: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69  _RUN;..  /* No i
63d0: 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20  nstruction ever 
63e0: 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e  pushes more than
63f0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
6400: 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  t onto the.  ** 
6410: 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20  stack.  And the 
6420: 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77  stack never grow
6430: 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20  s on successive 
6440: 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68  executions of th
6450: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70  e.  ** same loop
6460: 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20  .  So the total 
6470: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75  number of instru
6480: 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70  ctions is an upp
6490: 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e  er bound.  ** on
64a0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61   the maximum sta
64b0: 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72 65  ck depth require
64c0: 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65 72  d.  (Added later
64d0: 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73  :)  The.  ** res
64e0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20 63  olveP2Values() c
64f0: 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74  all computes a t
6500: 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f 75  ighter upper bou
6510: 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73  nd on the.  ** s
6520: 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a  tack size..  **.
6530: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20    ** Allocation 
6540: 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70  all the stack sp
6550: 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72  ace we will ever
6560: 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   need..  */.  if
6570: 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29  ( p->aStack==0 )
6580: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20  {.    int nArg; 
6590: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
65a0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
65b0: 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72  passed to a user
65c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
65d0: 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20    int nStack;   
65e0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
65f0: 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74  ber of stack ent
6600: 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f  ries required */
6610: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
6620: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26  lues(p, &nArg, &
6630: 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73  nStack);.    res
6640: 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d  izeOpArray(p, p-
6650: 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72  >nOp);.    asser
6660: 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20  t( nVar>=0 );.  
6670: 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b    assert( nStack
6680: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69  <p->nOp );.    i
6690: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a  f( isExplain ){.
66a0: 20 20 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 31        nStack = 1
66b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
66c0: 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  aStack = sqlite3
66d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
66e0: 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b 2a  .        nStack*
66f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b  sizeof(p->aStack
6700: 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61 63  [0])    /* aStac
6710: 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72  k */.      + nAr
6720: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20  g*sizeof(Mem*)  
6730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6740: 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20  pArg */.      + 
6750: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6770: 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20  * aVar */.      
6780: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  + nVar*sizeof(ch
6790: 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  ar*)            
67a0: 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20   /* azVar */.   
67b0: 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66     + nMem*sizeof
67c0: 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20  (Mem)           
67d0: 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20      /* aMem */. 
67e0: 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73       + nCursor*s
67f0: 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 20  izeof(Cursor*)  
6800: 20 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a        /* apCsr *
6810: 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  /.    );.    if(
6820: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
6830: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
6840: 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Mem = &p->aStack
6850: 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20  [nStack];.      
6860: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a  p->nMem = nMem;.
6870: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
6880: 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a  &p->aMem[nMem];.
6890: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
68a0: 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  nVar;.      p->o
68b0: 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  kVar = 0;.      
68c0: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a  p->apArg = (Mem*
68d0: 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d  *)&p->aVar[nVar]
68e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
68f0: 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61   = (char**)&p->a
6900: 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20  pArg[nArg];.    
6910: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75    p->apCsr = (Cu
6920: 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72  rsor**)&p->azVar
6930: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
6940: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
6950: 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  or;.      for(n=
6960: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
6970: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
6980: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
6990: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
69a0: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
69b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69c0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 53 74 61 63  for(n=0; n<nStac
69d0: 6b 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; n++){.       
69e0: 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 5d 2e 64 62   p->aStack[n].db
69f0: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
6a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e     }.  }.  for(n
6a10: 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e  =0; n<p->nMem; n
6a20: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  ++){.    p->aMem
6a30: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
6a40: 4e 75 6c 6c 3b 0a 20 20 20 20 70 2d 3e 61 4d 65  Null;.    p->aMe
6a50: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
6a60: 7d 0a 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26  }..  p->pTos = &
6a70: 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20  p->aStack[-1];. 
6a80: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
6a90: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
6aa0: 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74  ;.  p->uniqueCnt
6ab0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72   = 0;.  p->retur
6ac0: 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  nDepth = 0;.  p-
6ad0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
6ae0: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f  E_Abort;.  p->po
6af0: 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70  pStack =  0;.  p
6b00: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
6b10: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
6b20: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
6b30: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
6b40: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
6b50: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
6b60: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
6b70: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70  t = 255;.  p->op
6b80: 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20  enedStatement = 
6b90: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
6ba0: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69  ROFILE.  {.    i
6bb0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6bc0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
6bd0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  ){.      p->aOp[
6be0: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
6bf0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
6c00: 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  es = 0;.    }.  
6c10: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
6c20: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
6c30: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
6c40: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
6c50: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
6c60: 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f  happens.** to ho
6c70: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
6c80: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
6c90: 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73 6f  r(Vdbe *p, Curso
6ca0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
6cb0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
6cc0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
6cd0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
6ce0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
6cf0: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
6d00: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
6d10: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
6d20: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6d30: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
6d40: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
6d50: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6d60: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
6d70: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
6d80: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
6d90: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
6da0: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
6db0: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
6dc0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
6dd0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
6de0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
6df0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
6e00: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   1;.    sqlite3S
6e10: 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b  afetyOff(p->db);
6e20: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
6e30: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
6e40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  );.    sqlite3Sa
6e50: 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20  fetyOn(p->db);. 
6e60: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
6e70: 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  od = 0;.  }.#end
6e80: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
6e90: 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pCx->pData);. 
6ea0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6eb0: 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c  x->aType);.  sql
6ec0: 69 74 65 33 5f 66 72 65 65 28 70 43 78 29 3b 0a  ite3_free(pCx);.
6ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
6ee0: 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70  ll cursors excep
6ef0: 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73 6f  t for VTab curso
6f00: 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  rs that are curr
6f10: 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e  ently.** in use.
6f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6f30: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
6f40: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
6f50: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6f60: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
6f70: 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  sr==0 ) return;.
6f80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6f90: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
6fa0: 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20     Cursor *pC = 
6fb0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
6fc0: 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d 3e   if( pC && (!p->
6fd0: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20  inVtabMethod || 
6fe0: 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  !pC->pVtabCursor
6ff0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7000: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
7010: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70  (p, pC);.      p
7020: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
7030: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7040: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
7050: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
7060: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
7070: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
7080: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
7090: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
70a0: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
70b0: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
70c0: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
70d0: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
70e0: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
70f0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
7100: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
7110: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
7120: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  up(Vdbe *p){.  i
7130: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
7140: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c  Stack ){.    rel
7150: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
7160: 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e  aStack, 1 + (p->
7170: 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b  pTos - p->aStack
7180: 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20  ));.    p->pTos 
7190: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d  = &p->aStack[-1]
71a0: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
71b0: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
71c0: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 72  iveVtabs(p);.  r
71d0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
71e0: 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
71f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46  ;.  sqlite3VdbeF
7200: 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69  ifoClear(&p->sFi
7210: 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f  fo);.  if( p->co
7220: 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20  ntextStack ){.  
7230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7240: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b  contextStackTop;
7250: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
7260: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
7270: 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  r(&p->contextSta
7280: 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20  ck[i].sFifo);.  
7290: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
72a0: 66 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53  free(p->contextS
72b0: 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  tack);.  }.  p->
72c0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30  contextStack = 0
72d0: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
72e0: 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  ackDepth = 0;.  
72f0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54  p->contextStackT
7300: 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  op = 0;.  sqlite
7310: 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  3_free(p->zErrMs
7320: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
7330: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
7340: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
7350: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
7360: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
7370: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
7380: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7390: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
73a0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
73b0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
73c0: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
73d0: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
73e0: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
73f0: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
7400: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
7410: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
7420: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
7430: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
7440: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
7450: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
7460: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
7470: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
7480: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
7490: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
74a0: 69 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73  int n;..  releas
74b0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
74c0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
74d0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
74e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
74f0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
7500: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
7510: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
7520: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73  ResColumn = nRes
7530: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
7540: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
7550: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
7560: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e  DbMallocZero(p->
7570: 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
7580: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
7590: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
75a0: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
75b0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c   > 0 ){.    pCol
75c0: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  Name->flags = ME
75d0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c  M_Null;.    pCol
75e0: 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  Name->db = p->db
75f0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b  ;.    pColName++
7600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
7610: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  et the name of t
7620: 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e  he idx'th column
7630: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
7640: 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  by the SQL state
7650: 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d  ment..** zName m
7660: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
7670: 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e   to a nul termin
7680: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  ated string..**.
7690: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73  ** This call mus
76a0: 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20  t be made after 
76b0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
76c0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
76d0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50  )..**.** If N==P
76e0: 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65 61  3_STATIC  it mea
76f0: 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73  ns that zName is
7700: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7710: 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a  constant static.
7720: 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65  ** string and we
7730: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
7740: 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69  he pointer. If i
7750: 74 20 69 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c  t is P3_DYNAMIC,
7760: 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74   then .** the st
7770: 72 69 6e 67 20 69 73 20 66 72 65 65 64 20 75 73  ring is freed us
7780: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
7790: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
77a0: 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74   is finished wit
77b0: 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69  h.** it. Otherwi
77c0: 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a  se, N bytes of z
77d0: 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e  Name are copied.
77e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
77f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64  dbeSetColName(Vd
7800: 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  be *p, int idx, 
7810: 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63  int var, const c
7820: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
7830: 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  N){.  int rc;.  
7840: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
7850: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
7860: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
7870: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
7880: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
7890: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
78a0: 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
78b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65  TE_NOMEM;.  asse
78c0: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
78d0: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
78e0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
78f0: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
7900: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20  Column]);.  if( 
7910: 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c  N==P3_DYNAMIC ||
7920: 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b   N==P3_STATIC ){
7930: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7940: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
7950: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
7960: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
7970: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
7980: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
7990: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
79a0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
79b0: 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49  , zName, N, SQLI
79c0: 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
79d0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20  RANSIENT);.  }. 
79e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
79f0: 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41  OK && N==P3_DYNA
7a00: 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  MIC ){.    pColN
7a10: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43  ame->flags = (pC
7a20: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e  olName->flags&(~
7a30: 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d  MEM_Static))|MEM
7a40: 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  _Dyn;.    pColNa
7a50: 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  me->xDel = 0;.  
7a60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7a70: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
7a80: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
7a90: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
7aa0: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
7ab0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
7ac0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
7ad0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
7ae0: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
7af0: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
7b00: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
7b10: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
7b20: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
7b30: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
7b40: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
7b50: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
7b60: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
7b70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7b80: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
7b90: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
7ba0: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
7bb0: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
7bc0: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
7bd0: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
7be0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
7bf0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7c00: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
7c10: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  Xcommit = 0;..  
7c20: 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
7c30: 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
7c40: 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
7c50: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
7c60: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
7c70: 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
7c80: 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
7c90: 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
7ca0: 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
7cb0: 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
7cc0: 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
7cd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7ce0: 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
7cf0: 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
7d00: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
7d10: 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
7d20: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
7d30: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
7d40: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
7d50: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
7d60: 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20 72 63  b, rc);.  if( rc
7d70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7d80: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7d90: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  }..  /* This loo
7da0: 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
7db0: 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
7dc0: 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
7dd0: 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
7de0: 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
7df0: 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
7e00: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
7e10: 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
7e20: 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
7e30: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
7e40: 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
7e50: 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
7e60: 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
7e70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
7e80: 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
7e90: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
7ea0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
7eb0: 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
7ec0: 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
7ed0: 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
7ee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
7ef0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
7f00: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
7f10: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7f20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
7f30: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
7f40: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
7f50: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
7f60: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
7f70: 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ns++;.    }.  }.
7f80: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
7f90: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
7fa0: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
7fb0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
7fc0: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
7fd0: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
7fe0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
7ff0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
8000: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
8010: 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  ;.    rc = db->x
8020: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
8030: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
8040: 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74      sqlite3Safet
8050: 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28  yOn(db);.    if(
8060: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
8070: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
8080: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  RAINT;.    }.  }
8090: 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
80a0: 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
80b0: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
80c0: 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
80d0: 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
80e0: 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
80f0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
8100: 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
8110: 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
8120: 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
8130: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
8140: 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
8150: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
8160: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
8170: 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
8180: 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
8190: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
81a0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
81b0: 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61  memory:.  In tha
81c0: 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a  t case we do.  *
81d0: 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  * not support at
81e0: 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
81f0: 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
8200: 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  the simple case 
8210: 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20  then.  ** too.. 
8220: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72   */.  if( 0==str
8230: 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  len(sqlite3Btree
8240: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
8250: 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20  aDb[0].pBt)) || 
8260: 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20  nTrans<=1 ){.   
8270: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
8280: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
8290: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
82a0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
82b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
82c0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
82d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
82e0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
82f0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
8300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8310: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
8320: 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
8330: 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
8340: 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
8350: 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
8360: 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
8370: 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
8380: 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
8390: 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
83a0: 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
83b0: 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
83c0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
83d0: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
83e0: 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
83f0: 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
8400: 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
8410: 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
8420: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
8430: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
8440: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8450: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
8460: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
8470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
8480: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8490: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
84a0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
84b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
84c0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
84d0: 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20  Two(pBt);.      
84e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
84f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
8510: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
8520: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
8530: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
8540: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
8550: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
8560: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
8570: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
8580: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
8590: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
85a0: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
85b0: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
85c0: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
85d0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
85e0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
85f0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
8600: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
8610: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
8620: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
8630: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
8640: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
8650: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
8660: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
8670: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
8680: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
8690: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
86a0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
86b0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
86c0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
86d0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
86e0: 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  et = 0;..    /* 
86f0: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
8700: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
8710: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
8720: 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a      u32 random;.
8730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8740: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8750: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
8760: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64  ness(sizeof(rand
8770: 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20  om), &random);. 
8780: 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73       zMaster = s
8790: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
87a0: 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a  , "%s-mj%08X", z
87b0: 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d  MainFile, random
87c0: 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20  &0x7fffffff);.  
87d0: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
87e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
87f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
8810: 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 41 63  ile( sqlite3OsAc
8820: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
8830: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
8840: 53 5f 45 58 49 53 54 53 29 20 29 3b 0a 0a 20 20  S_EXISTS) );..  
8850: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
8860: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
8870: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8880: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
8890: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
88a0: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
88b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
88c0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
88d0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
88e0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
88f0: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
8900: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
8910: 41 4c 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20  AL, 0.    );.   
8920: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8930: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
8940: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8950: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8960: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
8970: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
8980: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
8990: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
89a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
89b0: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
89c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
89d0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
89e0: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
89f0: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
8a00: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
8a10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8a20: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
8a30: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
8a40: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
8a50: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
8a60: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
8a70: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
8a80: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
8a90: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
8aa0: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
8ab0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
8ac0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
8ad0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
8ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
8af0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8b00: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8b10: 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  ( i==1 ) continu
8b20: 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  e;   /* Ignore t
8b30: 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
8b40: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
8b50: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
8b60: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
8b70: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
8b80: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
8b90: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
8ba0: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
8bb0: 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30   if( zFile[0]==0
8bc0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
8bd0: 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a   Ignore :memory:
8be0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
8bf0: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
8c00: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
8c10: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
8c20: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
8c30: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
8c40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8c50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8c60: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
8c70: 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46  zFile, strlen(zF
8c80: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
8c90: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
8ca0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  += strlen(zFile)
8cb0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
8cc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8cd0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8ce0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
8cf0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
8d00: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
8d10: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
8d20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
8d30: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
8d40: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
8d50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
8d60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8d70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
8d80: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8d90: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
8da0: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
8db0: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
8dc0: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
8dd0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
8de0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69  .    */.    zMai
8df0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
8e00: 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64  treeGetDirname(d
8e10: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
8e20: 20 20 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e      if( (needSyn
8e30: 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28  c .     && (0==(
8e40: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
8e50: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
8e60: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
8e70: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
8e80: 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73 71  ).     && (rc=sq
8e90: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
8ea0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
8eb0: 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54  _NORMAL))!=SQLIT
8ec0: 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73  E_OK) ){.      s
8ed0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
8ee0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
8ef0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
8f00: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
8f10: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8f20: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
8f30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8f40: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
8f50: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
8f60: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
8f70: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
8f80: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
8f90: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
8fa0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8fb0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
8fc0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
8fd0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
8fe0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
8ff0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
9000: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
9010: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
9020: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
9030: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
9040: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
9050: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9060: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9070: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
9080: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
9090: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
90a0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
90b0: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
90c0: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
90d0: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
90e0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
90f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9100: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
9110: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
9120: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
9130: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
9140: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  e failure occure
9150: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9160: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
9170: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
9180: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
9190: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
91a0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
91b0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
91c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
91d0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
91e0: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
91f0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
9200: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
9210: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
9220: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
9230: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9240: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9250: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
9260: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
9270: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
9280: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9290: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
92a0: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
92b0: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
92c0: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
92d0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
92e0: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
92f0: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
9300: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
9310: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
9320: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
9330: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9340: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
9350: 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
9360: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
9370: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
9380: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
9390: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
93a0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
93b0: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
93c0: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
93d0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
93e0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
93f0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
9400: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
9410: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9420: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
9430: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
9440: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
9450: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
9460: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
9470: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
9480: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
9490: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
94a0: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
94b0: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
94c0: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
94d0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
94e0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
94f0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
9500: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
9510: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
9520: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
9530: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
9540: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
9550: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
9560: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
9570: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
9580: 6f 72 73 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  ors();.    for(i
9590: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
95a0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
95b0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
95c0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
95d0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
95e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
95f0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
9600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9610: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
9620: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
9630: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
9640: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
9650: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
9660: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
9670: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9680: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
9690: 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62  qlite3.activeVdb
96a0: 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61  eCnt count varia
96b0: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
96c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
96d0: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
96e0: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
96f0: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
9700: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
9710: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
9720: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
9730: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
9740: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
9750: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
9760: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
9770: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
9780: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
9790: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
97a0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
97b0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
97c0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
97d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
97e0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
97f0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
9800: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
9810: 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  nt = 0;.  p = db
9820: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
9830: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
9840: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9850: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
9860: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
9870: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
9880: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
9890: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
98a0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
98b0: 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
98c0: 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
98d0: 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
98e0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  ../*.** For ever
98f0: 79 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20  y Btree that in 
9900: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9910: 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a  ion db which .**
9920: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
9930: 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e  ed, "trip" or in
9940: 76 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75  validate each cu
9950: 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20  rsor in.** that 
9960: 42 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65  Btree might have
9970: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73   been modified s
9980: 6f 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  o that the curso
9990: 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62  r.** can never b
99a0: 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54  e used again.  T
99b0: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
99c0: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20   a rollback.*** 
99d0: 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65  occurs.  We have
99e0: 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65   to trip all the
99f0: 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20   other cursors, 
9a00: 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66  even.** cursor f
9a10: 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e  rom other VMs in
9a20: 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62   different datab
9a30: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c  ase connections,
9a40: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65  .** so that none
9a50: 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20   of them try to 
9a60: 75 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20  use the data at 
9a70: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65  which they.** we
9a80: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20  re pointing and 
9a90: 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61  which now may ha
9aa0: 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  ve been changed 
9ab0: 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f  due.** to the ro
9ac0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65  llback..**.** Re
9ad0: 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f  member that a ro
9ae0: 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74  llback can delet
9af0: 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74  e tables complet
9b00: 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72  e and.** reorder
9b10: 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20   rootpages.  So 
9b20: 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
9b30: 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76  ient just to sav
9b40: 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f  e.** the state o
9b50: 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57  f the cursor.  W
9b60: 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69  e have to invali
9b70: 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a  date the cursor.
9b80: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  ** so that it is
9b90: 20 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69   never used agai
9ba0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
9bb0: 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73  d invalidateCurs
9bc0: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
9bd0: 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ees(sqlite3 *db)
9be0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
9bf0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
9c00: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
9c10: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
9c20: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
9c30: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
9c40: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
9c50: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
9c60: 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
9c70: 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29  p, SQLITE_ABORT)
9c80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9c90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9ca0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
9cb0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
9cc0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
9cd0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
9ce0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
9cf0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
9d00: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
9d10: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
9d20: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
9d30: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
9d40: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
9d50: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
9d60: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
9d70: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
9d80: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
9d90: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
9da0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
9db0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
9dc0: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
9dd0: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
9de0: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
9df0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
9e00: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
9e10: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
9e20: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
9e30: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
9e40: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
9e50: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
9e60: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
9e70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
9e80: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
9e90: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
9ea0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
9eb0: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
9ec0: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
9ed0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
9ee0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9ef0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
9f00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9f10: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
9f20: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74   int (*xFunc)(Bt
9f30: 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20  ree *pBt) = 0;  
9f40: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
9f50: 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65  all on each btre
9f60: 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69  e backend */.  i
9f70: 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
9f80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
9f90: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
9fa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
9fb0: 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54  IOERR */..  /* T
9fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
9fd0: 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
9fe0: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
9ff0: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
a000: 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
a010: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
a020: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
a030: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
a040: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
a050: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
a060: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
a070: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
a080: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a090: 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
a0a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
a0b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
a0c0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
a0d0: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
a0e0: 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
a0f0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
a100: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
a110: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
a120: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
a130: 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
a140: 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
a150: 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
a160: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
a170: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
a180: 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
a190: 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
a1a0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
a1b0: 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
a1c0: 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
a1d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
a1e0: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
a1f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a200: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
a210: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
a220: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
a230: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
a240: 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
a250: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
a260: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
a270: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a280: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
a290: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
a2a0: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
a2b0: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
a2c0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
a2d0: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
a2e0: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
a2f0: 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
a300: 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
a310: 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
a320: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
a330: 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
a340: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
a350: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
a360: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45  BtreeMutexArrayE
a370: 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29  nter(&p->aMutex)
a380: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
a390: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
a3a0: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
a3b0: 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
a3c0: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
a3d0: 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
a3e0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a3f0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
a400: 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
a410: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
a420: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
a430: 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
a440: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
a450: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
a460: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
a470: 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63  loop does static
a480: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65   analysis of the
a490: 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77 68   query to see wh
a4a0: 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ich of the.     
a4b0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
a4c0: 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20 69  ree categories i
a4d0: 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20  t falls into:.  
a4e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
a4f0: 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20      Read-only.  
a500: 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79      **     Query
a510: 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20   with statement 
a520: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
a530: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 6f       Query witho
a540: 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ut statement jou
a550: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rnal.      **.  
a560: 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20      ** We could 
a570: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72  do something mor
a580: 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74  e elegant than t
a590: 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  his static analy
a5a0: 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20  sis (i.e..      
a5b0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79 70  ** store the typ
a5c0: 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70 61  e of query as pa
a5d0: 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69  rt of the compli
a5e0: 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75  ation phase), bu
a5f0: 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  t .      ** hand
a600: 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  ling malloc() or
a610: 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61   IO failure is a
a620: 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
a630: 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20  edge case so .  
a640: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70      ** this is p
a650: 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20  robably easier. 
a660: 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61  Todo: Might be a
a670: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
a680: 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a   reduce .      *
a690: 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65  * code size a ve
a6a0: 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20  ry small amount 
a6b0: 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20  though....      
a6c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74  */.      int not
a6d0: 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  ReadOnly = 0;.  
a6e0: 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d      int isStatem
a6f0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ent = 0;.      a
a700: 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20  ssert(p->aOp || 
a710: 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20  p->nOp==0);.    
a720: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a730: 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nOp; i++){ .    
a740: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61      switch( p->a
a750: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a  Op[i].opcode ){.
a760: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
a770: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  P_Transaction:. 
a780: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65             notRe
a790: 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70  adOnly |= p->aOp
a7a0: 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20  [i].p2;.        
a7b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a7c0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
a7d0: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
a7e0: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
a7f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
a800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a810: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20  }.      }..   . 
a820: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
a830: 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
a840: 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e  ly, we need do n
a850: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c  o rollback at al
a860: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
a870: 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77      ** proceed w
a880: 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
a890: 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20  handling..      
a8a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74  */.      if( not
a8b0: 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  ReadOnly || mrc!
a8c0: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
a8d0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
a8e0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49   p->rc==SQLITE_I
a8f0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20  OERR_BLOCKED && 
a900: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
a910: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
a920: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a930: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
a940: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
a950: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
a960: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72    } else if( (mr
a970: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a980: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
a990: 55 4c 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d  ULL) && isStatem
a9a0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a9b0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a9c0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a9d0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
a9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
a9f0: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
aa00: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
aa10: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
aa20: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
aa30: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
aa40: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
aa50: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
aa60: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
aa70: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
aa80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
aa90: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
aaa0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
aab0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
aac0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
aad0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
aae0: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
aaf0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
ab00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ab10: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
ab20: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
ab30: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
ab40: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
ab50: 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74 68   active vdbe, th
ab60: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  en.    ** we do 
ab70: 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
ab80: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
ab90: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
aba0: 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
abb0: 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
abc0: 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
abd0: 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
abe0: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
abf0: 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
ac00: 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65 64  bove has occured
ac10: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
ac20: 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
ac30: 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64   && db->activeVd
ac40: 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  beCnt==1 ){.    
ac50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ac60: 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
ac70: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
ac80: 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
ac90: 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
aca0: 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
acb0: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
acc0: 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20  e, and the vdbe 
acd0: 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20  program was .   
ace0: 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66       ** successf
acf0: 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ul or hit an 'OR
ad00: 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
ad10: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  t. This means a 
ad20: 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
ad30: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ** is required..
ad40: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ad50: 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65     int rc = vdbe
ad60: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
ad70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ad80: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
ad90: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
ada0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
adb0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
adc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
add0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
ade0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
adf0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ae00: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
ae10: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
ae20: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
ae30: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
ae40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ae50: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
ae60: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
ae70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ae80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae90: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
aea0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
aeb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
aec0: 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  xFunc ){.      i
aed0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
aee0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
aef0: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
af00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
af10: 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
af20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
af30: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
af40: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20  eeCommitStmt;.  
af50: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
af60: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
af70: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
af80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75  t ){.        xFu
af90: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
afa0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
afb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
afc0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
afd0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
afe0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
aff0: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
b000: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
b010: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
b020: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
b030: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
b040: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
b050: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
b060: 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  one of sqlite3Bt
b070: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20  reeRollbackStmt 
b080: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
b090: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
b0a0: 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f  . Call it once o
b0b0: 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20  n each backend. 
b0c0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
b0d0: 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  rs.    ** and th
b0e0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
b0f0: 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b   still SQLITE_OK
b100: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
b110: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
b120: 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61  .    ** error va
b130: 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
b140: 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c  assert(!xFunc ||
b150: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
b160: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
b170: 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46  Stmt ||.      xF
b180: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
b190: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20  eRollbackStmt.  
b1a0: 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30    );.    for(i=0
b1b0: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
b1c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
b1d0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
b1e0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
b1f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
b200: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
b210: 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e         rc = xFun
b220: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  c(pBt);.        
b230: 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63  if( rc && (p->rc
b240: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
b250: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->rc==SQLITE_CON
b260: 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20  STRAINT) ){.    
b270: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
b280: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b290: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
b2a0: 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20  >zErrMsg, 0);.  
b2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b2c0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
b2d0: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
b2e0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
b2f0: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
b300: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f  statement was co
b310: 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a  mmitted, .    **
b320: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
b330: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
b340: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
b350: 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63  geCntOn && p->pc
b360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
b370: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
b380: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
b390: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
b3a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
b3b0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
b3c0: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
b3d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b3e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
b3f0: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
b400: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
b410: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
b420: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
b430: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
b440: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
b450: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
b460: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
b470: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
b480: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
b490: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
b4a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
b4b0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
b4c0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
b4d0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
b4e0: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
b4f0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
b500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
b510: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
b520: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
b530: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
b540: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
b550: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
b560: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
b570: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
b580: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
b590: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
b5a0: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
b5b0: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
b5c0: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20  VdbeCnt--;.  }. 
b5d0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b5e0: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
b5f0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b600: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
b610: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b620: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b630: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b640: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
b650: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72  dbeCnt(db);..  r
b660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b670: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
b680: 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
b690: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
b6a0: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
b6b0: 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
b6c0: 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
b6d0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
b6e0: 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
b6f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
b700: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
b710: 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
b720: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
b730: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
b740: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
b750: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
b760: 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
b770: 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
b780: 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
b790: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
b7a0: 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
b7b0: 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
b7c0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
b7d0: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
b7e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
b7f0: 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
b800: 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
b810: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
b820: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
b830: 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
b840: 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
b850: 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
b860: 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
b870: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
b880: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
b890: 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
b8a0: 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
b8b0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
b8c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
b8d0: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
b8e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
b8f0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
b900: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
b910: 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
b920: 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
b930: 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
b940: 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
b950: 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
b960: 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
b970: 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
b980: 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
b990: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 61    */.  sqlite3Sa
b9a0: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71  fetyOn(db);.  sq
b9b0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
b9c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  ;.  sqlite3Safet
b9d0: 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  yOff(db);..  /* 
b9e0: 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
b9f0: 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
ba00: 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
ba10: 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
ba20: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
ba30: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
ba40: 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
ba50: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
ba60: 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
ba70: 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
ba80: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
ba90: 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
baa0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
bab0: 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
bac0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
bad0: 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
bae0: 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
baf0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
bb00: 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
bb10: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
bb20: 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73     if( p->zErrMs
bb30: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
bb40: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
bb50: 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
bb60: 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
bb70: 2c 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a  ,sqlite3_free);.
bb80: 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
bb90: 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
bba0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
bbb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
bbc0: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
bbd0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
bbe0: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
bbf0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
bc00: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
bc10: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
bc20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
bc30: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
bc40: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
bc50: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
bc60: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
bc70: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
bc80: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
bc90: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
bca0: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
bcb0: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
bcc0: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
bcd0: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
bce0: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
bcf0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
bd00: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
bd10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
bd20: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
bd30: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
bd40: 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
bd50: 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
bd60: 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69  QLITE_UTF8, sqli
bd70: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 70  te3_free);.    p
bd80: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
bd90: 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
bda0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
bdb0: 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
bdc0: 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
bdd0: 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
bde0: 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
bdf0: 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
be00: 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  run..  */.  asse
be10: 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e  rt( p->pTos<&p->
be20: 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30  aStack[p->pc<0?0
be30: 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61  :p->pc] || !p->a
be40: 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20  Stack );.#ifdef 
be50: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
be60: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
be70: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
be80: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
be90: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
bea0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
beb0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
bec0: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
bed0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
bee0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
bef0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
bf00: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
bf10: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
bf20: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
bf30: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
bf40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
bf50: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
bf60: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
bf70: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
bf80: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
bf90: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
bfa0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
bfb0: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
bfc0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
bfd0: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
bfe0: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
bff0: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
c000: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
c010: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
c020: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
c030: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
c040: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
c050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c060: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
c070: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
c080: 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30    p->aborted = 0
c090: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
c0a0: 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
c0b0: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
c0c0: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
c0d0: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
c0e0: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
c0f0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
c100: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
c110: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
c120: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
c130: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
c140: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
c150: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
c160: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
c170: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c180: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
c190: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
c1a0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
c1b0: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
c1c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
c1d0: 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
c1e0: 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
c1f0: 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
c200: 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c );.  }else if(
c210: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
c220: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
c230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c240: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
c250: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
c260: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
c280: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
c290: 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
c2a0: 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
c2b0: 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
c2c0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
c2d0: 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
c2e0: 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
c2f0: 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
c300: 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
c310: 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
c320: 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
c330: 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
c340: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
c350: 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
c360: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c370: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
c380: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
c390: 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
c3a0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c3b0: 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
c3c0: 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
c3d0: 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
c3e0: 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
c3f0: 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
c400: 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
c410: 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26  (mask&(1<<i))) &
c420: 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
c430: 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
c440: 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
c450: 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
c460: 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
c470: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
c480: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
c490: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
c4a0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
c4b0: 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
c4c0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
c4d0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
c4e0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
c4f0: 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75  return;.  Cleanu
c500: 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  p(p);.  if( p->p
c510: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
c520: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
c530: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
c540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c550: 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
c560: 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65      p->db->pVdbe
c570: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
c580: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
c590: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
c5a0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
c5b0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  v;.  }.  if( p->
c5c0: 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70  aOp ){.    Op *p
c5d0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
c5e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
c5f0: 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Op; i++, pOp++){
c600: 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 70 4f  .      freeP3(pO
c610: 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p3type, pOp->
c620: 70 33 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p3.p);.#ifdef SQ
c630: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
c640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f   sqlite3_free(pO
c650: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
c660: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
c670: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c680: 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20  (p->aOp);.  }.  
c690: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c6a0: 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
c6b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c6c0: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
c6d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c6e0: 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61  aStack);.  relea
c6f0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
c700: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
c710: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
c720: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
c730: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20  (p->aColName);. 
c740: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
c750: 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67  >zSql);.  p->mag
c760: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
c770: 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  DEAD;.  sqlite3_
c780: 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(p);.}../*.*
c790: 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
c7a0: 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
c7b0: 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
c7c0: 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
c7d0: 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
c7e0: 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ow.  Return an e
c7f0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e  rror code.  If n
c800: 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64  o MoveTo is pend
c810: 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  ing, this.** rou
c820: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e  tine does nothin
c830: 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  g and returns SQ
c840: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
c850: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
c860: 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a  rMoveto(Cursor *
c870: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
c880: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
c890: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
c8a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
c8b0: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
c8c0: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
c8d0: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
c8e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
c8f0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
c900: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
c910: 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c  veto(p->pCursor,
c920: 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
c930: 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
c940: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
c950: 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70  rn rc;.    *p->p
c960: 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20  IncrKey = 0;.   
c970: 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20   p->lastRowid = 
c980: 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65  keyToInt(p->move
c990: 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70  toTarget);.    p
c9a0: 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
c9b0: 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28   res==0;.    if(
c9c0: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
c9d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
c9e0: 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72  eNext(p->pCursor
c9f0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69  , &res);.      i
ca00: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ca10: 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  c;.    }.#ifdef 
ca20: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
ca30: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
ca40: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
ca50: 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
ca60: 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
ca70: 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
ca80: 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a  ACHE_STALE;.  }.
ca90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
caa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
cab0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
cac0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
cad0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
cae0: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
caf0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
cb00: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
cb10: 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20  SerialRead().** 
cb20: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
cb30: 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
cb40: 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65  3VdbeSerialWrite
cb50: 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
cb60: 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
cb70: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
cb80: 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
cb90: 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
cba0: 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
cbb0: 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
cbc0: 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
cbd0: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
cbe0: 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
cbf0: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
cc00: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
cc10: 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
cc20: 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
cc30: 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
cc40: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
cc50: 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
cc60: 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
cc70: 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
cc80: 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
cc90: 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
cca0: 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
ccb0: 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
ccc0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
ccd0: 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
cce0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
ccf0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
cd00: 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
cd10: 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
cd20: 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
cd30: 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
cd40: 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
cd50: 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
cd60: 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
cd70: 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
cd80: 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
cd90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
cda0: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
cdb0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
cdc0: 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
cdd0: 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
cde0: 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
cdf0: 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
ce00: 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
ce20: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ce30: 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
ce40: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
ce70: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
cea0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
ceb0: 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
ced0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
cee0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
cef0: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
cf00: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
cf10: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
cf20: 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
cf50: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
cf60: 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
cf70: 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
cf80: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
cf90: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfb0: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
cfc0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
cfd0: 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
d000: 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
d030: 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
d040: 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d070: 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
d080: 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
d0b0: 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
d0c0: 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
d0d0: 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
d0e0: 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
d0f0: 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
d100: 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
d110: 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
d120: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
d130: 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
d140: 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
d150: 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
d160: 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
d170: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
d180: 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
d190: 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
d1a0: 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
d1b0: 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
d1c0: 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
d1d0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
d1e0: 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
d1f0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d200: 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
d210: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
d220: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
d230: 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
d240: 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
d250: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
d260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d270: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
d280: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
d290: 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
d2a0: 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
d2b0: 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
d2c0: 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
d2d0: 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
d2e0: 30 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31 29  0001000)<<32)-1)
d2f0: 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
d300: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
d310: 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
d320: 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
d330: 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
d340: 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d  eturn 8+i;.    }
d350: 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d  .    u = i<0 ? -
d360: 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75  i : i;.    if( u
d370: 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
d380: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
d390: 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
d3a0: 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
d3b0: 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
d3c0: 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
d3d0: 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
d3e0: 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
d3f0: 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
d400: 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
d410: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
d420: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
d430: 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
d440: 73 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d 45  ssert( flags&(ME
d450: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
d460: 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e  );.  n = pMem->n
d470: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
d480: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
d490: 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a  n += pMem->u.i;.
d4a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e    }.  assert( n>
d4b0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
d4c0: 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
d4d0: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
d4e0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
d4f0: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
d500: 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
d510: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
d520: 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
d530: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
d540: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d550: 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
d560: 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
d570: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
d580: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
d590: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
d5a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
d5b0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
d5c0: 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
d5d0: 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
d5e0: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
d5f0: 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
d600: 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
d610: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
d620: 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
d630: 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
d640: 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
d650: 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
d660: 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
d670: 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
d680: 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
d690: 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
d6a0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
d6b0: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
d6c0: 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
d6d0: 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
d6e0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
d6f0: 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
d700: 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
d710: 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
d720: 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
d730: 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
d740: 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
d750: 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
d760: 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
d770: 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
d780: 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
d790: 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
d7a0: 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
d7b0: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
d7c0: 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
d7d0: 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
d7e0: 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
d7f0: 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
d800: 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
d810: 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
d820: 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
d830: 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
d840: 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
d850: 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
d860: 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
d870: 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
d880: 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
d890: 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
d8a0: 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
d8b0: 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
d8c0: 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
d8d0: 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
d8e0: 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
d8f0: 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
d900: 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
d910: 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
d920: 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
d930: 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
d940: 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
d950: 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
d960: 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
d970: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
d980: 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
d990: 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
d9a0: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
d9b0: 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
d9c0: 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
d9d0: 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
d9e0: 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
d9f0: 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
da00: 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
da10: 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
da20: 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
da30: 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
da40: 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
da50: 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
da60: 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
da70: 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
da80: 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
da90: 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
daa0: 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
dab0: 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
dac0: 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
dad0: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
dae0: 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
daf0: 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
db00: 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
db10: 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
db20: 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
db30: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
db40: 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
db50: 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
db60: 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
db70: 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
db80: 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
db90: 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
dba0: 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
dbb0: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
dbc0: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
dbd0: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
dbe0: 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
dbf0: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
dc00: 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
dc10: 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
dc20: 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
dc30: 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
dc40: 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
dc50: 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
dc60: 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
dc70: 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
dc80: 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
dc90: 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
dca0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
dcb0: 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
dcc0: 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
dcd0: 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
dce0: 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
dcf0: 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
dd00: 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
dd10: 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
dd20: 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
dd30: 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
dd40: 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
dd50: 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
dd60: 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
dd70: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
dd80: 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
dd90: 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
dda0: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
ddb0: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
ddc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
ddd0: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
dde0: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
ddf0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
de00: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
de10: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
de20: 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
de30: 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
de40: 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
de50: 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
de60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
de70: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
de80: 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
de90: 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
dea0: 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75  t in buf[].  nBu
deb0: 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  f must always be
dec0: 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  .** large enough
ded0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
dee0: 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65  ire field.  Exce
def0: 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64  pt, if the field
df00: 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69   is.** a blob wi
df10: 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  th a zero-filled
df20: 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b   tail, then buf[
df30: 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20  ] might be just 
df40: 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a  the right.** siz
df50: 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74  e to hold everyt
df60: 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20  hing except for 
df70: 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
df80: 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a  tail.  If buf[].
df90: 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65  ** is only big e
dfa0: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
dfb0: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69  e non-zero prefi
dfc0: 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  x, then only wri
dfd0: 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69  te that.** prefi
dfe0: 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42  x into buf[].  B
dff0: 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c  ut if buf[] is l
e000: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
e010: 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20  old both the.** 
e020: 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74  prefix and the t
e030: 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74  ail then write t
e040: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65  he prefix and se
e050: 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c  t the tail to al
e060: 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a  l.** zeros..**.*
e070: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
e080: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
e090: 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
e0a0: 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
e0b0: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
e0c0: 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
e0d0: 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
e0e0: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
e0f0: 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
e100: 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
e110: 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
e120: 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73  buf[]..*/ .int s
e130: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e140: 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74  Put(u8 *buf, int
e150: 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   nBuf, Mem *pMem
e160: 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
e170: 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c  t){.  u32 serial
e180: 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
e190: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d  dbeSerialType(pM
e1a0: 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  em, file_format)
e1b0: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20  ;.  int len;..  
e1c0: 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
e1d0: 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
e1e0: 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
e1f0: 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
e200: 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69      u64 v;.    i
e210: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  nt i;.    if( se
e220: 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
e230: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
e240: 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
e250: 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
e260: 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
e270: 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
e280: 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
e290: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
e2a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e2b0: 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
e2c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
e2d0: 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
e2e0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
e2f0: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
e300: 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42   assert( len<=nB
e310: 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  uf );.    while(
e320: 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
e330: 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b  f[i] = (v&0xFF);
e340: 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
e350: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
e360: 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
e370: 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
e380: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
e390: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
e3a0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
e3b0: 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
e3c0: 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
e3d0: 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20  >u.i:0).        
e3e0: 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56       == sqlite3V
e3f0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
e400: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
e410: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
e420: 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
e430: 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
e440: 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
e450: 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
e460: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
e470: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
e480: 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
e490: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Mem->u.i;.      
e4a0: 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a  if( len>nBuf ){.
e4b0: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42          len = nB
e4c0: 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  uf;.      }.    
e4d0: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d    memset(&buf[pM
e4e0: 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70  em->n], 0, len-p
e4f0: 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20  Mem->n);.    }. 
e500: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
e510: 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
e520: 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
e530: 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
e540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
e550: 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
e560: 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
e570: 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
e580: 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
e590: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
e5a0: 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
e5b0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
e5c0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
e5d0: 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ad..*/ .int sqli
e5e0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
e5f0: 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
e600: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
e610: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
e620: 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
e630: 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
e640: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
e650: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
e660: 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
e670: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
e6a0: 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
e6b0: 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
e6c0: 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
e6d0: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
e6e0: 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
e6f0: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
e700: 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
e710: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
e720: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
e730: 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
e740: 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
e750: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e760: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
e770: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e780: 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
e790: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e7a0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
e7b0: 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63  >u.i = (signed c
e7c0: 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20  har)buf[0];.    
e7d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e7e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
e7f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
e800: 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
e810: 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
e820: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
e830: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
e840: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
e850: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
e860: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e870: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e880: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
e890: 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
e8a0: 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
e8b0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e8c0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
e8d0: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
e8e0: 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
e8f0: 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
e900: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
e910: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
e930: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
e940: 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
e950: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
e960: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e970: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
e980: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
e990: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
e9a0: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
e9b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e9c0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
e9d0: 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
e9e0: 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
e9f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
ea00: 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
ea10: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
ea20: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
ea30: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
ea40: 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
ea50: 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
ea60: 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
ea70: 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
ea80: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
ea90: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
eaa0: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
eab0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
eac0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
ead0: 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
eae0: 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
eaf0: 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
eb00: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
eb10: 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
eb20: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
eb30: 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
eb40: 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
eb50: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
eb60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
eb70: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
eb80: 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
eb90: 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
eba0: 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
ebb0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
ebc0: 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
ebd0: 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
ebe0: 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
ebf0: 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
ec00: 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
ec10: 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e  s.      ** defin
ec20: 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
ec30: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
ec40: 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
ec50: 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65  mixed.      ** e
ec60: 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndian..      */.
ec70: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
ec80: 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
ec90: 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
eca0: 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  2;.      static 
ecb0: 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
ecc0: 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34  = 1.0;.      u64
ecd0: 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20   t2 = t1;.      
ece0: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
ecf0: 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20  loat(t2);.      
ed00: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
ed10: 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
ed20: 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
ed30: 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
ed40: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  0 );.#endif..   
ed50: 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c     x = (buf[0]<<
ed60: 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
ed70: 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
ed80: 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
ed90: 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34   y = (buf[4]<<24
eda0: 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29  ) | (buf[5]<<16)
edb0: 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c   | (buf[6]<<8) |
edc0: 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78   buf[7];.      x
edd0: 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
ede0: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
edf0: 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
ee00: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
ee10: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
ee20: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ee30: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
ee40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
ee50: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
ee60: 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
ee70: 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  em->r)==8 );.   
ee80: 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
ee90: 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
eea0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d        memcpy(&pM
eeb0: 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
eec0: 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70  f(x));.        p
eed0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
eee0: 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
eef0: 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
ef00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
ef10: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
ef20: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
ef30: 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
ef40: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
ef50: 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
ef60: 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
ef70: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
ef80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
ef90: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
efa0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lt: {.      int 
efb0: 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  len = (serial_ty
efc0: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
efd0: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
efe0: 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
eff0: 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
f000: 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
f010: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
f020: 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a  al_type&0x01 ){.
f030: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
f040: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20  ags = MEM_Str | 
f050: 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
f060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f070: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f080: 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68  M_Blob | MEM_Eph
f090: 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
f0a0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
f0b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f0c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
f0d0: 20 68 65 61 64 65 72 20 6f 66 20 61 20 72 65 63   header of a rec
f0e0: 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ord consists of 
f0f0: 61 20 73 65 71 75 65 6e 63 65 20 76 61 72 69 61  a sequence varia
f100: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
f110: 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20 69 6e  ers..** These in
f120: 74 65 67 65 72 73 20 61 72 65 20 61 6c 6d 6f 73  tegers are almos
f130: 74 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c 20 61  t always small a
f140: 6e 64 20 61 72 65 20 65 6e 63 6f 64 65 64 20 61  nd are encoded a
f150: 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  s a single byte.
f160: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
f170: 67 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 64  g macro takes ad
f180: 76 61 6e 74 61 67 65 20 74 68 69 73 20 66 61 63  vantage this fac
f190: 74 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 66  t to provide a f
f1a0: 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20 6f 66  ast decode.** of
f1b0: 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 69 6e   the integers in
f1c0: 20 61 20 72 65 63 6f 72 64 20 68 65 61 64 65 72   a record header
f1d0: 2e 20 20 49 74 20 69 73 20 66 61 73 74 65 72 20  .  It is faster 
f1e0: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
f1f0: 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  ase.** where the
f200: 20 69 6e 74 65 67 65 72 20 69 73 20 61 20 73 69   integer is a si
f210: 6e 67 6c 65 20 62 79 74 65 2e 20 20 49 74 20 69  ngle byte.  It i
f220: 73 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  s a little slowe
f230: 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e  r when the.** in
f240: 74 65 67 65 72 20 69 73 20 74 77 6f 20 6f 72 20  teger is two or 
f250: 6d 6f 72 65 20 62 79 74 65 73 2e 20 20 42 75 74  more bytes.  But
f260: 20 6f 76 65 72 61 6c 6c 20 69 74 20 69 73 20 66   overall it is f
f270: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  aster..**.** The
f280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
f290: 73 73 69 6f 6e 73 20 61 72 65 20 65 71 75 69 76  ssions are equiv
f2a0: 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alent:.**.**    
f2b0: 20 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   x = sqlite3GetV
f2c0: 61 72 69 6e 74 33 32 28 20 41 2c 20 26 42 20 29  arint32( A, &B )
f2d0: 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20  ;.**.**     x = 
f2e0: 47 65 74 56 61 72 69 6e 74 28 20 41 2c 20 42 20  GetVarint( A, B 
f2f0: 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65  );.**.*/.#define
f300: 20 47 65 74 56 61 72 69 6e 74 28 41 2c 42 29 20   GetVarint(A,B) 
f310: 20 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d 30 78   ((B = *(A))<=0x
f320: 37 66 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33  7f ? 1 : sqlite3
f330: 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 20 26  GetVarint32(A, &
f340: 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  B))../*.** This 
f350: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
f360: 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
f370: 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
f380: 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 64 20  cords specified 
f390: 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70  by .** {nKey1, p
f3a0: 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79 32  Key1} and {nKey2
f3b0: 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72 6e  , pKey2}, return
f3c0: 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c 20  ing a negative, 
f3d0: 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
f3e0: 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b  ive integer if {
f3f0: 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73  nKey1, pKey1} is
f400: 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
f410: 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
f420: 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32 2c  ter than {nKey2,
f430: 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20 4b   pKey2}.  Both K
f440: 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75 73  ey1 and Key2 mus
f450: 74 20 62 65 20 62 79 74 65 20 73 74 72 69 6e 67  t be byte string
f460: 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62 79  s.** composed by
f470: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
f480: 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
f490: 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71   VDBE..*/.int sq
f4a0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
f4b0: 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a  ompare(.  void *
f4c0: 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20  userData,.  int 
f4d0: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
f4e0: 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74  d *pKey1, .  int
f4f0: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
f500: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 4b  id *pKey2.){.  K
f510: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
f520: 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73 65   = (KeyInfo*)use
f530: 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31 2c  rData;.  u32 d1,
f540: 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   d2;          /*
f550: 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
f560: 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
f570: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
f580: 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20 20  2 idx1, idx2;   
f590: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
f5a0: 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
f5b0: 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
f5c0: 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 2c  */.  u32 szHdr1,
f5d0: 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75 6d   szHdr2;  /* Num
f5e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
f5f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
f600: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69  i = 0;.  int nFi
f610: 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  eld;.  int rc = 
f620: 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
f630: 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
f640: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
f650: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
f660: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
f670: 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20 28   char *aKey2 = (
f680: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f690: 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20  har *)pKey2;..  
f6a0: 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20  Mem mem1;.  Mem 
f6b0: 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  mem2;.  mem1.enc
f6c0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
f6d0: 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
f6e0: 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65  eyInfo->db;.  me
f6f0: 6d 32 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m2.enc = pKeyInf
f700: 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 64  o->enc;.  mem2.d
f710: 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
f720: 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 47 65  ;.  .  idx1 = Ge
f730: 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c 20 73  tVarint(aKey1, s
f740: 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
f750: 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20  zHdr1;.  idx2 = 
f760: 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 32 2c  GetVarint(aKey2,
f770: 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20 3d   szHdr2);.  d2 =
f780: 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c   szHdr2;.  nFiel
f790: 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
f7a0: 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
f7b0: 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 64  dx1<szHdr1 && id
f7c0: 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20 20  x2<szHdr2 ){.   
f7d0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
f7e0: 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  1;.    u32 seria
f7f0: 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a  l_type2;..    /*
f800: 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
f810: 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
f820: 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
f830: 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
f840: 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69 6e  idx1 += GetVarin
f850: 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  t( aKey1+idx1, s
f860: 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20  erial_type1 );. 
f870: 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31     if( d1>=nKey1
f880: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53   && sqlite3VdbeS
f890: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
f8a0: 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62  ial_type1)>0 ) b
f8b0: 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b  reak;.    idx2 +
f8c0: 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65  = GetVarint( aKe
f8d0: 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61 6c 5f  y2+idx2, serial_
f8e0: 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69 66 28  type2 );.    if(
f8f0: 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71   d2>=nKey2 && sq
f900: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
f910: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
f920: 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe2)>0 ) break;.
f930: 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
f940: 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
f950: 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
f960: 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
f970: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
f980: 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
f990: 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
f9a0: 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c  );.    d2 += sql
f9b0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
f9c0: 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65  t(&aKey2[d2], se
f9d0: 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d  rial_type2, &mem
f9e0: 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  2);..    /* Do t
f9f0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
fa00: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
fa10: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
fa20: 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c  &mem1, &mem2, i<
fa30: 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
fa40: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
fa50: 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66  ;.    if( mem1.f
fa60: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
fa70: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
fa80: 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20  elease(&mem1);. 
fa90: 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67     if( mem2.flag
faa0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71  s & MEM_Dyn ) sq
fab0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
fac0: 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20  ase(&mem2);.    
fad0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
fae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
faf0: 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
fb00: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65  /* One of the ke
fb10: 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
fb20: 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68  elds, but all th
fb30: 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
fb40: 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77  hat point.  ** w
fb50: 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
fb60: 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69  e incrKey flag i
fb70: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
fb80: 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20   second key is. 
fb90: 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c   ** treated as l
fba0: 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  arger..  */.  if
fbb0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
fbc0: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63  f( pKeyInfo->inc
fbd0: 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  rKey ){.      rc
fbe0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
fbf0: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e   if( !pKeyInfo->
fc00: 70 72 65 66 69 78 49 73 45 71 75 61 6c 20 29 7b  prefixIsEqual ){
fc10: 0a 20 20 20 20 20 20 69 66 28 20 64 31 3c 6e 4b  .      if( d1<nK
fc20: 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ey1 ){.        r
fc30: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 1;.      }el
fc40: 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20  se if( d2<nKey2 
fc50: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
fc60: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
fc70: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b  }.  }else if( pK
fc80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
fc90: 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f  er && i<pKeyInfo
fca0: 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20  ->nField.       
fcb0: 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49          && pKeyI
fcc0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
fcd0: 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d  i] ){.    rc = -
fce0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
fcf0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
fd00: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
fd10: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f  n index entry co
fd20: 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65  mposed using the
fd30: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
fd40: 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61  pcode..** The la
fd50: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  st entry in this
fd60: 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
fd70: 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70  e an integer (sp
fd80: 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e  ecifically.** an
fd90: 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e   integer rowid).
fda0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
fdb0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
fdc0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a  r of bytes in.**
fdd0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a   that integer..*
fde0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
fdf0: 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e  eIdxRowidLen(con
fe00: 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
fe10: 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
fe20: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
fe30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
fe40: 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
fe50: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
fe60: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20   the rowid */.. 
fe70: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
fe80: 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72  t32(aKey, &szHdr
fe90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
fea0: 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a  arint32(&aKey[sz
feb0: 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77  Hdr-1], &typeRow
fec0: 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  id);.  return sq
fed0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
fee0: 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
fef0: 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  );.}.  ../*.** p
ff00: 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
ff10: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
ff20: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
ff30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
ff40: 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
ff50: 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
ff60: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
ff70: 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
ff80: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
ff90: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
ffa0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
ffb0: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
ffc0: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
ffd0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
ffe0: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
fff0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
10000 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
10010 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
10020 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
10030 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
10040 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
10050 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
10060 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
10070 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
10080 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
10090 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
100a0 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
100b0 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
100c0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
100d0 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
100e0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
100f0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
10100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10120 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10130 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
10140 65 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  e(pCur, 0, nCell
10150 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
10160 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
10170 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71  urn rc;.  }.  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 6d 2e 7a 2c 20 26 73 7a 48 64  ((u8*)m.z, &szHd
101a0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
101b0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
101c0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79  .z[szHdr-1], &ty
101d0 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52  peRowid);.  lenR
101e0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
101f0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
10200 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71  typeRowid);.  sq
10210 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
10220 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
10230 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
10240 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
10250 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
10260 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
10270 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
10280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10290 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
102a0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
102b0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
102c0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
102d0 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  nt to against.**
102e0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
102f0 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67  in pKey (of leng
10300 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65  th nKey).  Write
10310 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
10320 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
10330 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
10340 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
10350 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
10360 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
10370 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65  greater than pKe
10380 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
10390 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
103a0 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65  .**.** pKey is e
103b0 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
103c0 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
103d0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
103e0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
103f0 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
10400 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
10410 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
10420 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
10430 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
10440 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  s well..*/.int s
10450 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
10460 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f  Compare(.  Curso
10470 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
10480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
10490 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
104a0 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
104b0 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20   nKey, const u8 
104c0 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
104d0 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  key to compare *
104e0 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
10510 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
10520 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
10530 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
10540 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
10550 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
10560 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65  Cursor;.  int le
10570 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b  nRowid;.  Mem m;
10580 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
10590 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
105a0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
105b0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
105c0 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
105d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
105e0 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  K;.  }.  rc = sq
105f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
10600 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
10610 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
10620 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
10630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10640 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  c;.  }.  lenRowi
10650 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  d = sqlite3VdbeI
10660 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29  dxRowidLen((u8*)
10670 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73  m.z);.  *res = s
10680 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
10690 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79  Compare(pC->pKey
106a0 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77  Info, m.n-lenRow
106b0 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70  id, m.z, nKey, p
106c0 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Key);.  sqlite3V
106d0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
106e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
106f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10700 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
10710 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
10720 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
10730 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
10740 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
10750 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
10760 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
10770 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
10780 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
10790 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
107a0 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
107b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
107c0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
107d0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
107e0 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
107f0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
10800 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
10810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
10820 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
10830 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
10840 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
10850 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
10860 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
10870 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
10880 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
10890 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
108a0 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
108b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
108c0 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
108d0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
108e0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
108f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
10900 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
10910 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
10920 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
10930 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
10940 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
10950 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
10960 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
10970 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
10980 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
10990 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
109a0 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
109b0 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
109c0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
109d0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
109e0 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
109f0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
10a00 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
10a10 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
10a20 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
10a30 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
10a40 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
10a50 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
10a60 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
10a70 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
10a80 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
10a90 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
10aa0 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
10ab0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
10ac0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
10ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
10af0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10b00 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
10b10 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
10b20 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
10b30 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.