/ Hex Artifact Content
Login

Artifact 628751c5530ecbc77efebf5e343dfc714d5fdce0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0660: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65  mt *pStmt){.  re
0670: 74 75 72 6e 20 28 28 56 64 62 65 20 2a 29 70 53  turn ((Vdbe *)pS
0680: 74 6d 74 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f  tmt)->zSql;.}../
0690: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06a0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06b0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06d0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06e0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06f0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0710: 0a 20 20 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74  .  int nTmp;.  t
0720: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0730: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0740: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0750: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0760: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0770: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0780: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0790: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07a0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07b0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07c0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07d0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07e0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07f0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0800: 70 3b 0a 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e  p;.  nTmp = pA->
0810: 6e 53 71 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c  nSql;.  pA->nSql
0820: 20 3d 20 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pB->nSql;.  p
0830: 42 2d 3e 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a  B->nSql = nTmp;.
0840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0850: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0860: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0870: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0880: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0890: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
08a0: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
08b0: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
08c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
08d0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
08e0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  y so that it con
08f0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 4e  tains at least N
0900: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  .** elements..**
0910: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0920: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0930: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0940: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a  ing the array,.*
0950: 2a 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  * Vdbe.aOp and V
0960: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0970: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74  ain unchanged (t
0980: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a  his is so that.*
0990: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  * any opcodes al
09a0: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
09b0: 63 61 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79  can be correctly
09c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20   deallocated.** 
09d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
09e0: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
09f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a00: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56   resizeOpArray(V
0a10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
0a20: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0a30: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0a40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70  p->nOpAlloc;.  p
0a50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a60: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a70: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0a80: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0a90: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0aa0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ab0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  Op = pNew;.    i
0ac0: 66 28 20 4e 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a  f( N>oldSize ){.
0ad0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
0ae0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
0af0: 2c 20 28 4e 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  , (N-oldSize)*si
0b00: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 7d  zeof(Op));.    }
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0b20: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b30: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b40: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b50: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b60: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0b80: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0b90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0ba0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bd0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0bf0: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c10: 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20  *    p1, p2, p3 
0c20: 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a       Operands.**
0c30: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
0c40: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
0c50: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0c60: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0c70: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0c80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0c90: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0ca0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0cb0: 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72  f the P4.** oper
0cc0: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64  te3VdbeAddOp3(Vd
0ce0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0cf0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
0d00: 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p3){.  int i;
0d10: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
0d20: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  .  i = p->nOp;. 
0d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0d40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0d50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
0d60: 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20  OpAlloc<=i ){.  
0d70: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
0d80: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  p, p->nOpAlloc ?
0d90: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0da0: 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29   1024/sizeof(Op)
0db0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  );.    if( p->db
0dc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0dd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
0de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
0df0: 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20  >nOp++;.  pOp = 
0e00: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0e10: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a  p->opcode = op;.
0e20: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a    pOp->p1 = p1;.
0e30: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a    pOp->p2 = p2;.
0e40: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a    pOp->p3 = p3;.
0e50: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
0e60: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
0e70: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
0e80: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23  ->expired = 0;.#
0e90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
0ea0: 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  UG.  if( sqlite3
0eb0: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0ec0: 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 50  e ) sqlite3VdbeP
0ed0: 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d  rintOp(0, i, &p-
0ee0: 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66  >aOp[i]);.#endif
0ef0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
0f00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0f10: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
0f20: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
0f30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0f40: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
0f50: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
0f60: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
0f70: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0f80: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
0f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0fa0: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
0fb0: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
0fc0: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
0fd0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0fe0: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
0ff0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1000: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1010: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  , p2, 0);.}.../*
1020: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1030: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1040: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1050: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
1060: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1070: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
1080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1090: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
10a0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
10b0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
10c0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
10d0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10f0: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1100: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1120: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1130: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1140: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1150: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
1160: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
1170: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
1180: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
1190: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
11a0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
11b0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
11c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11d0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
11e0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
11f0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
1200: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
1210: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1220: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1230: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1240: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1250: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1260: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1270: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1280: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
1290: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
12a0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
12b0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
12c0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
12d0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
12e0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
12f0: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1300: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1310: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1320: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1330: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1340: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1350: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1360: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1370: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1380: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
1390: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
13a0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
13b0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
13c0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
13d0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
13e0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
13f0: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1400: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1410: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1420: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1430: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1440: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1450: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1460: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1470: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1480: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
1490: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
14a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14b0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
14c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
14d0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
14e0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
14f0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1500: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1510: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1520: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
1530: 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f   = p->nLabelAllo
1540: 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 70 2d  c*2 + 10;.    p-
1550: 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  >aLabel = sqlite
1560: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
1570: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
1580: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c         p->nLabel
15b0: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d 3e  Alloc*sizeof(p->
15c0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d  aLabel[0]));.  }
15d0: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
15e0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
15f0: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
1600: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
1610: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
1620: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
1630: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1640: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1650: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
1660: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
1670: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
1680: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1690: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
16a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
16b0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
16c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16e0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
16f0: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
1700: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1710: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1720: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1730: 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e  t( j>=0 && j<p->
1740: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20  nLabel );.  if( 
1750: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1760: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
1770: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->nOp;.  }.}../
1780: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
1790: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
17a0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
17b0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
17c0: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
17d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
17e0: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
17f0: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
1800: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
1810: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
1820: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
1830: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
1840: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
1850: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1860: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
1870: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
1880: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
1890: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
18a0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
18b0: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
18c0: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
18d0: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
18e0: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
18f0: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
1900: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
1910: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
1920: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
1930: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
1940: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
1950: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
1960: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1970: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68 65  ne also does the
1980: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6d   following optim
1990: 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63 61  ization:  It sca
19a0: 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73 74 72 75  ns for.** instru
19b0: 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ctions that migh
19c0: 74 20 63 61 75 73 65 20 61 20 73 74 61 74 65 6d  t cause a statem
19d0: 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53  ent rollback.  S
19e0: 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  uch instructions
19f0: 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** are:.**.**  
1a00: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
1a10: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
1a20: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
1a30: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
1a40: 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a  P_Destroy.**   *
1a50: 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20    OP_VUpdate.** 
1a60: 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a    *  OP_VRename.
1a70: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 63 68  **.** If no such
1a80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1a90: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65 72  found, then ever
1aa0: 79 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73 74  y Statement inst
1ab0: 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 63  ruction .** is c
1ac0: 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f 70  hanged to a Noop
1ad0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
1ae0: 77 65 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e  we avoid creatin
1af0: 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
1b00: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1b10: 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e 0a   unnecessarily..
1b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1b30: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
1b40: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
1b50: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
1b60: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
1b70: 72 67 73 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  rgs = 0;.  Op *p
1b80: 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  Op;.  int *aLabe
1b90: 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20  l = p->aLabel;. 
1ba0: 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d 65   int doesStateme
1bb0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ntRollback = 0;.
1bc0: 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d 65    int hasStateme
1bd0: 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66  ntBegin = 0;.  f
1be0: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
1bf0: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
1c00: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
1c10: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
1c20: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
1c30: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
1c40: 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  unction ){.     
1c50: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
1c60: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
1c70: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
1c80: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1c90: 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a 23 69  ==OP_AggStep .#i
1ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cb0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1cc0: 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65         || opcode
1cd0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23 65 6e  ==OP_VUpdate.#en
1ce0: 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
1cf0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
1d00: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
1d10: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
1d20: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
1d30: 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20  ==OP_Halt ){.   
1d40: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d     if( pOp->p1==
1d50: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1d60: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
1d70: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
1d80: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1d90: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1da0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1db0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  f( opcode==OP_St
1dc0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
1dd0: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
1de0: 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  in = 1;.    }els
1df0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
1e00: 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  _Destroy ){.    
1e10: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1e20: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 23 69 66  ollback = 1;.#if
1e30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1e60: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
1e70: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
1e80: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 64 6f  name ){.      do
1e90: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1ea0: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ack = 1;.    }el
1eb0: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
1ec0: 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  P_VFilter ){.   
1ed0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1ee0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
1ef0: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
1f00: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
1f10: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
1f20: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  ger );.      n =
1f30: 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
1f40: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
1f50: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
1f60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
1f70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
1f80: 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70  dbeOpcodeHasProp
1f90: 65 72 74 79 28 6f 70 63 6f 64 65 2c 20 4f 50 46  erty(opcode, OPF
1fa0: 4c 47 5f 4a 55 4d 50 29 20 26 26 20 70 4f 70 2d  LG_JUMP) && pOp-
1fb0: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  >p2<0 ){.      a
1fc0: 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70  ssert( -1-pOp->p
1fd0: 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  2<p->nLabel );. 
1fe0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61       pOp->p2 = a
1ff0: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
2000: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ];.    }.  }.  s
2010: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
2020: 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61  Label);.  p->aLa
2030: 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61  bel = 0;..  *pMa
2040: 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78  xFuncArgs = nMax
2050: 41 72 67 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  Args;..  /* If w
2060: 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b  e never rollback
2070: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
2080: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73  nsaction, then s
2090: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
20a0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
20b0: 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f 20 63  ot needed.  So c
20c0: 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50 5f 53  hange every OP_S
20d0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70  tatement.  ** op
20e0: 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  code into an OP_
20f0: 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76 6f 69  Noop.  This avoi
2100: 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  d a call to sqli
2110: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
2120: 76 65 28 29 0a 20 20 2a 2a 20 77 68 69 63 68 20  ve().  ** which 
2130: 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65  can be expensive
2140: 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72   on some platfor
2150: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  ms..  */.  if( h
2160: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
2170: 20 26 26 20 21 64 6f 65 73 53 74 61 74 65 6d 65   && !doesStateme
2180: 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ntRollback ){.  
2190: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
21a0: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
21b0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
21c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
21d0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65  opcode==OP_State
21e0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
21f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
2200: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  _Noop;.      }. 
2210: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2220: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
2230: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2240: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2250: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
2260: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
2270: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
2280: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
2290: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
22a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
22b0: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
22c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
22d0: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
22e0: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
22f0: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
2300: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
2310: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
2320: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
2330: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2340: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
2350: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
2360: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
2370: 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64   *aOp){.  int ad
2380: 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  dr;.  assert( p-
2390: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
23a0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
23b0: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
23c0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20  p->nOpAlloc ){. 
23d0: 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79     resizeOpArray
23e0: 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  (p, p->nOpAlloc 
23f0: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
2400: 3a 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  : 1024/sizeof(Op
2410: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
2420: 70 2d 3e 6e 4f 70 2b 6e 4f 70 3c 3d 70 2d 3e 6e  p->nOp+nOp<=p->n
2430: 4f 70 41 6c 6c 6f 63 20 7c 7c 20 70 2d 3e 64 62  OpAlloc || p->db
2440: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64  ;.  }.  if( p->d
2460: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2470: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2480: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
2490: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e  >nOp;.  if( nOp>
24a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
24b0: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
24c0: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
24d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24e0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
24f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
2500: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
2510: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
2520: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
2530: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
2540: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
2550: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
2560: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
2570: 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 73 71    if( p2<0 && sq
2580: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48  lite3VdbeOpcodeH
2590: 61 73 50 72 6f 70 65 72 74 79 28 70 4f 75 74 2d  asProperty(pOut-
25a0: 3e 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a  >opcode, OPFLG_J
25b0: 55 4d 50 29 20 29 7b 0a 20 20 20 20 20 20 20 20  UMP) ){.        
25c0: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
25d0: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
25e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25f0: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
2600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
2610: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
2620: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
2630: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
2640: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
2650: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
2660: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
2670: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2680: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2690: 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
26a0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
26b0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
26c0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
26d0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
26e0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26f0: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2700: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
2710: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2720: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2730: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
2740: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2750: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2760: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2770: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
2780: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
2790: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
27a0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
27b0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
27c0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
27d0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
27e0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
27f0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2800: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
2810: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2820: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
2830: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2840: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2850: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2860: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2870: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
2880: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
2890: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
28a0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
28b0: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
28c0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
28d0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
28e0: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
28f0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2900: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2910: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2920: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
2930: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
2940: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2950: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
2960: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2970: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2980: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
2990: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
29a0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
29b0: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
29c0: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
29d0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
29e0: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
29f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2a00: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2a10: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
2a20: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2a30: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2a50: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
2a60: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2a70: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2a80: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2a90: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2aa0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2ab0: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2ac0: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2ad0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2ae0: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
2af0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2b00: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2b10: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
2b20: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
2b30: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
2b40: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
2b50: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2b60: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
2b70: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
2b80: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
2b90: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2ba0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
2bb0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2bc0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
2bd0: 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70   );.    p->aOp[p
2be0: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61  ->nOp-1].p5 = va
2bf0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2c00: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
2c10: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
2c20: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
2c30: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
2c40: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
2c50: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2c60: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
2c70: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2c80: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
2c90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2ca0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
2cb0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
2cc0: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
2cd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
2ce0: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
2cf0: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
2d00: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
2d10: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
2d20: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
2d30: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
2d40: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2d50: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
2d60: 6c 46 75 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65  lFunction(FuncDe
2d70: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
2d80: 70 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e 66  pDef && (pDef->f
2d90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2da0: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
2db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2dc0: 28 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDef);.  }.}../
2dd0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
2de0: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
2df0: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2e00: 6f 69 64 20 66 72 65 65 50 34 28 69 6e 74 20 70  oid freeP4(int p
2e10: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29  4type, void *p3)
2e20: 7b 0a 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20  {.  if( p3 ){.  
2e30: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
2e40: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
2e50: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
2e60: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
2e70: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
2e80: 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  TF:.      case P
2e90: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
2ea0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
2eb0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2ec0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
2ed0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2ee0: 65 33 5f 66 72 65 65 28 70 33 29 3b 0a 20 20 20  e3_free(p3);.   
2ef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f00: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
2f10: 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  4_VDBEFUNC: {.  
2f20: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
2f30: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
2f40: 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20  eFunc *)p3;.    
2f50: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
2f60: 6c 46 75 6e 63 74 69 6f 6e 28 70 56 64 62 65 46  lFunction(pVdbeF
2f70: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
2f80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f90: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56  DeleteAuxData(pV
2fa0: 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20  dbeFunc, 0);.   
2fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2fc0: 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  e(pVdbeFunc);.  
2fd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2fe0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2ff0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
3000: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
3010: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e  ralFunction((Fun
3020: 63 44 65 66 2a 29 70 33 29 3b 0a 20 20 20 20 20  cDef*)p3);.     
3030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3040: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3050: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MEM: {.        s
3060: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
3070: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
3080: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
3090: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
30a0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
30b0: 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73  Change N opcodes
30c0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64   starting at add
30d0: 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a  r to No-ops..*/.
30e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
30f0: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
3100: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3110: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
3120: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
3130: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
3140: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3150: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
3160: 20 20 20 20 20 20 66 72 65 65 50 34 28 70 4f 70        freeP4(pOp
3170: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
3180: 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  4.p);.      mems
3190: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
31a0: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
31b0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
31c0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70  OP_Noop;.      p
31d0: 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Op++;.    }.  }.
31e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
31f0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3200: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
3210: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3220: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
3230: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
3240: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
3250: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
3260: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
3270: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
3280: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3290: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
32a0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
32b0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
32c0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
32d0: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
32e0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
32f0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
3300: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
3310: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
3320: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
3330: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3340: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3350: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
3360: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
3370: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
3380: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
3390: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
33a0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
33b0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
33c0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
33d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
33e0: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
33f0: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
3400: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
3410: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
3420: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
3430: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
3440: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
3450: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3460: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
3470: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
3480: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
3490: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
34a0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
34b0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
34c0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
34d0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
34e0: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
34f0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
3500: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
3510: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3520: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
3530: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
3540: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
3550: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
3560: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
3570: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
3580: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
3590: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
35a0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
35b0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
35c0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
35d0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
35e0: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
35f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
3600: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
3610: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
3620: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
3630: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
3640: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
3650: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
3660: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
3670: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
3680: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
3690: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
36a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
36b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
36c0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
36d0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
36e0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
36f0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
3700: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3710: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3720: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3730: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3740: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  >aOp==0 || p->db
3750: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3760: 7b 0a 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50  {.    if (n != P
3770: 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20  4_KEYINFO) {.   
3780: 20 20 20 66 72 65 65 50 34 28 6e 2c 20 28 76 6f     freeP4(n, (vo
3790: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
37a0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
37b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
37c0: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
37d0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
37e0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
37f0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
3800: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
3810: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
3820: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3830: 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79  freeP4(pOp->p4ty
3840: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
3850: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
3860: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
3870: 33 32 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  32 ){.    pOp->p
3880: 34 2e 69 20 3d 20 28 69 6e 74 29 7a 50 34 3b 0a  4.i = (int)zP4;.
3890: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
38a0: 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = n;.  }else if(
38b0: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP4==0 ){.    p
38c0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
38d0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
38e0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P4_NOTUSED;.  }e
38f0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
3900: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
3910: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
3920: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
3930: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
3940: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
3950: 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP4)->nField;.  
3960: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
3970: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
3980: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
3990: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
39a0: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
39b0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
39c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
39d0: 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  te );.    pOp->p
39e0: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  4.pKeyInfo = pKe
39f0: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
3a00: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
3a10: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3a20: 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP4, nByte);. 
3a30: 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63       /* In the c
3a40: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
3a50: 61 74 69 6f 6e 2c 20 50 34 5f 4b 45 59 49 4e 46  ation, P4_KEYINF
3a60: 4f 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  O is only ever u
3a70: 73 65 64 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  sed on.      ** 
3a80: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3a90: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 20  es that have no 
3aa0: 61 53 6f 72 74 4f 72 64 65 72 20 63 6f 6d 70 6f  aSortOrder compo
3ab0: 6e 65 6e 74 2e 20 20 45 6c 65 6d 65 6e 74 73 0a  nent.  Elements.
3ac0: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e        ** with an
3ad0: 20 61 53 6f 72 74 4f 72 64 65 72 20 61 6c 77 61   aSortOrder alwa
3ae0: 79 73 20 75 73 65 20 50 34 5f 4b 45 59 49 4e 46  ys use P4_KEYINF
3af0: 4f 5f 48 41 4e 44 4f 46 46 2e 20 20 53 6f 20 77  O_HANDOFF.  So w
3b00: 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  e do not.      *
3b10: 2a 20 6e 65 65 64 20 74 6f 20 62 6f 74 68 65 72  * need to bother
3b20: 20 77 69 74 68 20 64 75 70 6c 69 63 61 74 69 6e   with duplicatin
3b30: 67 20 74 68 65 20 61 53 6f 72 74 4f 72 64 65 72  g the aSortOrder
3b40: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
3b50: 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
3b60: 72 74 4f 72 64 65 72 3d 3d 30 20 29 3b 0a 23 69  rtOrder==0 );.#i
3b70: 66 20 30 0a 20 20 20 20 20 20 61 53 6f 72 74 4f  f 0.      aSortO
3b80: 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
3b90: 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  >aSortOrder;.   
3ba0: 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65     if( aSortOrde
3bb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  r ){.        pKe
3bc0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3bd0: 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  r = (unsigned ch
3be0: 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  ar*)&pKeyInfo->a
3bf0: 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20  Coll[nField];.  
3c00: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65        memcpy(pKe
3c10: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3c20: 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e  r, aSortOrder, n
3c30: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Field);.      }.
3c40: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4f 70  #endif.      pOp
3c50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
3c60: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3c70: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
3c80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3c90: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3ca0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3cb0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
3cc0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
3cd0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
3ce0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3cf0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3d00: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
3d10: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
3d20: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
3d30: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
3d40: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3d50: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3d60: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3d70: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34  ) n = strlen(zP4
3d80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
3d90: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
3da0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
3db0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
3dc0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
3dd0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3de0: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
3df0: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
3e00: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
3e10: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
3e20: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
3e30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3e40: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
3e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3e60: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
3e70: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65  _list ap;.  asse
3e80: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
3e90: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
3ea0: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
3eb0: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
3ec0: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
3ed0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
3ee0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
3ef0: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63   p->nOp ){.    c
3f00: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61  har **pz = &p->a
3f10: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
3f20: 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74  mment;.    va_st
3f30: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
3f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
3f50: 65 65 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  ee(*pz);.    *pz
3f60: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
3f70: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
3f80: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
3f90: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
3fa0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
3fb0: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
3fc0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
3fd0: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
3fe0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
3ff0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4000: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4010: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4020: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
4030: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
4040: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
4050: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4060: 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  led );.  return 
4070: 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ((addr>=0 && add
4080: 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61  r<p->nOp)?(&p->a
4090: 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a  Op[addr]):0);.}.
40a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
40b0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
40c0: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
40d0: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
40e0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
40f0: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
4100: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
4110: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4120: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
4130: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
4140: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
4150: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
4160: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
4170: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
4180: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
4190: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
41a0: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
41b0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
41c0: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
41d0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
41e0: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
41f0: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
4200: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
4210: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
4220: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
4230: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
4240: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
4250: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
4260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4270: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4280: 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64  emp, "keyinfo(%d
4290: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
42a0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
42b0: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20  strlen(zTemp);. 
42c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
42d0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
42e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
42f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
4300: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
4310: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
4320: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
4330: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
4340: 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  en(pColl->zName)
4350: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4360: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
4370: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
4380: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
4390: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
43a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
43b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
43c0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
43d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
43e0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
43f0: 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f  rder && pKeyInfo
4400: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
4410: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
4420: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
4430: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4440: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
4450: 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e  Temp[i], pColl->
4460: 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20  zName,n+1);.    
4470: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
4480: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4490: 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+4<nTemp-6 ){. 
44a0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
44b0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22  &zTemp[i],",nil"
44c0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,4);.          i
44d0: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
44e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
44f0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
4500: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
4510: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
4520: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
4530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4540: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
4550: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
4560: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
4570: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
4580: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4590: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
45a0: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
45b0: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
45c0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
45d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
45e0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
45f0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
4600: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
4610: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
4620: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4630: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
4640: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
4650: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
4660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4670: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
4680: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4690: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
46a0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
46b0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
46c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
46d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
46e0: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
46f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4700: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4710: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
4720: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4730: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
4740: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
4750: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4760: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
4770: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
4780: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
4790: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
47a0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
47b0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
47c0: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
47d0: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
47e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
47f0: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  l)==0 );.      i
4800: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4810: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
4820: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
4830: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
4840: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4850: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
4860: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4870: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4880: 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  p, "%lld", pMem-
4890: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
48a0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
48b0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
48c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
48d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
48e0: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
48f0: 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20   pMem->r);.     
4900: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4910: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
4920: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4930: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
4940: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
4950: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
4960: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
4970: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
4980: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4990: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
49a0: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
49b0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
49c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
49e0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
49f0: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
4a00: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
4a10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
4a20: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
4a30: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
4a40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4a50: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  }.  assert( zP4!
4a60: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
4a70: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  P4;.}.#endif../*
4a80: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
4a90: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
4aa0: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
4ab0: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
4ac0: 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20  sed..**.*/.void 
4ad0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
4ae0: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
4af0: 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b  t i){.  int mask
4b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
4b10: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
4b20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
4b30: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
4b40: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b  ask)*8 );.  mask
4b50: 20 3d 20 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28   = 1<<i;.  if( (
4b60: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d  p->btreeMask & m
4b70: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ask)==0 ){.    p
4b80: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d  ->btreeMask |= m
4b90: 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ask;.    sqlite3
4ba0: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 49  BtreeMutexArrayI
4bb0: 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78  nsert(&p->aMutex
4bc0: 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  , p->db->aDb[i].
4bd0: 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69  pBt);.  }.}...#i
4be0: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
4bf0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
4c00: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4c10: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
4c20: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
4c30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4c40: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
4c50: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
4c60: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4c70: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
4c80: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
4c90: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
4ca0: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
4cb0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
4cc0: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
4cd0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
4ce0: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
4cf0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
4d00: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
4d10: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
4d20: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
4d30: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
4d40: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
4d50: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
4d60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
4d70: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
4d80: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
4d90: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
4da0: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
4db0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4dc0: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
4dd0: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
4de0: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
4df0: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
4e00: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
4e10: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
4e20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4e30: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
4e40: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
4e50: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
4e60: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
4e70: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
4e80: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 73 71  p && N ){.    sq
4e90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4ea0: 62 3b 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f  b;.    int mallo
4eb0: 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  c_failed = db->m
4ec0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
4ed0: 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b   while( N-->0 ){
4ee0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4e  .      assert( N
4ef0: 3c 32 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70  <2 || p[0].db==p
4f00: 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20  [1].db );.      
4f10: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
4f20: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
4f30: 70 2b 2b 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  p++->flags = MEM
4f40: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
4f50: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4f60: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
4f70: 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  d;.  }.}..#ifnde
4f80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
4f90: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
4fa0: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
4fb0: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
4fc0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
4fd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
4fe0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
4ff0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
5000: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
5010: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
5020: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
5030: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
5040: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
5050: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
5060: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
5070: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
5080: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
5090: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
50a0: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
50b0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
50c0: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
50d0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
50e0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
50f0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
5100: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
5110: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
5120: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
5130: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
5140: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
5150: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
5160: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
5170: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
5180: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
51b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
51c0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
51d0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
51e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
51f0: 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73   *pMem = p->pRes
5200: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
5210: 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  m[1];..  assert(
5220: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
5230: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
5240: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20  DBE_MAGIC_RUN ) 
5250: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5260: 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  SUSE;.  assert( 
5270: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
5280: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a  E_MAGIC_BUSY );.
5290: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
52a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
52b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
52c0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
52d0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
52e0: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
52f0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
5300: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
5310: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
5320: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
5330: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
5340: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
5350: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5360: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
5370: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
5380: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
5390: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
53a0: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e  mArray(pMem, p->
53b0: 6e 4d 65 6d 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20  nMem);..  do{.  
53c0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
53d0: 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f   }while( i<p->nO
53e0: 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  p && p->explain=
53f0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
5400: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
5410: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  in );.  if( i>=p
5420: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->nOp ){.    p->
5430: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5440: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5450: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
5460: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
5470: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
5480: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
5490: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
54a0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
54b0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
54c0: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
54d0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
54e0: 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  ->rc), (char*)0)
54f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
5500: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
5510: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
5520: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ;.    if( p->exp
5530: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
5540: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5550: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
5560: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5570: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  E_INTEGER;.     
5580: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55b0: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
55c0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
55d0: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
55e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
55f0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
5600: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
5610: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
5620: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
5630: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f  pOp->opcode);  /
5640: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
5650: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
5660: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
5670: 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  em->n = strlen(p
5680: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
5690: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
56a0: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
56b0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
56c0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
56d0: 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  em++;.    }..   
56e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
56f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
5700: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
5730: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
5740: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5750: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
5760: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
5770: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
5780: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
5790: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
57b0: 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P2 */.    pMem-
57c0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
57d0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
57e0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
57f0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
5800: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5810: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
5820: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
5830: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5850: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P3 */.      pM
5860: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5870: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  E_INTEGER;.     
5880: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a   pMem++;.    }..
5890: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
58a0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
58b0: 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20   32, 0) ){      
58c0: 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20        /* P4 */. 
58d0: 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c       p->db->mall
58e0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
58f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5900: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
5910: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5920: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
5930: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
5940: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
5950: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
5960: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
5970: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
5980: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
5990: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
59a0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
59b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
59c0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
59d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
59e0: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
59f0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
5a00: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
5a10: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
5a20: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5a30: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
5a40: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
5a50: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
5a60: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5a70: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
5a80: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 0a 20 20 20  m, 32, 0) ){.   
5a90: 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c       p->db->mall
5aa0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
5ab0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5ac0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
5ad0: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
5ae0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
5af0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
5b00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
5b10: 20 73 70 72 69 6e 74 66 28 70 4d 65 6d 2d 3e 7a   sprintf(pMem->z
5b20: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
5b30: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
5b40: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5b50: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5b60: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
5b70: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
5b80: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
5b90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5ba0: 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  UG.      if( pOp
5bb0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
5bc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5bd0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
5be0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
5bf0: 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f  em->z = pOp->zCo
5c00: 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  mment;.        p
5c10: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5c20: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
5c30: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5c40: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
5c50: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
5c60: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
5c70: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5c80: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5ca0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
5cb0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5cc0: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
5cd0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
5ce0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
5cf0: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
5d00: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
5d10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5d20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
5d30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5d40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5d50: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5d60: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
5d70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
5d80: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
5d90: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
5da0: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
5db0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
5dc0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5dd0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
5de0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
5df0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
5e00: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
5e10: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
5e20: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
5e30: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
5e40: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
5e50: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
5e60: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
5e70: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
5e80: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
5e90: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
5ea0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
5eb0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
5ec0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
5ed0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5ee0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
5ef0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5f00: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
5f10: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
5f20: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
5f30: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
5f40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5f50: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
5f60: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
5f70: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
5f80: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
5f90: 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 3d  qlite3_io_trace=
5fa0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5fb0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
5fc0: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
5fd0: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
5fe0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
5ff0: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
6000: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
6010: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
6020: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
6030: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
6040: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
6050: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
6060: 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28  or(i=0; isspace(
6070: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
6080: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
6090: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
60a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
60b0: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
60c0: 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a  d char)z[i]) ){.
60d0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
60e0: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
60f0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
6100: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
6110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6120: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
6130: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6140: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
6150: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63   sqlite3_io_trac
6160: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
6170: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
6180: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
6190: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
61a0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
61b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  .../*.** Prepare
61c0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
61d0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
61e0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
61f0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
6200: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
6210: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
6220: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
6230: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
6240: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
6250: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
6260: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
6270: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
6280: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
6290: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
62a0: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
62b0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
62c0: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
62d0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
62e0: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
62f0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69  AGIC_RUN..*/.voi
6300: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
6310: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
6320: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6340: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  VDBE */.  int nV
6350: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
6360: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6370: 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e  er of '?' see in
6380: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
6390: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  nt */.  int nMem
63a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
63b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
63c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
63d0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
63e0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20    int nCursor,  
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
6410: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  rsors to allocat
6420: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70  e */.  int isExp
6430: 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
6440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
6450: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
6460: 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74  words is present
6470: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
6480: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6490: 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  p->db;..  assert
64a0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
64b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
64c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
64d0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
64e0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
64f0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
6500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6510: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
6520: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
6530: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
6540: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
6550: 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a  later. This.   *
6560: 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
6570: 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70  call to resizeOp
6580: 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61  Array() below ma
6590: 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20  y shrink the.   
65a0: 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79  * p->aOp[] array
65b0: 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20   to save memory 
65c0: 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  if called when i
65d0: 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  n VDBE_MAGIC_RUN
65e0: 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20   .   * state..  
65f0: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
6600: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
6610: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
6620: 63 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72  cation space for
6630: 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f   registers..  */
6640: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d  .  if( p->aMem==
6650: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
6660: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
6670: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
6680: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
6690: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
66a0: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
66b0: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
66c0: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
66d0: 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  y(p, p->nOp);.  
66e0: 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d    assert( nVar>=
66f0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45  0 );.    if( isE
6700: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
6710: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  0 ){.      p->nM
6720: 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  em = nMem = 10;.
6730: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65      }.    p->aMe
6740: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
6750: 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
6760: 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28      nMem*sizeof(
6770: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6780: 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20     /* aMem */.  
6790: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
67a0: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
67b0: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
67c0: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
67d0: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
67e0: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
67f0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
6800: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20  sizeof(char*)   
6810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56            /* azV
6820: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  ar */.      + nC
6830: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72  ursor*sizeof(Cur
6840: 73 6f 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20  sor*) + 1    /* 
6850: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
6860: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
6870: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
6880: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
6890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
68a0: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
68b0: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70  .nMem */.      p
68c0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
68d0: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
68e0: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
68f0: 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56  1 */.      p->aV
6900: 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d  ar = &p->aMem[nM
6910: 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em+1];.      p->
6920: 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20  nVar = nVar;.   
6930: 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b     p->okVar = 0;
6940: 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20  .      p->apArg 
6950: 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61  = (Mem**)&p->aVa
6960: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
6970: 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a  ->azVar = (char*
6980: 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67  *)&p->apArg[nArg
6990: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  ];.      p->apCs
69a0: 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70  r = (Cursor**)&p
69b0: 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  ->azVar[nVar];. 
69c0: 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20       p->nCursor 
69d0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = nCursor;.     
69e0: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
69f0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
6a00: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
6a10: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
6a20: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
6a30: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
6a40: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  .      for(n=1; 
6a50: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
6a60: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
6a70: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
6a80: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ll;.        p->a
6a90: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
6aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6ab0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
6ac0: 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b  DEBUG.  for(n=1;
6ad0: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
6ae0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
6af0: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20  >aMem[n].db==db 
6b00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6b10: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 3d  ->aMem[n].flags=
6b20: 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 7d  =MEM_Null );.  }
6b30: 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63  .#endif..  p->pc
6b40: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
6b50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
6b60: 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a  >uniqueCnt = 0;.
6b70: 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68    p->returnDepth
6b80: 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72   = 0;.  p->error
6b90: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
6ba0: 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  t;.  p->explain 
6bb0: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
6bc0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
6bd0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
6be0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
6bf0: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
6c00: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
6c10: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
6c20: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
6c30: 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ent = 0;.#ifdef 
6c40: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
6c50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
6c70: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
6c80: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
6c90: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
6ca0: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
6cb0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
6cc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
6cd0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
6ce0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
6cf0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
6d00: 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a  ursor happens.**
6d10: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
6d20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
6d30: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
6d40: 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20   Cursor *pCx){. 
6d50: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
6d60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6d70: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
6d80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
6d90: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
6da0: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
6db0: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
6dc0: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
6dd0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
6de0: 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  >pBt);.  }.#ifnd
6df0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6e00: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
6e10: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
6e20: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
6e30: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
6e40: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
6e50: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
6e60: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
6e70: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
6e80: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
6e90: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
6ea0: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 28 76  thod = 1;.    (v
6eb0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
6ec0: 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20  yOff(p->db);.   
6ed0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
6ee0: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
6ef0: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
6f00: 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b  SafetyOn(p->db);
6f10: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
6f20: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
6f30: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
6f40: 72 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b  ree(pCx->pData);
6f50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6f60: 70 43 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73  pCx->aType);.  s
6f70: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 29  qlite3_free(pCx)
6f80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
6f90: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63   all cursors exc
6fa0: 65 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72  ept for VTab cur
6fb0: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75  sors that are cu
6fc0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73  rrently.** in us
6fd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6fe0: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
6ff0: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
7000: 62 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  bs(Vdbe *p){.  i
7010: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
7020: 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
7030: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7040: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
7050: 0a 20 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20  .    Cursor *pC 
7060: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
7070: 20 20 20 69 66 28 20 70 43 20 26 26 20 28 21 70     if( pC && (!p
7080: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c  ->inVtabMethod |
7090: 7c 20 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73  | !pC->pVtabCurs
70a0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  or) ){.      sql
70b0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
70c0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
70d0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
70e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
70f0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
7100: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
7110: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
7120: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
7130: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
7140: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
7150: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
7160: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
7170: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
7180: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
7190: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
71a0: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
71b0: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
71c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
71d0: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
71e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6c 6f 73 65 41   int i;.  closeA
71f0: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
7200: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
7210: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
7220: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
7230: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26  MemSetTypeFlag(&
7240: 70 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f  p->aMem[i], MEM_
7250: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  Null);.  }.  rel
7260: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
7270: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
7280: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  m);.  sqlite3Vdb
7290: 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73  eFifoClear(&p->s
72a0: 46 69 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Fifo);.  if( p->
72b0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a  contextStack ){.
72c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
72d0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
72e0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  p; i++){.      s
72f0: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
7300: 65 61 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53  ear(&p->contextS
7310: 74 61 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a  tack[i].sFifo);.
7320: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7330: 33 5f 66 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78  3_free(p->contex
7340: 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70  tStack);.  }.  p
7350: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d  ->contextStack =
7360: 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74   0;.  p->context
7370: 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a  StackDepth = 0;.
7380: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
7390: 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69  kTop = 0;.  sqli
73a0: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72  te3_free(p->zErr
73b0: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
73c0: 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
73d0: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a  sultSet = 0;.}..
73e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
73f0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
7400: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
7410: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
7420: 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74  this SQL.** stat
7430: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e  ement. This is n
7440: 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  ow set at compil
7450: 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74  e time, rather t
7460: 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78  han during.** ex
7470: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ecution of the v
7480: 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74  dbe program so t
7490: 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  hat sqlite3_colu
74a0: 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a  mn_count() can.*
74b0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61  * be called on a
74c0: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
74d0: 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73  before sqlite3_s
74e0: 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tep()..*/.void s
74f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
7500: 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  Cols(Vdbe *p, in
7510: 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20  t nResColumn){. 
7520: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
7530: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65    int n;..  rele
7540: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
7550: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
7560: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
7570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
7580: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
7590: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
75a0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
75b0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
75c0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
75d0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
75e0: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
75f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
7600: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  ->db, sizeof(Mem
7610: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
7620: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
7630: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
7640: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
7650: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
7660: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
7670: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
7680: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
7690: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
76a0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
76b0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
76c0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
76d0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
76e0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
76f0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
7700: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
7710: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
7720: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
7730: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
7740: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
7750: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
7760: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d  s()..**.** If N=
7770: 3d 50 34 5f 53 54 41 54 49 43 20 20 69 74 20 6d  =P4_STATIC  it m
7780: 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20  eans that zName 
7790: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
77a0: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
77b0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
77c0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
77d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66   the pointer. If
77e0: 20 69 74 20 69 73 20 50 34 5f 44 59 4e 41 4d 49   it is P4_DYNAMI
77f0: 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20  C, then .** the 
7800: 73 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20  string is freed 
7810: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
7820: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
7830: 62 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77  be is finished w
7840: 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72  ith.** it. Other
7850: 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66  wise, N bytes of
7860: 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65   zName are copie
7870: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7880: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7890: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  Vdbe *p, int idx
78a0: 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74  , int var, const
78b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
78c0: 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  t N){.  int rc;.
78d0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
78e0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
78f0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
7900: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
7910: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
7920: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
7930: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
7940: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73  LITE_NOMEM;.  as
7950: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
7960: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
7970: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
7980: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
7990: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66  esColumn]);.  if
79a0: 28 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  ( N==P4_DYNAMIC 
79b0: 7c 7c 20 4e 3d 3d 50 34 5f 53 54 41 54 49 43 20  || N==P4_STATIC 
79c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
79d0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
79e0: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
79f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
7a00: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7a10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7a20: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
7a30: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
7a40: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51  me, zName, N, SQ
7a50: 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
7a60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
7a70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7a80: 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34 5f 44 59  E_OK && N==P4_DY
7a90: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f  NAMIC ){.    pCo
7aa0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28  lName->flags = (
7ab0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
7ac0: 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d  (~MEM_Static))|M
7ad0: 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c  EM_Dyn;.    pCol
7ae0: 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  Name->xDel = 0;.
7af0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
7b10: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
7b20: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
7b30: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
7b40: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
7b50: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
7b60: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
7b70: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
7b80: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
7b90: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
7ba0: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
7bb0: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
7bc0: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
7bd0: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
7be0: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
7bf0: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
7c00: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
7c10: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
7c20: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
7c30: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
7c40: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
7c50: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
7c60: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
7c70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
7c80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
7c90: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
7ca0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
7cb0: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
7cc0: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
7cd0: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
7ce0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
7cf0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
7d00: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
7d10: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
7d20: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
7d30: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
7d40: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
7d50: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
7d60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7d70: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
7d80: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
7d90: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
7da0: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
7db0: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
7dc0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
7dd0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
7de0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
7df0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20  (db, rc);.  if( 
7e00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7e10: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
7e20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
7e30: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
7e40: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
7e50: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
7e60: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
7e70: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
7e80: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
7e90: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
7ea0: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
7eb0: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
7ec0: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
7ed0: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
7ee0: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
7ef0: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
7f00: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
7f10: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
7f20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
7f30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
7f40: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
7f50: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
7f60: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
7f70: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
7f80: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
7f90: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
7fa0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
7fb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
7fc0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
7fd0: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
7fe0: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
7ff0: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
8000: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
8010: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
8020: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
8030: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
8040: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
8050: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
8060: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
8070: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
8080: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76  llback ){.    (v
8090: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
80a0: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
80b0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
80c0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
80d0: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
80e0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
80f0: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
8100: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
8110: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
8120: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
8130: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
8140: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
8150: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
8160: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
8170: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
8180: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
8190: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
81a0: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
81b0: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
81c0: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
81d0: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
81e0: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
81f0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
8200: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
8210: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
8220: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
8230: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
8240: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
8250: 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20  mory:.  In that 
8260: 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20  case we do.  ** 
8270: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
8280: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
8290: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
82a0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  e simple case th
82b0: 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a  en.  ** too..  *
82c0: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65  /.  if( 0==strle
82d0: 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n(sqlite3BtreeGe
82e0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
82f0: 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54  b[0].pBt)) || nT
8300: 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66  rans<=1 ){.    f
8310: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
8320: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
8330: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
8340: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8350: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8360: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
8370: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8380: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
8390: 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
83a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
83b0: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
83c0: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
83d0: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
83e0: 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
83f0: 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
8400: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
8410: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
8420: 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
8430: 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
8440: 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
8450: 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
8460: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
8470: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
8480: 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
8490: 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
84a0: 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
84b0: 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
84c0: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
84d0: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
84e0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
84f0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
8500: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
8510: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
8520: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
8530: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
8540: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
8550: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8560: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
8570: 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  o(pBt);.      }.
8580: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
8590: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
85a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
85b0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
85c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
85d0: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
85e0: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
85f0: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
8600: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
8610: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
8620: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
8630: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
8640: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
8650: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
8660: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
8670: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8680: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
8690: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
86a0: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
86b0: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
86c0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
86d0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
86e0: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
86f0: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
8700: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
8710: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
8720: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
8730: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
8740: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
8750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
8760: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
8770: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
8780: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   = 0;..    /* Se
8790: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
87a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
87b0: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
87c0: 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20    u32 random;.  
87d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
87e0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
87f0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
8800: 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  ss(sizeof(random
8810: 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20  ), &random);.   
8820: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
8830: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8840: 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61  "%s-mj%08X", zMa
8850: 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30  inFile, random&0
8860: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  x7fffffff);.    
8870: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
8880: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8890: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
88a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
88b0: 65 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  e( sqlite3OsAcce
88c0: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
88d0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
88e0: 45 58 49 53 54 53 29 20 29 3b 0a 0a 20 20 20 20  EXISTS) );..    
88f0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
8900: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
8910: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8920: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
8930: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
8940: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 53 51  ter, .        SQ
8950: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
8960: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
8970: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
8980: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
8990: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
89a0: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
89b0: 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  , 0.    );.    i
89c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
89d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
89e0: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
89f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8a00: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
8a10: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
8a20: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
8a30: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
8a40: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
8a50: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
8a60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8a70: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
8a80: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
8a90: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
8aa0: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
8ab0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8ac0: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
8ad0: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
8ae0: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
8af0: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
8b00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8b10: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
8b20: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
8b30: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
8b40: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
8b50: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
8b60: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
8b70: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
8b80: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
8b90: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
8ba0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
8bb0: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
8bc0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
8bd0: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a   TEMP database *
8be0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
8bf0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
8c00: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
8c10: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
8c20: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
8c30: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
8c40: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
8c50: 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29  f( zFile[0]==0 )
8c60: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
8c70: 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64  gnore :memory: d
8c80: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
8c90: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
8ca0: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
8cb0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
8cc0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
8cd0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
8ce0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8cf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
8d00: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
8d10: 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c  ile, strlen(zFil
8d20: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
8d30: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
8d40: 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31   strlen(zFile)+1
8d50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
8d60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8d70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8d80: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
8d90: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
8da0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8db0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
8dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
8dd0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
8de0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
8df0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
8e00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
8e10: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
8e20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8e30: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
8e40: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
8e50: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
8e60: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
8e70: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
8e80: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46     */.    zMainF
8e90: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
8ea0: 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d  eeGetDirname(db-
8eb0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
8ec0: 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20    if( (needSync 
8ed0: 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71  .     && (0==(sq
8ee0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
8ef0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
8f00: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
8f10: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a  AP_SEQUENTIAL)).
8f20: 20 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69       && (rc=sqli
8f30: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
8f40: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
8f50: 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f  ORMAL))!=SQLITE_
8f60: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OK) ){.      sql
8f70: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
8f80: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
8f90: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8fa0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
8fb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8fc0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
8fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8fe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
8ff0: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
9000: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
9010: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9020: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
9030: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
9040: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9050: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
9060: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
9070: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
9080: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
9090: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
90a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
90b0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
90c0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
90d0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
90e0: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
90f0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
9100: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
9110: 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
9120: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
9130: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
9140: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9150: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
9160: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
9170: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
9180: 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
9190: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
91a0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
91b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
91c0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
91d0: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
91e0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e  failure occured.
91f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9200: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
9210: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
9220: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
9230: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
9240: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
9250: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
9260: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9270: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9280: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
9290: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
92a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
92b0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
92c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
92d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
92e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
92f0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
9300: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
9310: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
9320: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9330: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
9340: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
9350: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
9360: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
9370: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
9380: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
9390: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
93a0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
93b0: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
93c0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
93d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
93e0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
93f0: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
9400: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
9410: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
9420: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
9430: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9440: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
9450: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
9460: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
9470: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
9480: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
9490: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
94a0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
94b0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
94c0: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
94d0: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
94e0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
94f0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
9500: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
9510: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
9520: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
9530: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
9540: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
9550: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
9560: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
9570: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9580: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
9590: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
95a0: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
95b0: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
95c0: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
95d0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
95e0: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
95f0: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
9600: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
9610: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
9620: 73 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  s();.    for(i=0
9630: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9640: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
9650: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
9660: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
9670: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
9680: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
9690: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
96a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
96b0: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
96c0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
96d0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
96e0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
96f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
9700: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
9710: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
9720: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
9730: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
9740: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
9750: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
9760: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
9770: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
9780: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
9790: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
97a0: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
97b0: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
97c0: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
97d0: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
97e0: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
97f0: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
9800: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
9810: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
9820: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
9830: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
9840: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
9850: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
9860: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
9870: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
9880: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
9890: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
98a0: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
98b0: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
98c0: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
98d0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
98e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
98f0: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
9900: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
9910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
9920: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
9930: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
9940: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
9950: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
9960: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
9970: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
9980: 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  /*.** For every 
9990: 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61  Btree that in da
99a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
99b0: 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68  n db which .** h
99c0: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
99d0: 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61  , "trip" or inva
99e0: 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73  lidate each curs
99f0: 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74  or in.** that Bt
9a00: 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  ree might have b
9a10: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
9a20: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
9a30: 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  ** can never be 
9a40: 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69  used again.  Thi
9a50: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
9a60: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63   rollback.*** oc
9a70: 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74  curs.  We have t
9a80: 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f  o trip all the o
9a90: 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76  ther cursors, ev
9aa0: 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f  en.** cursor fro
9ab0: 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64  m other VMs in d
9ac0: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
9ad0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a  e connections,.*
9ae0: 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f  * so that none o
9af0: 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73  f them try to us
9b00: 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68  e the data at wh
9b10: 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65  ich they.** were
9b20: 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68   pointing and wh
9b30: 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65  ich now may have
9b40: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75   been changed du
9b50: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c  e.** to the roll
9b60: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65  back..**.** Reme
9b70: 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c  mber that a roll
9b80: 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20  back can delete 
9b90: 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20  tables complete 
9ba0: 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72  and.** reorder r
9bb0: 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74  ootpages.  So it
9bc0: 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
9bd0: 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a  nt just to save.
9be0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ** the state of 
9bf0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20  the cursor.  We 
9c00: 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61  have to invalida
9c10: 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  te the cursor.**
9c20: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
9c30: 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e  ever used again.
9c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9c50: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
9c60: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
9c70: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
9c80: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
9c90: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
9ca0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
9cb0: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
9cc0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26  Bt;.    if( p &&
9cd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
9ce0: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
9cf0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
9d00: 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
9d10: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a   SQLITE_ABORT);.
9d20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9d30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9d40: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
9d50: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
9d60: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
9d70: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
9d80: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
9d90: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
9da0: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
9db0: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
9dc0: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
9dd0: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
9de0: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
9df0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
9e00: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
9e10: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
9e20: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
9e30: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
9e40: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
9e50: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
9e60: 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
9e70: 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
9e80: 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
9e90: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
9ea0: 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
9eb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
9ec0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
9ed0: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
9ee0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
9ef0: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
9f00: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
9f10: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
9f20: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
9f30: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
9f40: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
9f50: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
9f60: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
9f70: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
9f80: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
9f90: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  lt(Vdbe *p){.  s
9fa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
9fb0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
9fc0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65  nt (*xFunc)(Btre
9fd0: 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a  e *pBt) = 0;  /*
9fe0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
9ff0: 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20  l on each btree 
a000: 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  backend */.  int
a010: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
a020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a030: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51  et to true if SQ
a040: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f  LITE_NOMEM or IO
a050: 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ERR */..  /* Thi
a060: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
a070: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
a080: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
a090: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
a0a0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
a0b0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
a0c0: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
a0d0: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
a0e0: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
a0f0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
a100: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
a110: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
a120: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
a130: 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
a140: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
a150: 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
a160: 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
a170: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
a180: 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
a190: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
a1a0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
a1b0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
a1c0: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
a1d0: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
a1e0: 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
a1f0: 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
a200: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
a210: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
a220: 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
a230: 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
a240: 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
a250: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
a260: 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
a270: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
a280: 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
a290: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a2a0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a2b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
a2c0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
a2d0: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
a2e0: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
a2f0: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
a300: 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
a310: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
a320: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
a330: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
a340: 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
a350: 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
a360: 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
a370: 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  r started */.  i
a380: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
a390: 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
a3a0: 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
a3b0: 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
a3c0: 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
a3d0: 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
a3e0: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
a3f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
a400: 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  reeMutexArrayEnt
a410: 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  er(&p->aMutex);.
a420: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
a430: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
a440: 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
a450: 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
a460: 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
a470: 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
a480: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
a490: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
a4a0: 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
a4b0: 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
a4c0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a4d0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
a4e0: 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
a4f0: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
a500: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f        /* This lo
a510: 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63 20 61  op does static a
a520: 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 71  nalysis of the q
a530: 75 65 72 79 20 74 6f 20 73 65 65 20 77 68 69 63  uery to see whic
a540: 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  h of the.      *
a550: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  * following thre
a560: 65 20 63 61 74 65 67 6f 72 69 65 73 20 69 74 20  e categories it 
a570: 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20  falls into:.    
a580: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
a590: 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20    Read-only.    
a5a0: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
a5b0: 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  ith statement jo
a5c0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20  urnal.      **  
a5d0: 20 20 20 51 75 65 72 79 20 77 69 74 68 6f 75 74     Query without
a5e0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a5f0: 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  al.      **.    
a600: 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f    ** We could do
a610: 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20   something more 
a620: 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68 69  elegant than thi
a630: 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  s static analysi
a640: 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a  s (i.e..      **
a650: 20 73 74 6f 72 65 20 74 68 65 20 74 79 70 65 20   store the type 
a660: 6f 66 20 71 75 65 72 79 20 61 73 20 70 61 72 74  of query as part
a670: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61 74   of the compliat
a680: 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74 20  ion phase), but 
a690: 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69  .      ** handli
a6a0: 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49  ng malloc() or I
a6b0: 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61 20 66  O failure is a f
a6c0: 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64  airly obscure ed
a6d0: 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20 20 20  ge case so .    
a6e0: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 72 6f    ** this is pro
a6f0: 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20 54 6f  bably easier. To
a700: 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61 6e 20  do: Might be an 
a710: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
a720: 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  educe .      ** 
a730: 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65 72 79  code size a very
a740: 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68   small amount th
a750: 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  ough....      */
a760: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74 52 65  .      int notRe
a770: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
a780: 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e    int isStatemen
a790: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  t = 0;.      ass
a7a0: 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d  ert(p->aOp || p-
a7b0: 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20  >nOp==0);.      
a7c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a7d0: 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  p; i++){ .      
a7e0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70    switch( p->aOp
a7f0: 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  [i].opcode ){.  
a800: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
a810: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20  Transaction:.   
a820: 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61 64           notRead
a830: 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69  Only |= p->aOp[i
a840: 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ].p2;.          
a850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a860: 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61 74 65     case OP_State
a870: 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ment:.          
a880: 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20    isStatement = 
a890: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
a8a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
a8b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20        }..   .   
a8c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
a8d0: 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
a8e0: 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20  , we need do no 
a8f0: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e  rollback at all.
a900: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
a910: 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74    ** proceed wit
a920: 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61  h the special ha
a930: 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  ndling..      */
a940: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74 52 65  .      if( notRe
a950: 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
a960: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
a970: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
a980: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc==SQLITE_IOE
a990: 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20 69 73  RR_BLOCKED && is
a9a0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
a9b0: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
a9c0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a9d0: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  ackStmt;.       
a9e0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a9f0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
aa00: 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72 63 3d  } else if( (mrc=
aa10: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
aa20: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
aa30: 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e  L) && isStatemen
aa40: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  t ){.          x
aa50: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
aa60: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b  reeRollbackStmt;
aa70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
aa80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
aa90: 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
aaa0: 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
aab0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
aac0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
aad0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
aae0: 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
aaf0: 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
ab00: 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
ab10: 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
ab20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ab30: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
ab40: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
ab50: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
ab60: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
ab70: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
ab80: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
ab90: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
aba0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
abb0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
abc0: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
abd0: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
abe0: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
abf0: 63 74 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e  ctive vdbe, then
ac00: 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69  .    ** we do ei
ac10: 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
ac20: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
ac30: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
ac40: 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
ac50: 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
ac60: 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
ac70: 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
ac80: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
ac90: 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
aca0: 76 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20  ve has occured. 
acb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
acc0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26  db->autoCommit &
acd0: 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  & db->activeVdbe
ace0: 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Cnt==1 ){.      
acf0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
ad00: 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
ad10: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
ad20: 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
ad30: 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
ad40: 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
ad50: 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
ad60: 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72   and the vdbe pr
ad70: 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20  ogram was .     
ad80: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
ad90: 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
ada0: 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e  AIL' constraint.
adb0: 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
adc0: 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  mmit .        **
add0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
ade0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
adf0: 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f   int rc = vdbeCo
ae00: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  mmit(db);.      
ae10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ae20: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
ae30: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
ae40: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
ae50: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
ae60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ae70: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
ae80: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
ae90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
aea0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
aeb0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
aec0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
aed0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  db);.        }el
aee0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
aef0: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
af00: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
af10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
af30: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
af40: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
af50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46     }else if( !xF
af60: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  unc ){.      if(
af70: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
af80: 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
af90: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
afa0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
afb0: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29  penedStatement )
afc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
afd0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
afe0: 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20  CommitStmt;.    
aff0: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
b000: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
b010: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
b020: 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63  ){.        xFunc
b030: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
b040: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
b050: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b060: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
b070: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
b080: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
b090: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
b0a0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
b0b0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
b0c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b0d0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
b0e0: 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  xFunc is not NUL
b0f0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e  L, then it is on
b100: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
b110: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72  eRollbackStmt or
b120: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
b130: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20  treeCommitStmt. 
b140: 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20  Call it once on 
b150: 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66  each backend. If
b160: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b170: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
b180: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
b190: 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  till SQLITE_OK, 
b1a0: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
b1b0: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ode to the new. 
b1c0: 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75     ** error valu
b1d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
b1e0: 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20  sert(!xFunc ||. 
b1f0: 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69       xFunc==sqli
b200: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
b210: 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e  mt ||.      xFun
b220: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52  c==sqlite3BtreeR
b230: 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20  ollbackStmt.    
b240: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
b250: 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e  xFunc && i<db->n
b260: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
b270: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42   int rc;.      B
b280: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
b290: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
b2a0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
b2b0: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28       rc = xFunc(
b2c0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
b2d0: 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d  ( rc && (p->rc==
b2e0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
b2f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
b300: 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20  RAINT) ){.      
b310: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b320: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b330: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
b340: 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
b350: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b360: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
b370: 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
b380: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
b390: 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 73 74  ELETE and the st
b3a0: 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d  atement was comm
b3b0: 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  itted, .    ** s
b3c0: 65 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  et the change co
b3d0: 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
b3e0: 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
b3f0: 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d  CntOn && p->pc>=
b400: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
b410: 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d  xFunc || xFunc==
b420: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
b430: 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  itStmt ){.      
b440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b450: 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
b460: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
b470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b480: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
b490: 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
b4a0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
b4b0: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
b4c0: 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61    .    /* Rollba
b4d0: 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79  ck or commit any
b4e0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
b4f0: 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a  that occurred. *
b500: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21  /.    if( p->rc!
b510: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62  =SQLITE_OK && db
b520: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
b530: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
b540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
b550: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
b560: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  (db, 0);.      d
b570: 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e  b->flags = (db->
b580: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49  flags | SQLITE_I
b590: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20  nternChanges);. 
b5a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
b5b0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
b5c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
b5d0: 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76  eeMutexArrayLeav
b5e0: 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20  e(&p->aMutex);. 
b5f0: 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
b600: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
b610: 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
b620: 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
b630: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
b640: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
b650: 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
b660: 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70  beCnt--;.  }.  p
b670: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
b680: 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
b690: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
b6a0: 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  db);.  if( p->db
b6b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b6c0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
b6d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
b6e0: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
b6f0: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74  eCnt(db);..  ret
b700: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b710: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
b720: 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
b730: 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
b740: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
b750: 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
b760: 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
b770: 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
b780: 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
b790: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
b7a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
b7b0: 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
b7c0: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
b7d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b7e0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
b7f0: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
b800: 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
b810: 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
b820: 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
b830: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
b840: 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
b850: 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
b860: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
b870: 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
b880: 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
b890: 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
b8a0: 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
b8b0: 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
b8c0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
b8d0: 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
b8e0: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
b8f0: 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
b900: 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
b910: 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
b920: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
b930: 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
b940: 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
b950: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
b960: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b970: 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
b980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b990: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
b9a0: 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
b9b0: 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
b9c0: 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
b9d0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
b9e0: 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
b9f0: 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
ba00: 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
ba10: 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
ba20: 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
ba30: 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  */.  (void)sqlit
ba40: 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a  e3SafetyOn(db);.
ba50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
ba60: 74 28 70 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  t(p);.  (void)sq
ba70: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
ba80: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  b);..  /* If the
ba90: 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
baa0: 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
bab0: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
bac0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
bad0: 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
bae0: 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
baf0: 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
bb00: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
bb10: 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
bb20: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
bb30: 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
bb40: 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
bb50: 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
bb60: 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
bb70: 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
bb80: 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
bb90: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
bba0: 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
bbb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
bbc0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
bbd0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
bbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
bbf0: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
bc00: 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53  ,-1,p->zErrMsg,S
bc10: 51 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69 74  QLITE_UTF8,sqlit
bc20: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
bc30: 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d  db->errCode = p-
bc40: 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  >rc;.      p->zE
bc50: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
bc60: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
bc70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
bc80: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
bc90: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
bca0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
bcb0: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
bcc0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
bcd0: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
bce0: 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
bcf0: 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
bd00: 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
bd10: 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
bd20: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
bd30: 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
bd40: 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
bd50: 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
bd60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
bd70: 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
bd80: 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
bd90: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
bda0: 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
bdb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
bdc0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
bdd0: 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
bde0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
bdf0: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
be00: 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
be10: 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72  UTF8, sqlite3_fr
be20: 65 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  ee);.    p->zErr
be30: 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
be40: 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
be50: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
be60: 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
be70: 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
be80: 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
be90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
bea0: 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
beb0: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
bec0: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
bed0: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
bee0: 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
bef0: 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
bf00: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
bf10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
bf20: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
bf30: 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
bf40: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
bf50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
bf60: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
bf70: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
bf80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
bf90: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
bfa0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
bfb0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
bfc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
bfd0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
bfe0: 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
bff0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
c000: 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
c010: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
c020: 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
c030: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
c040: 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
c050: 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
c060: 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
c070: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c080: 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
c090: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
c0a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
c0b0: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
c0c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
c0d0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
c0e0: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
c0f0: 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72  aborted = 0;.  r
c100: 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
c110: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
c120: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
c130: 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
c140: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
c150: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
c160: 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
c170: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
c180: 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
c190: 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
c1a0: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
c1b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c1c0: 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
c1d0: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
c1e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
c1f0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
c200: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
c210: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
c220: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
c230: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
c240: 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
c250: 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
c260: 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
c270: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d    }else if( p->m
c280: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
c290: 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74  _INIT ){.    ret
c2a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
c2b0: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
c2c0: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
c2d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c2e0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
c2f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
c300: 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
c310: 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
c320: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
c330: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
c340: 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
c350: 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
c360: 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
c370: 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
c380: 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
c390: 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
c3a0: 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
c3b0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
c3c0: 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
c3d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
c3e0: 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
c3f0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
c400: 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
c410: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
c420: 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
c430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
c440: 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
c450: 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
c460: 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
c470: 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
c480: 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75  &(1<<i))) && pAu
c490: 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
c4a0: 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
c4b0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
c4c0: 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
c4d0: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
c4e0: 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
c4f0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
c500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
c510: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
c520: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c530: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
c540: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
c550: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c560: 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  n;.  Cleanup(p);
c570: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
c580: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
c590: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
c5a0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
c5b0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70  assert( p->db->p
c5c0: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Vdbe==p );.    p
c5d0: 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d  ->db->pVdbe = p-
c5e0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
c5f0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
c600: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
c610: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
c620: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29  }.  if( p->aOp )
c630: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
c640: 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p->aOp;.    for(
c650: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
c660: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
c670: 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34    freeP4(pOp->p4
c680: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
c690: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c6a0: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
c6b0: 74 65 33 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43  te3_free(pOp->zC
c6c0: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
c6d0: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73      .    }.    s
c6e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c6f0: 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  Op);.  }.  relea
c700: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
c710: 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
c720: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c730: 61 4c 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70  aLabel);.  if( p
c740: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  ->aMem ){.    sq
c750: 6c 69 74 65 33 5f 66 72 65 65 28 26 70 2d 3e 61  lite3_free(&p->a
c760: 4d 65 6d 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 72  Mem[1]);.  }.  r
c770: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
c780: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
c790: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c7a0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_N);.  sqlite3_
c7b0: 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  free(p->aColName
c7c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c7d0: 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d  e(p->zSql);.  p-
c7e0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
c7f0: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
c800: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
c810: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
c820: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
c830: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
c840: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
c850: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
c860: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
c870: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
c880: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
c890: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
c8a0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
c8b0: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
c8c0: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
c8d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
c8e0: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
c8f0: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
c900: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
c910: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
c920: 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
c930: 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
c940: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
c950: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
c960: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
c970: 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
c980: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c990: 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72  eeMoveto(p->pCur
c9a0: 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
c9b0: 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
c9c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c9d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a  return rc;.    *
c9e0: 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b  p->pIncrKey = 0;
c9f0: 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
ca00: 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e  d = keyToInt(p->
ca10: 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20  movetoTarget);. 
ca20: 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
ca30: 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20  id = res==0;.   
ca40: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
ca50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ca60: 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75  BtreeNext(p->pCu
ca70: 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
ca80: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
ca90: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66  rn rc;.    }.#if
caa0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
cab0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
cac0: 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
cad0: 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
cae0: 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
caf0: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
cb00: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
cb10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
cb20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cb30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
cb40: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
cb50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
cb60: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
cb70: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
cb80: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
cb90: 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29  VdbeSerialRead()
cba0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
cbb0: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
cbc0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57  lite3VdbeSerialW
cbd0: 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  rite().**.** enc
cbe0: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
cbf0: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
cc00: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
cc10: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
cc20: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
cc30: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
cc40: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
cc50: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
cc60: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
cc70: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
cc80: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
cc90: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
cca0: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
ccb0: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
ccc0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
ccd0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
cce0: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
ccf0: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
cd00: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
cd10: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
cd20: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
cd30: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
cd40: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
cd50: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
cd60: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
cd70: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
cd80: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
cd90: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
cda0: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
cdb0: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
cdc0: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
cdd0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
cde0: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
cdf0: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
ce00: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
ce10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
ce20: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
ce30: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
ce40: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
ce50: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
ce60: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
ce70: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
ce80: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
ce90: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
cea0: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
ceb0: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
ced0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cee0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
cef0: 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
cf00: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
cf10: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
cf20: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
cf30: 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
cf60: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
cf70: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
cf80: 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
cf90: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
cfa0: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
cfd0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
cfe0: 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
d000: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
d010: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
d020: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
d030: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
d040: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
d050: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
d080: 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
d090: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
d0a0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
d0b0: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
d0c0: 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
d0d0: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
d0e0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
d0f0: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
d100: 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
d110: 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
d140: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
d150: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
d160: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
d170: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
d180: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
d190: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
d1a0: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
d1b0: 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
d1c0: 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
d1d0: 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
d1e0: 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
d1f0: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
d200: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
d210: 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
d220: 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
d230: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
d240: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
d250: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
d260: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
d270: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d280: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
d290: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
d2a0: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
d2b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
d2c0: 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  int n;..  if( fl
d2d0: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
d2e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d2f0: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
d300: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
d310: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
d320: 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
d330: 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
d340: 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
d350: 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
d360: 29 30 78 30 30 30 30 31 30 30 30 29 3c 3c 33 32  )0x00001000)<<32
d370: 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
d380: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
d390: 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66  u64 u;.    if( f
d3a0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26  ile_format>=4 &&
d3b0: 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20   (i&1)==i ){.   
d3c0: 20 20 20 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20     return 8+i;. 
d3d0: 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30     }.    u = i<0
d3e0: 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69   ? -i : i;.    i
d3f0: 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75  f( u<=127 ) retu
d400: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 1;.    if( u<
d410: 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20  =32767 ) return 
d420: 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33  2;.    if( u<=83
d430: 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33  88607 ) return 3
d440: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  ;.    if( u<=214
d450: 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e  7483647 ) return
d460: 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d   4;.    if( u<=M
d470: 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72  AX_6BYTE ) retur
d480: 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 5;.    return 
d490: 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
d4a0: 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
d4b0: 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
d4c0: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
d4d0: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
d4e0: 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
d4f0: 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
d500: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
d510: 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
d520: 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  .i;.  }.  assert
d530: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( n>=0 );.  retu
d540: 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
d550: 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
d560: 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
d570: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
d580: 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
d590: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
d5a0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
d5b0: 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74  ial-type..*/.int
d5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d5d0: 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
d5e0: 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
d5f0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
d600: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
d610: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
d620: 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
d630: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
d640: 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
d650: 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
d660: 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
d670: 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
d680: 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
d690: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
d6a0: 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
d6b0: 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
d6c0: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
d6d0: 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
d6e0: 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
d6f0: 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
d700: 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
d710: 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
d720: 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
d730: 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
d740: 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
d750: 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
d760: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
d770: 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
d780: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
d790: 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
d7a0: 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
d7b0: 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
d7c0: 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
d7d0: 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
d7e0: 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
d7f0: 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
d800: 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
d810: 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
d820: 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
d830: 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
d840: 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
d850: 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
d860: 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
d870: 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
d880: 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
d890: 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
d8a0: 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
d8b0: 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
d8c0: 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
d8d0: 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
d8e0: 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
d8f0: 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
d900: 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
d910: 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
d920: 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
d930: 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
d940: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
d950: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
d960: 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
d970: 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
d980: 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
d990: 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
d9a0: 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
d9b0: 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
d9c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
d9d0: 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
d9e0: 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
d9f0: 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
da00: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
da10: 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
da20: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
da30: 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
da40: 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
da50: 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
da60: 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
da70: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
da80: 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
da90: 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
daa0: 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
dab0: 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
dac0: 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
dad0: 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
dae0: 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
daf0: 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
db00: 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
db10: 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
db20: 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
db30: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
db40: 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
db50: 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
db60: 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
db70: 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
db80: 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
db90: 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
dba0: 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
dbb0: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
dbc0: 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
dbd0: 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
dbe0: 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
dbf0: 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
dc00: 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
dc10: 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
dc20: 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
dc30: 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
dc40: 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
dc50: 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
dc60: 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
dc70: 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
dc80: 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
dc90: 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
dca0: 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
dcb0: 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
dcc0: 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
dcd0: 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
dce0: 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
dcf0: 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
dd00: 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
dd10: 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
dd20: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
dd30: 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
dd40: 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
dd50: 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
dd60: 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
dd70: 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
dd80: 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
dd90: 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
dda0: 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
ddb0: 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
ddc0: 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
ddd0: 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
dde0: 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
ddf0: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
de00: 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
de10: 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
de20: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
de30: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
de40: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
de50: 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
de60: 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
de70: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
de80: 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
de90: 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
dea0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
deb0: 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
dec0: 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
ded0: 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
dee0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
def0: 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
df00: 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
df10: 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
df20: 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
df30: 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79   nBuf must alway
df40: 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e  s be.** large en
df50: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
df60: 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20   entire field.  
df70: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66  Except, if the f
df80: 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f  ield is.** a blo
df90: 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69  b with a zero-fi
dfa0: 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20  lled tail, then 
dfb0: 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a  buf[] might be j
dfc0: 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a  ust the right.**
dfd0: 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76   size to hold ev
dfe0: 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20  erything except 
dff0: 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c  for the zero-fil
e000: 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75  led tail.  If bu
e010: 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62  f[].** is only b
e020: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
e030: 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70  d the non-zero p
e040: 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79  refix, then only
e050: 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70   write that.** p
e060: 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d  refix into buf[]
e070: 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20  .  But if buf[] 
e080: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
e090: 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
e0a0: 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74  .** prefix and t
e0b0: 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69  he tail then wri
e0c0: 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e  te the prefix an
e0d0: 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74  d set the tail t
e0e0: 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a  o all.** zeros..
e0f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
e100: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
e110: 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
e120: 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
e130: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
e140: 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
e150: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
e160: 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
e170: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
e180: 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
e190: 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
e1a0: 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69   in buf[]..*/ .i
e1b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
e1c0: 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
e1d0: 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a   int nBuf, Mem *
e1e0: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
e1f0: 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65  ormat){.  u32 se
e200: 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
e210: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e220: 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72  e(pMem, file_for
e230: 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  mat);.  int len;
e240: 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
e250: 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
e260: 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
e270: 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
e280: 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
e290: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
e2a0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
e2b0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e2c0: 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
e2d0: 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a  eof(pMem->r) );.
e2e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
e2f0: 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f   &pMem->r, sizeo
e300: 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
e310: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e320: 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
e330: 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
e340: 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
e350: 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
e360: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
e370: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
e380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e  .    assert( len
e390: 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68  <=nBuf );.    wh
e3a0: 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
e3b0: 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78    buf[i] = (v&0x
e3c0: 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
e3d0: 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
e3e0: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
e3f0: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
e400: 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
e410: 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
e420: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
e430: 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
e440: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
e450: 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20 20 20  Mem->u.i:0).    
e460: 20 20 20 20 20 20 20 20 20 3d 3d 20 73 71 6c 69           == sqli
e470: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e480: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
e490: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
e4a0: 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29   pMem->n<=nBuf )
e4b0: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
e4c0: 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
e4d0: 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
e4e0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  n);.    if( pMem
e4f0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
e500: 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20  ro ){.      len 
e510: 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20  += pMem->u.i;.  
e520: 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66      if( len>nBuf
e530: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
e540: 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a  = nBuf;.      }.
e550: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75        memset(&bu
e560: 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c  f[pMem->n], 0, l
e570: 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20  en-pMem->n);.   
e580: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
e590: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
e5a0: 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
e5b0: 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
e5c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
e5d0: 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
e5e0: 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
e5f0: 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
e600: 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
e610: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
e620: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
e630: 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
e640: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
e650: 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20  s read..*/ .int 
e660: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e670: 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
e680: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
e690: 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
e6a0: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
e6b0: 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
e6c0: 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
e6d0: 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
e6e0: 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
e6f0: 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
e700: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
e710: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
e720: 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
e730: 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
e740: 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
e750: 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
e760: 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
e770: 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
e780: 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
e790: 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
e7a0: 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
e7b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
e7c0: 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
e7d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e7e0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
e7f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e800: 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
e810: 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-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 73 69 67 6e  Mem->u.i = (sign
e840: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
e850: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e860: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e870: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
e880: 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
e890: 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
e8a0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e8b0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
e8c0: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
e8d0: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
e8e0: 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
e8f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
e900: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
e910: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e920: 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
e930: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
e940: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
e950: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
e960: 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
e970: 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
e980: 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
e990: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e9a0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
e9b0: 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
e9c0: 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
e9d0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
e9e0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
e9f0: 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32  u.i = (buf[0]<<2
ea00: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
ea10: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
ea20: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
ea30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
ea40: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
ea50: 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
ea60: 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
ea70: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
ea80: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  ger */.      u64
ea90: 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63   x = (((signed c
eaa0: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
eab0: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
eac0: 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c  u32 y = (buf[2]<
ead0: 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c  <24) | (buf[3]<<
eae0: 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38  16) | (buf[4]<<8
eaf0: 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20  ) | buf[5];.    
eb00: 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
eb10: 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  y;.      pMem->u
eb20: 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
eb30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
eb40: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
eb50: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
eb60: 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
eb70: 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
eb80: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
eb90: 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
eba0: 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
ebb0: 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  t */.      u64 x
ebc0: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23  ;.      u32 y;.#
ebd0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
ebe0: 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
ebf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
ec00: 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
ec10: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
ec20: 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
ec30: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
ec40: 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
ec50: 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  .      ** byte o
ec60: 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
ec70: 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
ec80: 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
ec90: 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  AT is.      ** d
eca0: 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
ecb0: 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
ecc0: 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
ecd0: 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20  are mixed.      
ece0: 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20  ** endian..     
ecf0: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
ed00: 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
ed10: 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
ed20: 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61  )<<32;.      sta
ed30: 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
ed40: 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20   r1 = 1.0;.     
ed50: 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
ed60: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
ed70: 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
ed80: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
ed90: 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
eda0: 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
edb0: 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
edc0: 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
edd0: 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b  .      x = (buf[
ede0: 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
edf0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
ee00: 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
ee10: 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d       y = (buf[4]
ee20: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c  <<24) | (buf[5]<
ee30: 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c  <16) | (buf[6]<<
ee40: 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20  8) | buf[7];.   
ee50: 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
ee60: 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   y;.      if( se
ee70: 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
ee80: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e          pMem->u.
ee90: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
eea0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
eeb0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
eec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eed0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
eee0: 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
eef0: 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b  f(pMem->r)==8 );
ef00: 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78  .        swapMix
ef10: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
ef20: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
ef30: 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73  (&pMem->r, &x, s
ef40: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
ef50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ef60: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
ef70: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
ef80: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  8;.    }.    cas
ef90: 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
efa0: 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
efb0: 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
efc0: 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  r 1 */.      pMe
efd0: 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
efe0: 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
eff0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f000: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
f010: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
f020: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
f030: 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61  int len = (seria
f040: 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
f050: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
f060: 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20  har *)buf;.     
f070: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a   pMem->n = len;.
f080: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c        pMem->xDel
f090: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f0a0: 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31  serial_type&0x01
f0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
f0c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
f0d0: 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  r | MEM_Ephem;. 
f0e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f0f0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f100: 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d  = MEM_Blob | MEM
f110: 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  _Ephem;.      }.
f120: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e        return len
f130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f140: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
f150: 20 54 68 65 20 68 65 61 64 65 72 20 6f 66 20 61   The header of a
f160: 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73   record consists
f170: 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20 76   of a sequence v
f180: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
f190: 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73  ntegers..** Thes
f1a0: 65 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 61  e integers are a
f1b0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d 61  lmost always sma
f1c0: 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f 64  ll and are encod
f1d0: 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62  ed as a single b
f1e0: 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  yte..** The foll
f1f0: 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65  owing macro take
f200: 73 20 61 64 76 61 6e 74 61 67 65 20 74 68 69 73  s advantage this
f210: 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64 65   fact to provide
f220: 20 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a 2a   a fast decode.*
f230: 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  * of the integer
f240: 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68 65  s in a record he
f250: 61 64 65 72 2e 20 20 49 74 20 69 73 20 66 61 73  ader.  It is fas
f260: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
f270: 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65  on case.** where
f280: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   the integer is 
f290: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20 20  a single byte.  
f2a0: 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73  It is a little s
f2b0: 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a 2a  lower when the.*
f2c0: 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74 77 6f  * integer is two
f2d0: 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e 20   or more bytes. 
f2e0: 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74 20   But overall it 
f2f0: 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  is faster..**.**
f300: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   The following e
f310: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65  xpressions are e
f320: 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a  quivalent:.**.**
f330: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
f340: 47 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c 20  GetVarint32( A, 
f350: 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20  &B );.**.**     
f360: 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20 41  x = GetVarint( A
f370: 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65  , B );.**.*/.#de
f380: 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28 41  fine GetVarint(A
f390: 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29 29  ,B)  ((B = *(A))
f3a0: 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71 6c  <=0x7f ? 1 : sql
f3b0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
f3c0: 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  A, &B))../*.** T
f3d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
f3e0: 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
f3f0: 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
f400: 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66  x records specif
f410: 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79  ied by .** {nKey
f420: 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e  1, pKey1} and {n
f430: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65  Key2, pKey2}, re
f440: 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69  turning a negati
f450: 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
f460: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
f470: 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
f480: 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
f490: 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
f4a0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b  greater than {nK
f4b0: 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f  ey2, pKey2}.  Bo
f4c0: 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  th Key1 and Key2
f4d0: 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74   must be byte st
f4e0: 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65  rings.** compose
f4f0: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
f500: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
f510: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a 2a 2a   the VDBE..**.**
f520: 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
f530: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
f540: 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
f550: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
f560: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 6c  .** But if the l
f570: 65 6e 67 74 68 73 20 64 69 66 66 65 72 2c 20 4b  engths differ, K
f580: 65 79 32 20 6d 75 73 74 20 62 65 20 74 68 65 20  ey2 must be the 
f590: 73 68 6f 72 74 65 72 20 6f 66 20 74 68 65 20 74  shorter of the t
f5a0: 77 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  wo..*/.int sqlit
f5b0: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
f5c0: 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65  are(.  void *use
f5d0: 72 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65  rData,.  int nKe
f5e0: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
f5f0: 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b  pKey1, .  int nK
f600: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
f610: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49  *pKey2.){.  KeyI
f620: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
f630: 28 4b 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61  (KeyInfo*)userDa
f640: 74 61 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32  ta;.  u32 d1, d2
f650: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
f660: 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
f670: 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
f680: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
f690: 64 78 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20  dx1, idx2;      
f6a0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
f6b0: 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
f6c0: 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
f6d0: 20 20 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a    u32 szHdr1, sz
f6e0: 48 64 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Hdr2;  /* Number
f6f0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
f700: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
f710: 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
f720: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
f730: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
f740: 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
f750: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f760: 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63  har *)pKey1;.  c
f770: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f780: 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e  ar *aKey2 = (con
f790: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f7a0: 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d   *)pKey2;..  Mem
f7b0: 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d   mem1;.  Mem mem
f7c0: 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  2;.  mem1.enc = 
f7d0: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
f7e0: 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
f7f0: 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e  nfo->db;.  mem1.
f800: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d  flags = 0;.  mem
f810: 32 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  2.enc = pKeyInfo
f820: 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 64 62  ->enc;.  mem2.db
f830: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
f840: 0a 20 20 6d 65 6d 32 2e 66 6c 61 67 73 20 3d 20  .  mem2.flags = 
f850: 30 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 47  0;.  .  idx1 = G
f860: 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c 20  etVarint(aKey1, 
f870: 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
f880: 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d  szHdr1;.  idx2 =
f890: 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 32   GetVarint(aKey2
f8a0: 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20  , szHdr2);.  d2 
f8b0: 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65  = szHdr2;.  nFie
f8c0: 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
f8d0: 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
f8e0: 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
f8f0: 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20  dx2<szHdr2 ){.  
f900: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
f910: 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69  e1;.    u32 seri
f920: 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f  al_type2;..    /
f930: 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
f940: 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
f950: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
f960: 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
f970: 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69   idx1 += GetVari
f980: 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  nt( aKey1+idx1, 
f990: 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
f9a0: 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
f9b0: 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
f9c0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
f9d0: 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
f9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20  break;.    idx2 
f9f0: 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b  += GetVarint( aK
fa00: 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61 6c  ey2+idx2, serial
fa10: 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69 66  _type2 );.    if
fa20: 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73  ( d2>=nKey2 && s
fa30: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
fa40: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
fa50: 79 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype2)>0 ) break;
fa60: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
fa70: 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
fa80: 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
fa90: 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
faa0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
fab0: 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
fac0: 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
fad0: 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71  1);.    d2 += sq
fae0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
faf0: 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73  et(&aKey2[d2], s
fb00: 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65  erial_type2, &me
fb10: 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m2);..    /* Do 
fb20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
fb30: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
fb40: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
fb50: 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69  (&mem1, &mem2, i
fb60: 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
fb70: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
fb80: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e  );.    if( mem1.
fb90: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 20  flags&MEM_Dyn ) 
fba0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
fbb0: 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20  lease(&mem1);.  
fbc0: 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73    if( mem2.flags
fbd0: 26 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74  &MEM_Dyn ) sqlit
fbe0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
fbf0: 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28  (&mem2);.    if(
fc00: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
fc10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fc20: 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
fc30: 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  One of the keys 
fc40: 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
fc50: 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66  s, but all the f
fc60: 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
fc70: 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65   point.  ** were
fc80: 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69   equal. If the i
fc90: 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74  ncrKey flag is t
fca0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65  rue, then the se
fcb0: 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a  cond key is.  **
fcc0: 20 74 72 65 61 74 65 64 20 61 73 20 6c 61 72 67   treated as larg
fcd0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
fce0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
fcf0: 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65  pKeyInfo->incrKe
fd00: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
fd10: 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  -1;.    }else if
fd20: 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65  ( !pKeyInfo->pre
fd30: 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20  fixIsEqual ){.  
fd40: 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31      if( d1<nKey1
fd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fd60: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
fd70: 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a  if( d2<nKey2 ){.
fd80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
fd90: 20 20 2f 2a 20 4f 6e 6c 79 20 6f 63 63 75 72 73    /* Only occurs
fda0: 20 6f 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   on a corrupt da
fdb0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
fdc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fdd0: 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
fde0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
fdf0: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
fe00: 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
fe10: 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
fe20: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
fe30: 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
fe40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
fe50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
fe60: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64  gument is an ind
fe70: 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65  ex entry compose
fe80: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
fe90: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
fea0: 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e  ..** The last en
feb0: 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f  try in this reco
fec0: 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  rd should be an 
fed0: 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69  integer (specifi
fee0: 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  cally.** an inte
fef0: 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69  ger rowid).  Thi
ff00: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
ff10: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
ff20: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74  bytes in.** that
ff30: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74   integer..*/.int
ff40: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
ff50: 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38  owidLen(const u8
ff60: 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73   *aKey){.  u32 s
ff70: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
ff80: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
ff90: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
ffa0: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
ffb0: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
ffc0: 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69  rowid */..  sqli
ffd0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61  te3GetVarint32(a
ffe0: 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  Key, &szHdr);.  
fff0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
10000 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31  32(&aKey[szHdr-1
10010 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
10020 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10030 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
10040 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a  n(typeRowid);.}.
10050 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70    ../*.** pCur p
10060 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
10070 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
10080 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
10090 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
100a0 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
100b0 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
100c0 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
100d0 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
100e0 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
100f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
10100 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
10110 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
10120 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
10130 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10140 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f  IdxRowid(BtCurso
10150 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
10160 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
10170 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
10180 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
10190 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
101a0 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
101b0 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
101c0 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
101d0 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
101e0 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
101f0 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
10200 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
10210 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73    Mem m, v;..  s
10220 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
10230 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
10240 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
10250 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  Key<=0 ){.    re
10260 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10270 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
10280 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d  m.flags = 0;.  m
10290 2e 64 62 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  .db = 0;.  rc = 
102a0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
102b0 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
102c0 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d   nCellKey, 1, &m
102d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
102e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
102f0 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  }.  sqlite3GetVa
10300 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
10310 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69   &szHdr);.  sqli
10320 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28  te3GetVarint32((
10330 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
10340 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
10350 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
10360 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
10370 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
10380 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
10390 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
103a0 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
103b0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
103c0 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
103d0 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
103e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
103f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10400 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
10410 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
10420 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
10430 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
10440 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69  is point to agai
10450 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
10460 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f  tring in pKey (o
10470 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20  f length nKey). 
10480 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
10490 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
104a0 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
104b0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
104c0 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
104d0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
104e0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
104f0 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e  an pKey.  Return
10500 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
10510 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65  ccess..**.** pKe
10520 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  y is either crea
10530 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
10540 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
10550 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
10560 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
10570 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
10580 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
10590 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
105a0 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
105b0 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ored as well..*/
105c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
105d0 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
105e0 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20   Cursor *pC,    
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10600 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
10610 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
10620 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
10630 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f  st u8 *pKey,   /
10640 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d  * The key to com
10650 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  pare */.  int *r
10660 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
10670 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
10680 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
10690 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
106a0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
106b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
106c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
106d0 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
106e0 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20  int lenRowid;.  
106f0 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  Mem m;..  sqlite
10700 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
10710 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
10720 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
10730 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  0 ){.    *res = 
10740 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
10750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d  LITE_OK;.  }.  m
10760 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61  .db = 0;.  m.fla
10770 67 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  gs = 0;.  rc = s
10780 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
10790 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
107a0 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  or, 0, nCellKey,
107b0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
107c0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
107d0 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  rc;.  }.  lenRow
107e0 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
107f0 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a  IdxRowidLen((u8*
10800 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20  )m.z);.  *res = 
10810 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
10820 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65  dCompare(pC->pKe
10830 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f  yInfo, m.n-lenRo
10840 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20  wid, m.z, nKey, 
10850 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  pKey);.  sqlite3
10860 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
10870 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
10880 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10890 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
108a0 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
108b0 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
108c0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
108d0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
108e0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
108f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
10900 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
10910 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
10920 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
10930 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
10940 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10950 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
10960 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
10970 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
10980 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
10990 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
109a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
109b0 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
109c0 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
109d0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
109e0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
109f0 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
10a00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10a10 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
10a20 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
10a30 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
10a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
10a50 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
10a60 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
10a70 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
10a80 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
10a90 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
10aa0 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
10ab0 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
10ac0 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
10ad0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
10ae0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
10af0 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
10b00 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
10b10 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
10b20 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
10b30 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
10b40 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
10b50 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
10b60 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
10b70 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
10b80 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
10b90 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
10ba0 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
10bb0 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
10bc0 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
10bd0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
10be0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
10bf0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
10c00 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
10c10 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
10c20 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
10c30 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
10c40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
10c50 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
10c60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
10c70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
10c80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10c90 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
10ca0 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
10cb0 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
10cc0 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a     eturn v->db;.}.