/ Hex Artifact Content
Login

Artifact ae45ffeee9f503e2cce2f1db51893934e7c669a5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0660: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65  mt *pStmt){.  re
0670: 74 75 72 6e 20 28 28 56 64 62 65 20 2a 29 70 53  turn ((Vdbe *)pS
0680: 74 6d 74 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f  tmt)->zSql;.}../
0690: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06a0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06b0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06d0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06e0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06f0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0710: 0a 20 20 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74  .  int nTmp;.  t
0720: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0730: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0740: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0750: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0760: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0770: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0780: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0790: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07a0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07b0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07c0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07d0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07e0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07f0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0800: 70 3b 0a 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e  p;.  nTmp = pA->
0810: 6e 53 71 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c  nSql;.  pA->nSql
0820: 20 3d 20 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pB->nSql;.  p
0830: 42 2d 3e 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a  B->nSql = nTmp;.
0840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0850: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0860: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0870: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0880: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0890: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
08a0: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
08b0: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
08c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
08d0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
08e0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  y so that it con
08f0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 4e  tains at least N
0900: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  .** elements..**
0910: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0920: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0930: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0940: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a  ing the array,.*
0950: 2a 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  * Vdbe.aOp and V
0960: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0970: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74  ain unchanged (t
0980: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a  his is so that.*
0990: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  * any opcodes al
09a0: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
09b0: 63 61 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79  can be correctly
09c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20   deallocated.** 
09d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
09e0: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
09f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a00: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56   resizeOpArray(V
0a10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
0a20: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0a30: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0a40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70  p->nOpAlloc;.  p
0a50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a60: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a70: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0a80: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0a90: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0aa0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ab0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  Op = pNew;.    i
0ac0: 66 28 20 4e 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a  f( N>oldSize ){.
0ad0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
0ae0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
0af0: 2c 20 28 4e 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  , (N-oldSize)*si
0b00: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 7d  zeof(Op));.    }
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0b20: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b30: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b40: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b50: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b60: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0b80: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0b90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0ba0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bd0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0bf0: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c10: 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20  *    p1, p2, p3 
0c20: 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a       Operands.**
0c30: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
0c40: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
0c50: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0c60: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0c70: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0c80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0c90: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0ca0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0cb0: 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72  f the P4.** oper
0cc0: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64  te3VdbeAddOp3(Vd
0ce0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0cf0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
0d00: 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p3){.  int i;
0d10: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
0d20: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  .  i = p->nOp;. 
0d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0d40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0d50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
0d60: 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20  OpAlloc<=i ){.  
0d70: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
0d80: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32  p, p->nOpAlloc*2
0d90: 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28   + 100);.    if(
0da0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
0db0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  iled ){.      re
0dc0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
0dd0: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
0de0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
0df0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
0e00: 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20  = op;.  pOp->p1 
0e10: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0e20: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0e30: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0e40: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0e50: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0e60: 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  D;.  p->expired 
0e70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
0e80: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 73  TE_DEBUG.  if( s
0e90: 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f  qlite3_vdbe_addo
0ea0: 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69 74 65  p_trace ) sqlite
0eb0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
0ec0: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
0ed0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
0ee0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
0ef0: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
0f00: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
0f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
0f20: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
0f30: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
0f40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
0f50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0f60: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
0f70: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
0f80: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
0f90: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
0fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
0fb0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0fc0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
0fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
0fe0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
0ff0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1000: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  }.../*.** Add an
1010: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1020: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1030: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
1040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1050: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1060: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1070: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1080: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1090: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
10b0: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
10c0: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
10d0: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
10e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1100: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1110: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1120: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1130: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
1150: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1160: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1170: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
1180: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
1190: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
11a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11b0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
11c0: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
11d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
11e0: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
11f0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1200: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1210: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1220: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1230: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1240: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1250: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1260: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1270: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1280: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1290: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
12a0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
12b0: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
12c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
12d0: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
12e0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
12f0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
1300: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
1310: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
1320: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
1330: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1340: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1350: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1360: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1370: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1380: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1390: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
13a0: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
13b0: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
13c0: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
13d0: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
13e0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
13f0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
1400: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
1410: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
1420: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
1430: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1440: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1460: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1470: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1490: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
14a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
14b0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
14c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
14d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
14e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
14f0: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
1500: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
1510: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
1520: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
1530: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1540: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1550: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1560: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1590: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
15a0: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
15b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
15c0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
15d0: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
15e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
15f0: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1600: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1610: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
1620: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
1630: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
1640: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
1650: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1660: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1670: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1680: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1690: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16a0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
16d0: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
16e0: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
16f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1700: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1710: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
1720: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
1730: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1740: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1750: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20  }.}../*.** Loop 
1770: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
1780: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
1790: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
17a0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  re negative..** 
17b0: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
17c0: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
17d0: 6f 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62  olve the label b
17e0: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32  y setting the P2
17f0: 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73  .** value to its
1800: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
1810: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
1820: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1830: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
1840: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
1850: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
1860: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
1870: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
1880: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
1890: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
18a0: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
18b0: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
18c0: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
18d0: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
18e0: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
18f0: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
1900: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
1910: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
1920: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
1930: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65  **.** The intege
1940: 72 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20  r *pMaxStack is 
1950: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1960: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  um number of vdb
1970: 65 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69  e stack.** entri
1980: 65 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61  es that static a
1990: 6e 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20  nalysis reveals 
19a0: 74 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67  this program mig
19b0: 68 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ht need..**.** T
19c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
19d0: 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   does the follow
19e0: 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ing optimization
19f0: 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a  :  It scans for.
1a00: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
1a10: 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65  that might cause
1a20: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
1a30: 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73  lback.  Such ins
1a40: 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  tructions.** are
1a50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
1a60: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
1a70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
1a80: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
1a90: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
1aa0: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
1ab0: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
1ac0: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49  _VRename.**.** I
1ad0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1ae0: 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ction is found, 
1af0: 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65  then every State
1b00: 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ment instruction
1b10: 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20   .** is changed 
1b20: 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74  to a Noop.  In t
1b30: 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
1b40: 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73  d creating the s
1b50: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75  tatement .** jou
1b60: 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65  rnal file unnece
1b70: 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ssarily..*/.stat
1b80: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
1b90: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
1ba0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
1bb0: 67 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61  gs, int *pMaxSta
1bc0: 63 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ck){.  int i;.  
1bd0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30  int nMaxArgs = 0
1be0: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63  ;.  int nMaxStac
1bf0: 6b 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70  k = p->nOp;.  Op
1c00: 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c   *pOp;.  int *aL
1c10: 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c  abel = p->aLabel
1c20: 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74  ;.  int doesStat
1c30: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1c40: 30 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74  0;.  int hasStat
1c50: 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a  ementBegin = 0;.
1c60: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
1c70: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
1c80: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
1c90: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
1ca0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
1cb0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
1cc0: 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70  P_Function || op
1cd0: 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70  code==OP_AggStep
1ce0: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
1cf0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1d00: 4c 45 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70  LE.        || op
1d10: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
1d20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20  .#endif.    ){. 
1d30: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
1d40: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
1d50: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  Args = pOp->p2;.
1d60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
1d70: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b  code==OP_Halt ){
1d80: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1d90: 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  p1==SQLITE_CONST
1da0: 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32  RAINT && pOp->p2
1db0: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
1dc0: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
1dd0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
1de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1df0: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
1e00: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
1e10: 20 20 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e       hasStatemen
1e20: 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20  tBegin = 1;.    
1e30: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1e40: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a  ==OP_Destroy ){.
1e50: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
1e60: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
1e70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e80: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e90: 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
1ea0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
1eb0: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
1ec0: 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  _VRename ){.    
1ed0: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1ee0: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1ef0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1f00: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
1f10: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1f20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
1f30: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
1f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
1f50: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
1f60: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
1f70: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
1f80: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
1f90: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
1fa0: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
1fb0: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69   }.    if( !sqli
1fc0: 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73  te3VdbeOpcodeHas
1fd0: 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65 2c  Property(opcode,
1fe0: 20 4f 50 46 4c 47 5f 50 55 53 48 29 20 29 7b 0a   OPFLG_PUSH) ){.
1ff0: 20 20 20 20 20 20 6e 4d 61 78 53 74 61 63 6b 2d        nMaxStack-
2000: 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  -;.    }..    if
2010: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63  ( sqlite3VdbeOpc
2020: 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 6f  odeHasProperty(o
2030: 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d  pcode, OPFLG_JUM
2040: 50 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  P) && pOp->p2<0 
2050: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2060: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
2070: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
2080: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
2090: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
20a0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
20b0: 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29  _free(p->aLabel)
20c0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
20d0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
20e0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
20f0: 20 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e    *pMaxStack = n
2100: 4d 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20  MaxStack;..  /* 
2110: 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c  If we never roll
2120: 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
2130: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2140: 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  en statement.  *
2150: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  * transactions a
2160: 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  re not needed.  
2170: 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20  So change every 
2180: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a  OP_Statement.  *
2190: 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e  * opcode into an
21a0: 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20   OP_Noop.  This 
21b0: 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20  avoid a call to 
21c0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
21d0: 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68  lusive().  ** wh
21e0: 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ich can be expen
21f0: 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61  sive on some pla
2200: 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69  tforms..  */.  i
2210: 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  f( hasStatementB
2220: 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61  egin && !doesSta
2230: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29  tementRollback )
2240: 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d  {.    for(pOp=p-
2250: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
2260: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
2270: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2280: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
2290: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
22a0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
22b0: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
22c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
22d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22e0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
22f0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2300: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2310: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2320: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
2330: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
2340: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2350: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2360: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
2370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2380: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
2390: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
23a0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
23b0: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
23c0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
23d0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
23e0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
23f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2400: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
2410: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
2420: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
2430: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
2440: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
2450: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2460: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
2470: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
2480: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41  ){.    resizeOpA
2490: 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 2a 32  rray(p, p->nOp*2
24a0: 20 2b 20 6e 4f 70 29 3b 0a 20 20 7d 0a 20 20 69   + nOp);.  }.  i
24b0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
24c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
24d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
24e0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
24f0: 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20  f( nOp>0 ){.    
2500: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
2510: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
2520: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
2530: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
2540: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
2550: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
2560: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
2570: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
2580: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
2590: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
25a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
25b0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
25c0: 31 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  1;.      pOut->p
25d0: 32 20 3d 20 70 32 3c 30 20 3f 20 61 64 64 72 20  2 = p2<0 ? addr 
25e0: 2b 20 41 44 44 52 28 70 32 29 20 3a 20 70 32 3b  + ADDR(p2) : p2;
25f0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
2600: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
2610: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
2620: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
2630: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
2640: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
2650: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
2660: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
2670: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62 65  if( sqlite3_vdbe
2680: 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a  _addop_trace ){.
2690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26a0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
26b0: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
26c0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
26d0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
26e0: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
26f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
2700: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
2710: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2720: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
2730: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2740: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
2750: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2760: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
2770: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
2780: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
2790: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
27a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27b0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
27c0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
27d0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
27e0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
27f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2800: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
2810: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2820: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2830: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
2840: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2850: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2860: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2870: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2880: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2890: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
28a0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
28b0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
28c0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
28d0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
28e0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
28f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2900: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
2910: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
2920: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
2930: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2940: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP2(Vdbe *p, in
2950: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2960: 7b 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e  {.  assert( val>
2970: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2980: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
2990: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
29a0: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
29b0: 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f  addr>=0 && p->nO
29c0: 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70  p>addr && p->aOp
29d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
29e0: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
29f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
2a00: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2a10: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
2a20: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2a30: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
2a40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2a50: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
2a60: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
2a70: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
2a80: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
2a90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2aa0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
2ab0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
2ac0: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
2ad0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
2ae0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
2af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2b00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2b10: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
2b20: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2b30: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
2b40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2b50: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP5(Vdbe *p, in
2b60: 74 20 61 64 64 72 2c 20 75 38 20 76 61 6c 29 7b  t addr, u8 val){
2b70: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2b80: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2b90: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2ba0: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
2bb0: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
2bc0: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
2bd0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
2be0: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
2bf0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2c00: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
2c10: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
2c20: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2c30: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
2c40: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2c50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2c60: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
2c70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
2c80: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
2c90: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
2ca0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2cb0: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
2cc0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
2cd0: 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66  he input FuncDef
2ce0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70   structure is ep
2cf0: 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72  hemeral, then fr
2d00: 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  ee it.  If.** th
2d10: 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74  e FuncDef is not
2d20: 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20   ephermal, then 
2d30: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73  do nothing..*/.s
2d40: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45  tatic void freeE
2d50: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
2d60: 28 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b  (FuncDef *pDef){
2d70: 0a 20 20 69 66 28 20 70 44 65 66 20 26 26 20 28  .  if( pDef && (
2d80: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
2d90: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
2da0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
2db0: 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20  e3_free(pDef);. 
2dc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
2dd0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
2de0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
2df0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
2e00: 34 28 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  4(int p4type, vo
2e10: 69 64 20 2a 70 33 29 7b 0a 20 20 69 66 28 20 70  id *p3){.  if( p
2e20: 33 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  3 ){.    switch(
2e30: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
2e40: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
2e50: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
2e60: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
2e70: 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20  4_MPRINTF:.     
2e80: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
2e90: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2ea0: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
2eb0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ase P4_KEYINFO_H
2ec0: 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20  ANDOFF: {.      
2ed0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ee0: 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  3);.        brea
2ef0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2f00: 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e   case P4_VDBEFUN
2f10: 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  C: {.        Vdb
2f20: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
2f30: 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70   = (VdbeFunc *)p
2f40: 33 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45  3;.        freeE
2f50: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
2f60: 28 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e  (pVdbeFunc->pFun
2f70: 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  c);.        sqli
2f80: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
2f90: 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20  Data(pVdbeFunc, 
2fa0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2fb0: 74 65 33 5f 66 72 65 65 28 70 56 64 62 65 46 75  te3_free(pVdbeFu
2fc0: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
2fd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2fe0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
2ff0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
3000: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
3010: 6f 6e 28 28 46 75 6e 63 44 65 66 2a 29 70 33 29  on((FuncDef*)p3)
3020: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3040: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
3050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
3060: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
3070: 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20 20  value*)p3);.    
3080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
30a0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20  ./*.** Change N 
30b0: 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67  opcodes starting
30c0: 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f   at addr to No-o
30d0: 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ps..*/.void sqli
30e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
30f0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
3100: 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20   addr, int N){. 
3110: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70   if( p && p->aOp
3120: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
3130: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
3140: 64 72 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  dr];.    while( 
3150: 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65  N-- ){.      fre
3160: 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c  eP4(pOp->p4type,
3170: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
3180: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
3190: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
31a0: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  );.      pOp->op
31b0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
31c0: 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20        pOp++;.   
31d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
31e0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
31f0: 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61   of the P4 opera
3200: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3210: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3220: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3230: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
3240: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
3250: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
3260: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
3270: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
3280: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
3290: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
32a0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
32b0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
32c0: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
32d0: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f  =0 then the P4 o
32e0: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
32f0: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
3300: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
3310: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
3320: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
3330: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3340: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  3_malloc()..** A
3350: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
3360: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
3370: 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64  of zP4 up to and
3380: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
3390: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
33a0: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
33b0: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
33c0: 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP4..**.** If 
33d0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74  n==P4_KEYINFO it
33e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20   means that zP4 
33f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
3400: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
3410: 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69  ure..** A copy i
3420: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65  s made of the Ke
3430: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
3440: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
3450: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
3460: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20  ite3_malloc, to 
3470: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
3480: 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69  e Vdbe is finali
3490: 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45  zed..** n==P4_KE
34a0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e  YINFO_HANDOFF in
34b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 34  dicates that zP4
34c0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
34d0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
34e0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  * stored in memo
34f0: 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ry that the call
3500: 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  er has obtained 
3510: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
3520: 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c  loc. The .** cal
3530: 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66  ler should not f
3540: 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ree the allocati
3550: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66  on, it will be f
3560: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
3570: 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a  be is.** finaliz
3580: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  ed..** .** Other
3590: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
35a0: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
35b0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
35c0: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
35d0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
35e0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
35f0: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
3600: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
3610: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
3620: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
3630: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
3640: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
3650: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
3660: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
3670: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
3680: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
3690: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
36a0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
36b0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
36c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
36d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
36e0: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
36f0: 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  *pOp;.  assert( 
3700: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
3710: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3720: 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  T );.  if( p==0 
3730: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  || p->aOp==0 || 
3740: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3750: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e  led ){.    if (n
3760: 20 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20   != P4_KEYINFO) 
3770: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 6e  {.      freeP4(n
3780: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
3790: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP4);.    }. 
37a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
37b0: 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20 61   if( addr<0 || a
37c0: 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ddr>=p->nOp ){. 
37d0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
37e0: 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64   - 1;.    if( ad
37f0: 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  dr<0 ) return;. 
3800: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
3810: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
3820: 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  P4(pOp->p4type, 
3830: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f  pOp->p4.p);.  pO
3840: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69  p->p4.p = 0;.  i
3850: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
3860: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
3870: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3880: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
3890: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
38a0: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b  KEYINFO ){.    K
38b0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
38c0: 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64  ;.    int nField
38d0: 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46  , nByte;..    nF
38e0: 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f  ield = ((KeyInfo
38f0: 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a  *)zP4)->nField;.
3900: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
3910: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20  of(*pKeyInfo) + 
3920: 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f  (nField-1)*sizeo
3930: 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  f(pKeyInfo->aCol
3940: 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a  l[0]) + nField;.
3950: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
3960: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
3970: 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d  Byte );.    pOp-
3980: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  >p4.pKeyInfo = p
3990: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28  KeyInfo;.    if(
39a0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
39b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
39c0: 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20   *aSortOrder;.  
39d0: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
39e0: 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29  nfo, zP4, nByte)
39f0: 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64  ;.      aSortOrd
3a00: 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  er = pKeyInfo->a
3a10: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3a20: 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20   if( aSortOrder 
3a30: 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  ){.        pKeyI
3a40: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
3a50: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
3a60: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
3a70: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
3a80: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
3a90: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
3aa0: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
3ab0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
3ac0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3ad0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
3ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
3af0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3b00: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ed = 1;.      pO
3b10: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
3b20: 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  OTUSED;.    }.  
3b30: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
3b40: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
3b50: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
3b60: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
3b70: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3b80: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
3b90: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
3ba0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
3bb0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
3bc0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b  pOp->p4type = n;
3bd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3be0: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72  ( n==0 ) n = str
3bf0: 6c 65 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  len(zP4);.    pO
3c00: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
3c10: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
3c20: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
3c30: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3c40: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
3c50: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
3c60: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3c70: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74  comment on the t
3c80: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
3c90: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
3ca0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3cb0: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
3cc0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
3cd0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
3ce0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
3cf0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
3d00: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
3d10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3d20: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
3d30: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
3d40: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
3d50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3d60: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
3d70: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e   zFormat);.  p->
3d80: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
3d90: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
3da0: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
3db0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3dc0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
3dd0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
3de0: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
3df0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
3e00: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
3e10: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
3e20: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3e30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
3e40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3e50: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3e60: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
3e70: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
3e80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3e90: 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  led );.  return 
3ea0: 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ((addr>=0 && add
3eb0: 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61  r<p->nOp)?(&p->a
3ec0: 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a  Op[addr]):0);.}.
3ed0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
3ee0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
3ef0: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
3f00: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
3f10: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
3f20: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
3f30: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
3f40: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
3f50: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
3f60: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
3f70: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
3f80: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
3f90: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
3fa0: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
3fb0: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
3fc0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
3fd0: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
3fe0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
3ff0: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
4000: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
4010: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
4020: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
4030: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
4040: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
4050: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
4060: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
4070: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
4080: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
4090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
40a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
40b0: 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64  emp, "keyinfo(%d
40c0: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
40d0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
40e0: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20  strlen(zTemp);. 
40f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4100: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4110: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4120: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
4130: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
4140: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
4150: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
4160: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
4170: 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  en(pColl->zName)
4180: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4190: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
41a0: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
41b0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
41c0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
41d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
41e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
41f0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
4200: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4210: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
4220: 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f  rder && pKeyInfo
4230: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
4240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
4250: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
4260: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4270: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
4280: 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e  Temp[i], pColl->
4290: 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20  zName,n+1);.    
42a0: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
42b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
42c0: 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+4<nTemp-6 ){. 
42d0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
42e0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22  &zTemp[i],",nil"
42f0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,4);.          i
4300: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
4310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
4320: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
4330: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
4340: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
4350: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
4360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4370: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
4380: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
4390: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
43a0: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
43b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
43c0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
43d0: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
43e0: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
43f0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
4400: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4410: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
4420: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
4430: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
4440: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
4450: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4460: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
4470: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
4480: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
4490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
44a0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
44b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
44c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
44d0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
44e0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
44f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4500: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4510: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
4520: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4530: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4540: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
4550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4560: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
4570: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
4580: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4590: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
45a0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
45b0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
45c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
45d0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
45e0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
45f0: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
4600: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
4610: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
4620: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
4630: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
4640: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
4650: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
4660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
4670: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4680: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
4690: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
46a0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
46b0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
46c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
46d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
46e0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
46f0: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
4700: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
4710: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4720: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
4730: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4740: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4750: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  NULL");.      }.
4760: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4770: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4780: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4790: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
47a0: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
47b0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
47c0: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
47d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
47e0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
47f0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
4800: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
4810: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
4820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4830: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
4840: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
4850: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
4860: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 7c      if( zP4==0 |
4870: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
4880: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
4890: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
48a0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
48b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
48c0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
48d0: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
48e0: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
48f0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  f../*.** Declare
4900: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
4910: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
4920: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
4930: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a   is used..**.*/.
4940: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4950: 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a  UsesBtree(Vdbe *
4960: 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74  p, int i){.  int
4970: 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74 28   mask;.  assert(
4980: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
4990: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
49a0: 74 28 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e 62  t( i<sizeof(p->b
49b0: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
49c0: 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20   mask = 1<<i;.  
49d0: 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  if( (p->btreeMas
49e0: 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
49f0: 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b      p->btreeMask
4a00: 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71   |= mask;.    sq
4a10: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
4a20: 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61  rrayInsert(&p->a
4a30: 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44  Mutex, p->db->aD
4a40: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d  b[i].pBt);.  }.}
4a50: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  ...#if defined(V
4a60: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
4a70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
4a80: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
4a90: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
4aa0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4ab0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
4ac0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
4ad0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4ae0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
4af0: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
4b00: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
4b10: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
4b20: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
4b30: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
4b40: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
4b50: 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20  4d %4d %4d %-4s 
4b60: 25 2e 32 58 5c 6e 22 3b 0a 20 20 69 66 28 20 70  %.2X\n";.  if( p
4b70: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
4b80: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
4b90: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
4ba0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
4bb0: 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f  ));.  fprintf(pO
4bc0: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
4bd0: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
4be0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
4bf0: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
4c00: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
4c10: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
4c20: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
4c30: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
4c40: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
4c50: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
4c60: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
4c70: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
4c80: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
4c90: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a   N){.  if( p ){.
4ca0: 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30      while( N-->0
4cb0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
4cc0: 28 20 4e 3c 32 20 7c 7c 20 70 5b 30 5d 2e 64 62  ( N<2 || p[0].db
4cd0: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20  ==p[1].db );.   
4ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
4cf0: 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20  mRelease(p++);. 
4d00: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
4d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4d20: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
4d30: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
4d40: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
4d50: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
4d60: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
4d70: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
4d80: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
4d90: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
4da0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
4db0: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
4dc0: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
4dd0: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
4de0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
4df0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
4e00: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
4e10: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
4e20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4e30: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
4e40: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4e50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
4e60: 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  E */.){.  sqlite
4e70: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
4e80: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
4e90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
4ea0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
4eb0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ain );.  if( p->
4ec0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
4ed0: 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53  C_RUN ) return S
4ee0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
4ef0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69  assert( db->magi
4f00: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
4f10: 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74  BUSY );.  assert
4f20: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
4f30: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
4f40: 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f  ITE_BUSY );..  /
4f50: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
4f60: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
4f70: 6f 74 20 70 75 74 20 64 79 6e 61 6d 69 63 20 73  ot put dynamic s
4f80: 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a  trings onto the.
4f90: 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c 20    ** the stack, 
4fa0: 74 68 65 79 20 6d 61 79 20 62 65 63 6f 6d 65 20  they may become 
4fb0: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
4fc0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
4fd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4fe0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
4ff0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
5000: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
5010: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
5020: 70 52 65 73 75 6c 74 53 65 74 20 29 7b 0a 20 20  pResultSet ){.  
5030: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
5040: 79 28 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c  y(p->pResultSet,
5050: 20 35 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73   5);.    p->pRes
5060: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 7d 0a  ultSet = 0;.  }.
5070: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
5080: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
5090: 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d  ( i<p->nOp && p-
50a0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
50b0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
50c0: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
50d0: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29   if( i>=p->nOp )
50e0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
50f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
5100: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
5110: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
5120: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
5130: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
5140: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
5150: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5160: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
5170: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
5180: 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  >zErrMsg, sqlite
5190: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20  3ErrStr(p->rc), 
51a0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c  (char*)0);.  }el
51b0: 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20  se{.    Op *pOp 
51c0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
51d0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
51e0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 2d  >pResultSet = p-
51f0: 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20 69 66 28  >aStack;.    if(
5200: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
5210: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
5220: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5230: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5240: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5250: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
5260: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
5290: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
52a0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20    pMem++;.  .   
52b0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
52c0: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
52d0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
52e0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
52f0: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
5300: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
5310: 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20  de);  /* Opcode 
5320: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
5330: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
5340: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
5350: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5360: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
5370: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
5380: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
5390: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
53a0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
53b0: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
53c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
53d0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
53e0: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
5410: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5420: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
5430: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
5440: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
5450: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
5460: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
5490: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
54a0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
54b0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
54c0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
54d0: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
54e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
54f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
5500: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5520: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
5530: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5540: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5550: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
5560: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
5570: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68  >flags = MEM_Eph
5580: 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  em|MEM_Str|MEM_T
5590: 65 72 6d 3b 20 20 20 20 20 2f 2a 20 50 34 20 2a  erm;     /* P4 *
55a0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  /.    pMem->z = 
55b0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
55c0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a  Mem->zShort, siz
55d0: 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74  eof(pMem->zShort
55e0: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
55f0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
5600: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c    pMem->n = strl
5610: 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  en(pMem->z);.   
5620: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5630: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
5640: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
5650: 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d  E_UTF8;.    pMem
5660: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
5670: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
5680: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5690: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
56a0: 72 6d 7c 4d 45 4d 5f 53 68 6f 72 74 3b 0a 20 20  rm|MEM_Short;.  
56b0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 70      pMem->n = sp
56c0: 72 69 6e 74 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f  rintf(pMem->zSho
56d0: 72 74 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  rt, "%.2x", pOp-
56e0: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
56f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
5700: 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 3b 0a 20   pMem->zShort;. 
5710: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5720: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5730: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
5740: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
5750: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
5760: 20 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 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
57a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
57b0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
57c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
57d0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
57e0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
57f0: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ->z = pOp->zComm
5800: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  ent;.        pMe
5810: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
5820: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
5830: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
5840: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d  TE_UTF8;.      }
5850: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
5860: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
5870: 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  5*(p->explain-1)
5880: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
5890: 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  pMem;.    p->rc 
58a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
58b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
58c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
58d0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
58e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
58f0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
5900: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
5910: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
5920: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
5930: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
5940: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
5950: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
5960: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
5970: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
5980: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
5990: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
59a0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
59b0: 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a  &p->aOp[nOp-1];.
59c0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
59d0: 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f  e==OP_Noop && pO
59e0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
59f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
5a00: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
5a10: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
5a20: 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a  *(u8*)z) ) z++;.
5a30: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a      printf("SQL:
5a40: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20   [%s]\n", z);.  
5a50: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
5a60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5a70: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
5a80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
5a90: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
5aa0: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
5ab0: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
5ac0: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
5ad0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5ae0: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
5af0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
5b00: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
5b10: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
5b20: 66 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72  f( sqlite3_io_tr
5b30: 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ace==0 ) return;
5b40: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
5b50: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
5b60: 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20  p->aOp[nOp-1];. 
5b70: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
5b80: 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70  ==OP_Noop && pOp
5b90: 2d 3e 70 34 2e 70 21 3d 30 20 29 7b 0a 20 20 20  ->p4.p!=0 ){.   
5ba0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
5bb0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
5bc0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
5bd0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
5be0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  "%s", pOp->p4.p)
5bf0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5c00: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
5c10: 20 63 68 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b   char)z[i]); i++
5c20: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
5c30: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
5c40: 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28 28     if( isspace((
5c50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b  unsigned char)z[
5c60: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
5c70: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
5c80: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
5c90: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
5ca0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
5cb0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
5cc0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
5cd0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
5ce0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
5cf0: 69 6f 5f 74 72 61 63 65 28 22 53 51 4c 20 25 73  io_trace("SQL %s
5d00: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
5d10: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
5d20: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
5d30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
5d40: 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  RACE */.../*.** 
5d50: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
5d60: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
5d70: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
5d80: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
5d90: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
5da0: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
5db0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
5dc0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
5dd0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
5de0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
5df0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
5e00: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
5e10: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
5e20: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
5e30: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
5e40: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
5e50: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61  ly way to move a
5e60: 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f   VDBE from VDBE_
5e70: 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a  MAGIC_INIT to.**
5e80: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e   VDBE_MAGIC_RUN.
5e90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5ea0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
5eb0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
5ee0: 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20   int nVar,      
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27  /* Number of '?'
5f10: 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20   see in the SQL 
5f20: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
5f30: 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20  nt nMem,        
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f50: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
5f60: 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63  y cells to alloc
5f70: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ate */.  int nCu
5f80: 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rsor,           
5f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5fa0: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20  r of cursors to 
5fb0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
5fc0: 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20  t isExplain     
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5fe0: 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c  True if the EXPL
5ff0: 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20  AIN keywords is 
6000: 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  present */.){.  
6010: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
6020: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
6030: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
6040: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
6050: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
6060: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
6070: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
6080: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
6090: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
60a0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
60b0: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
60c0: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
60d0: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
60e0: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68  r than later. Th
60f0: 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75  is.   * is becau
6100: 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72  se the call to r
6110: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62  esizeOpArray() b
6120: 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20  elow may shrink 
6130: 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b  the.   * p->aOp[
6140: 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76 65 20  ] array to save 
6150: 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64  memory if called
6160: 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41   when in VDBE_MA
6170: 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74  GIC_RUN .   * st
6180: 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e  ate..   */.  p->
6190: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
61a0: 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f  IC_RUN;..  /* No
61b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65   instruction eve
61c0: 72 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68  r pushes more th
61d0: 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d  an a single elem
61e0: 65 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a  ent onto the.  *
61f0: 2a 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68  * stack.  And th
6200: 65 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72  e stack never gr
6210: 6f 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76  ows on successiv
6220: 65 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20  e executions of 
6230: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f  the.  ** same lo
6240: 6f 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61  op.  So the tota
6250: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74  l number of inst
6260: 72 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75  ructions is an u
6270: 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20  pper bound.  ** 
6280: 6f 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  on the maximum s
6290: 74 61 63 6b 20 64 65 70 74 68 20 72 65 71 75 69  tack depth requi
62a0: 72 65 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74  red.  (Added lat
62b0: 65 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72  er:)  The.  ** r
62c0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29  esolveP2Values()
62d0: 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61   call computes a
62e0: 20 74 69 67 68 74 65 72 20 75 70 70 65 72 20 62   tighter upper b
62f0: 6f 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  ound on the.  **
6300: 20 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a   stack size..  *
6310: 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f  *.  ** Allocatio
6320: 6e 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20  n all the stack 
6330: 73 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76  space we will ev
6340: 65 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  er need..  */.  
6350: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30  if( p->aStack==0
6360: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67   ){.    int nArg
6370: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  ;       /* Maxim
6380: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
6390: 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73  s passed to a us
63a0: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  er function. */.
63b0: 20 20 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20      int nStack; 
63c0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
63d0: 75 6d 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65  umber of stack e
63e0: 6e 74 72 69 65 73 20 72 65 71 75 69 72 65 64 20  ntries required 
63f0: 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32  */.    resolveP2
6400: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c  Values(p, &nArg,
6410: 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72   &nStack);.    r
6420: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20  esizeOpArray(p, 
6430: 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73  p->nOp);.    ass
6440: 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a  ert( nVar>=0 );.
6450: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 74 61      assert( nSta
6460: 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20  ck<p->nOp );.   
6470: 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20 29   if( isExplain )
6480: 7b 0a 20 20 20 20 20 20 6e 53 74 61 63 6b 20 3d  {.      nStack =
6490: 20 31 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   16;.    }.    p
64a0: 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74  ->aStack = sqlit
64b0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
64c0: 62 2c 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63  b,.        nStac
64d0: 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61  k*sizeof(p->aSta
64e0: 63 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74  ck[0])    /* aSt
64f0: 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  ack */.      + n
6500: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6520: 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20   apArg */.      
6530: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  + nVar*sizeof(Me
6540: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
6550: 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20   /* aVar */.    
6560: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6570: 63 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20  char*)          
6580: 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20     /* azVar */. 
6590: 20 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65       + nMem*size
65a0: 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20  of(Mem)         
65b0: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f        /* aMem */
65c0: 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72  .      + nCursor
65d0: 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29  *sizeof(Cursor*)
65e0: 20 2b 20 31 20 20 20 20 2f 2a 20 61 70 43 73 72   + 1    /* apCsr
65f0: 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   */.    );.    i
6600: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
6610: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  iled ){.      p-
6620: 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61  >aMem = &p->aSta
6630: 63 6b 5b 6e 53 74 61 63 6b 2d 31 5d 3b 20 20 2f  ck[nStack-1];  /
6640: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
6650: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
6660: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
6670: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
6680: 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f       /*       no
6690: 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31  t from 0..nMem-1
66a0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56 61   */.      p->aVa
66b0: 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65  r = &p->aMem[nMe
66c0: 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  m+1];.      p->n
66d0: 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20  Var = nVar;.    
66e0: 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a    p->okVar = 0;.
66f0: 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
6700: 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72   (Mem**)&p->aVar
6710: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
6720: 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a  >azVar = (char**
6730: 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d  )&p->apArg[nArg]
6740: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
6750: 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d   = (Cursor**)&p-
6760: 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20  >azVar[nVar];.  
6770: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
6780: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   nCursor;.      
6790: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
67a0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
67b0: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
67c0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
67d0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
67e0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
67f0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
6800: 3c 6e 53 74 61 63 6b 3b 20 6e 2b 2b 29 7b 0a 20  <nStack; n++){. 
6810: 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
6820: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
6830: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6840: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 70 2d 3e   for(n=1; n<=p->
6850: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
6860: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
6870: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
6880: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
6890: 20 64 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70   db;.  }..  p->p
68a0: 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Tos = &p->aStack
68b0: 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20  [-1];.  p->pc = 
68c0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
68d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e  LITE_OK;.  p->un
68e0: 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70  iqueCnt = 0;.  p
68f0: 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20  ->returnDepth = 
6900: 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  0;.  p->errorAct
6910: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
6920: 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20    p->popStack = 
6930: 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e   0;.  p->explain
6940: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
6950: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
6960: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
6970: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
6980: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
6990: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
69a0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
69b0: 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65    p->openedState
69c0: 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  ment = 0;.#ifdef
69d0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
69e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
69f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6a00: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
6a10: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
6a20: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
6a30: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
6a40: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
6a60: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
6a70: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
6a80: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
6a90: 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a  cursor happens.*
6aa0: 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  * to hold..*/.vo
6ab0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
6ac0: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
6ad0: 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  , Cursor *pCx){.
6ae0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
6af0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6b00: 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73    if( pCx->pCurs
6b10: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
6b20: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
6b30: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
6b40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
6b50: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
6b60: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
6b70: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e  ->pBt);.  }.#ifn
6b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6b90: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
6ba0: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
6bb0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
6bc0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
6bd0: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
6be0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
6bf0: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
6c00: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
6c10: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
6c20: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
6c30: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 73  ethod = 1;.    s
6c40: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
6c50: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64  p->db);.    pMod
6c60: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
6c70: 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  bCursor);.    sq
6c80: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
6c90: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
6ca0: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
6cb0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
6cc0: 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44  te3_free(pCx->pD
6cd0: 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ata);.  sqlite3_
6ce0: 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29  free(pCx->aType)
6cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
6d00: 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pCx);.}../*.** 
6d10: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
6d20: 73 20 65 78 63 65 70 74 20 66 6f 72 20 56 54 61  s except for VTa
6d30: 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  b cursors that a
6d40: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
6d50: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
6d60: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
6d70: 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69  ursorsExceptActi
6d80: 76 65 56 74 61 62 73 28 56 64 62 65 20 2a 70 29  veVtabs(Vdbe *p)
6d90: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
6da0: 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72   p->apCsr==0 ) r
6db0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
6dc0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
6dd0: 69 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73 6f 72  i++){.    Cursor
6de0: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
6df0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26  i];.    if( pC &
6e00: 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74  & (!p->inVtabMet
6e10: 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61  hod || !pC->pVta
6e20: 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  bCursor) ){.    
6e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
6e40: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
6e50: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
6e60: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
6e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
6e80: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
6e90: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
6ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
6eb0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
6ec0: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
6ed0: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
6ee0: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
6ef0: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
6f00: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
6f10: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
6f20: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
6f30: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
6f40: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
6f50: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
6f60: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
6f70: 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a  f( p->aStack ){.
6f80: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
6f90: 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 31  ray(p->aStack, 1
6fa0: 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70 2d   + (p->pTos - p-
6fb0: 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 70  >aStack));.    p
6fc0: 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74  ->pTos = &p->aSt
6fd0: 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20 63  ack[-1];.  }.  c
6fe0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
6ff0: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
7000: 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  p);.  releaseMem
7010: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
7020: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73  ], p->nMem);.  s
7030: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
7040: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
7050: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
7060: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
7070: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
7080: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
7090: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
70a0: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
70b0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
70c0: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
70d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
70e0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
70f0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
7100: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
7110: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
7120: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
7130: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
7140: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
7150: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
7160: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
7170: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
7180: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
7190: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
71a0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
71b0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
71c0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
71d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
71e0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
71f0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
7200: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
7210: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
7220: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
7230: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
7240: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
7250: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
7260: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
7270: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
7280: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
7290: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
72a0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
72b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
72c0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
72d0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
72e0: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
72f0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
7300: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
7310: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
7320: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43  lite3_free(p->aC
7330: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
7340: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
7350: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
7360: 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  lumn = nResColum
7370: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
7380: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
7390: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
73a0: 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73  locZero(p->db, s
73b0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
73c0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
73d0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
73e0: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
73f0: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
7400: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
7410: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
7420: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
7430: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
7440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
7450: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
7460: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
7470: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7480: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
7490: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
74a0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
74b0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
74c0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
74d0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
74e0: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
74f0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
7500: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
7510: 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f 53 54 41  .** If N==P4_STA
7520: 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68  TIC  it means th
7530: 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f  at zName is a po
7540: 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74  inter to a const
7550: 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74  ant static.** st
7560: 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20  ring and we can 
7570: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
7580: 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20  inter. If it is 
7590: 50 34 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  P4_DYNAMIC, then
75a0: 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20   .** the string 
75b0: 69 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  is freed using s
75c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 77 68  qlite3_free() wh
75d0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 66  en the vdbe is f
75e0: 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20  inished with.** 
75f0: 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e  it. Otherwise, N
7600: 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20   bytes of zName 
7610: 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69  are copied..*/.i
7620: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
7630: 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70  tColName(Vdbe *p
7640: 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 76  , int idx, int v
7650: 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ar, const char *
7660: 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20  zName, int N){. 
7670: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
7680: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
7690: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
76a0: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
76b0: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
76c0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
76d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
76e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
76f0: 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  MEM;.  assert( p
7700: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
7710: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
7720: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
7730: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
7740: 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 34  n]);.  if( N==P4
7750: 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50  _DYNAMIC || N==P
7760: 34 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20  4_STATIC ){.    
7770: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
7780: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
7790: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
77a0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
77b0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  TE_STATIC);.  }e
77c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
77d0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
77e0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
77f0: 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54  me, N, SQLITE_UT
7800: 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  F8,SQLITE_TRANSI
7810: 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ENT);.  }.  if( 
7820: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7830: 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29   N==P4_DYNAMIC )
7840: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
7850: 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d  flags = (pColNam
7860: 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53  e->flags&(~MEM_S
7870: 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b  tatic))|MEM_Dyn;
7880: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78  .    pColName->x
7890: 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Del = 0;.  }.  r
78a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
78b0: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
78c0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
78d0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
78e0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
78f0: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
7900: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
7910: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
7920: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
7930: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
7940: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
7950: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
7960: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
7970: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
7980: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
7990: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
79a0: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
79b0: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
79c0: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
79d0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
79e0: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
79f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
7a00: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
7a10: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
7a20: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
7a30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7a40: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
7a50: 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65  it = 0;..  /* Be
7a60: 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
7a70: 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
7a80: 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
7a90: 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
7aa0: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
7ab0: 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
7ac0: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
7ad0: 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
7ae0: 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
7af0: 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
7b00: 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
7b10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
7b20: 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
7b30: 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
7b40: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
7b50: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
7b60: 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
7b70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
7b80: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
7b90: 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 72 63  3VtabSync(db, rc
7ba0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7bb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
7bc0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7bd0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
7be0: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
7bf0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
7c00: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
7c10: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
7c20: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
7c30: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
7c40: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
7c50: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
7c60: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
7c70: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
7c80: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
7c90: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
7ca0: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
7cb0: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
7cc0: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
7cd0: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
7ce0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7cf0: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
7d00: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
7d10: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
7d20: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
7d30: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
7d40: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
7d50: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
7d60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
7d70: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
7d80: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
7d90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
7da0: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
7db0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7dc0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
7dd0: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
7de0: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
7df0: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
7e00: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
7e10: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
7e20: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
7e30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  ){.    sqlite3Sa
7e40: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
7e50: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
7e60: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
7e70: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73  ommitArg);.    s
7e80: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
7e90: 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  b);.    if( rc )
7ea0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7eb0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
7ec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7ed0: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
7ee0: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
7ef0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
7f00: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
7f10: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
7f20: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
7f30: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
7f40: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
7f50: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
7f60: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
7f70: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
7f80: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
7f90: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
7fa0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
7fb0: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
7fc0: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
7fd0: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
7fe0: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
7ff0: 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  y:.  In that cas
8000: 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  e we do.  ** not
8010: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
8020: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
8030: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73  ts, so use the s
8040: 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a  imple case then.
8050: 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20    ** too..  */. 
8060: 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73   if( 0==strlen(s
8070: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
8080: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
8090: 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e  ].pBt)) || nTran
80a0: 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28  s<=1 ){.    for(
80b0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
80c0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
80d0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
80e0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
80f0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
8100: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
8110: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8120: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8130: 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
8140: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8150: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
8160: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
8170: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
8180: 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
8190: 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
81a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
81b0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
81c0: 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
81d0: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
81e0: 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
81f0: 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
8200: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
8210: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
8220: 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
8230: 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
8240: 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
8250: 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
8260: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
8270: 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
8280: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
8290: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
82a0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
82b0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
82c0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
82d0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
82e0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
82f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
8300: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
8310: 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
8320: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
8330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8340: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
8350: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
8360: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
8370: 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
8380: 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
8390: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
83a0: 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
83b0: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
83c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
83d0: 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
83e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
83f0: 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
8400: 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a   atomicly..  */.
8410: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8420: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
8430: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
8440: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
8450: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
8460: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
8470: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
8480: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
8490: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
84a0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
84b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
84c0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
84d0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
84e0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
84f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
8500: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
8510: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
8520: 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  0;..    /* Selec
8530: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
8540: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
8550: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
8560: 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  32 random;.     
8570: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
8580: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
8590: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
85a0: 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20  sizeof(random), 
85b0: 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  &random);.      
85c0: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
85d0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
85e0: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
85f0: 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66  ile, random&0x7f
8600: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
8610: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
8620: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8630: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8640: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
8650: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
8660: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
8670: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
8680: 53 54 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  STS) );..    /* 
8690: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
86a0: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
86b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
86c0: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
86d0: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
86e0: 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  , .        SQLIT
86f0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
8700: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
8710: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  ATE|.        SQL
8720: 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
8730: 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
8740: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
8750: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
8760: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8780: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8790: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
87a0: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
87b0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
87c0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
87d0: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
87e0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
87f0: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
8800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
8810: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8820: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
8830: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
8840: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
8850: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8860: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
8870: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
8880: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
8890: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
88a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
88b0: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
88c0: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
88d0: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
88e0: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
88f0: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
8900: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
8910: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
8920: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8930: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8940: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  t;.      if( i==
8950: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  1 ) continue;   
8960: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45  /* Ignore the TE
8970: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
8980: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8990: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
89a0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
89b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
89c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
89d0: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
89e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
89f0: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
8a00: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
8a10: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
8a20: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
8a30: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
8a40: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
8a50: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
8a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
8a70: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
8a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
8a90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8aa0: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
8ab0: 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  , strlen(zFile)+
8ac0: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
8ad0: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74      offset += st
8ae0: 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  rlen(zFile)+1;. 
8af0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
8b00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
8b20: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
8b30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
8b40: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
8b50: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
8b60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8b70: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8b80: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8b90: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
8ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8bb0: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
8bc0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8bd0: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
8be0: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
8bf0: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
8c00: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
8c10: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
8c20: 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65  */.    zMainFile
8c30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
8c40: 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44  etDirname(db->aD
8c50: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[0].pBt);.    i
8c60: 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20  f( (needSync .  
8c70: 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74     && (0==(sqlit
8c80: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
8c90: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
8ca0: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
8cb0: 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20  SEQUENTIAL)).   
8cc0: 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33    && (rc=sqlite3
8cd0: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
8ce0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
8cf0: 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  AL))!=SQLITE_OK)
8d00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8d10: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
8d20: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
8d30: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
8d40: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
8d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8d60: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8d70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8d80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
8d90: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
8da0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
8db0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
8dc0: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
8dd0: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
8de0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
8df0: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
8e00: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
8e10: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
8e20: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
8e30: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
8e40: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8e50: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
8e60: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
8e70: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
8e80: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
8e90: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
8ea0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8eb0: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
8ec0: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
8ed0: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
8ee0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8ef0: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
8f00: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
8f10: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
8f20: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
8f30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8f40: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
8f50: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
8f60: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
8f70: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
8f80: 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20  lure occured..  
8f90: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
8fa0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
8fb0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
8fc0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
8fd0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8fe0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8ff0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
9000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
9010: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
9020: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
9030: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9040: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
9050: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
9060: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9070: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
9080: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
9090: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
90a0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
90b0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
90c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
90d0: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
90e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
90f0: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
9100: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
9110: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
9120: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
9130: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
9140: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
9150: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
9160: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
9170: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
9180: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
9190: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
91a0: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
91b0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
91c0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
91d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
91e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
91f0: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
9200: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
9210: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
9220: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
9230: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
9240: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
9250: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
9260: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
9270: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
9280: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
9290: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
92a0: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
92b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
92c0: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
92d0: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
92e0: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
92f0: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
9300: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
9310: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
9320: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
9330: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
9340: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
9350: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
9360: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
9370: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
9380: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
9390: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
93a0: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
93b0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
93c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
93d0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
93e0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
93f0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9400: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
9410: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
9420: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9430: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
9440: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9450: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
9460: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
9470: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
9480: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
9490: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
94a0: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
94b0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
94c0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
94d0: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
94e0: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
94f0: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
9500: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
9510: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
9520: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
9530: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
9540: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
9550: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
9560: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
9570: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
9580: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
9590: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
95a0: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
95b0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
95c0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
95d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
95e0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
95f0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
9600: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
9610: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
9620: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
9630: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
9640: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
9650: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
9660: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
9670: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
9680: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
9690: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
96a0: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
96b0: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
96c0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
96d0: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
96e0: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  tiveVdbeCnt );.}
96f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
9700: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
9710: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
9720: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
9730: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
9740: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
9750: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
9760: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
9770: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
9780: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
9790: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
97a0: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
97b0: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
97c0: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
97d0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
97e0: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
97f0: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
9800: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
9810: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
9820: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
9830: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
9840: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
9850: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
9860: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
9870: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
9880: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
9890: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
98a0: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
98b0: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
98c0: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
98d0: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
98e0: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
98f0: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
9900: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
9910: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
9920: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
9930: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
9940: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
9950: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
9960: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
9970: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
9980: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
9990: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
99a0: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
99b0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
99c0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
99d0: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
99e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
99f0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
9a00: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
9a10: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
9a20: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
9a30: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9a40: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
9a50: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
9a60: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
9a70: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
9a80: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
9a90: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
9aa0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
9ab0: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
9ac0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9ad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9ae0: 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
9af0: 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
9b00: 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
9b10: 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
9b20: 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
9b30: 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
9b40: 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
9b50: 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
9b60: 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
9b70: 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
9b80: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
9b90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9ba0: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
9bb0: 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
9bc0: 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
9bd0: 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
9be0: 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
9bf0: 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
9c00: 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
9c10: 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
9c20: 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
9c30: 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
9c40: 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
9c50: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
9c60: 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
9c70: 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
9c80: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
9c90: 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
9ca0: 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
9cb0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
9cc0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
9cd0: 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
9ce0: 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
9cf0: 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
9d00: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
9d10: 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
9d20: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
9d30: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
9d40: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
9d50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
9d60: 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a  (*xFunc)(Btree *
9d70: 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75  pBt) = 0;  /* Fu
9d80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f  nction to call o
9d90: 6e 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63  n each btree bac
9da0: 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  kend */.  int is
9db0: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
9dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
9dd0: 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54  to true if SQLIT
9de0: 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52  E_NOMEM or IOERR
9df0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
9e00: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
9e10: 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
9e20: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
9e30: 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
9e40: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
9e50: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
9e60: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
9e70: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
9e80: 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
9e90: 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
9ea0: 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
9eb0: 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
9ec0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
9ed0: 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
9ee0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
9ef0: 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
9f00: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
9f10: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
9f20: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
9f30: 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
9f40: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
9f50: 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
9f60: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
9f70: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
9f80: 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
9f90: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
9fa0: 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
9fb0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
9fc0: 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
9fd0: 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
9fe0: 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
9ff0: 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
a000: 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
a010: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
a020: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
a030: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a040: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
a050: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  OMEM;.  }.  clos
a060: 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70  eAllCursorsExcep
a070: 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b  tActiveVtabs(p);
a080: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
a090: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
a0a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a0b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
a0c0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
a0d0: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
a0e0: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
a0f0: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
a100: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
a110: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
a120: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
a130: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
a140: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
a150: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a   from p->rc */..
a160: 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
a170: 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
a180: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
a190: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a1a0: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
a1b0: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20  &p->aMutex);..  
a1c0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
a1d0: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
a1e0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
a1f0: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
a200: 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
a210: 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
a220: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
a230: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
a260: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
a270: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
a280: 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
a290: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
a2a0: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
a2b0: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
a2c0: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
a2d0: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
a2e0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
a2f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
a300: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
a310: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
a320: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
a330: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
a340: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
a350: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a360: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  al.      **     
a370: 51 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74  Query without st
a380: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
a390: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
a3a0: 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f  * We could do so
a3b0: 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65  mething more ele
a3c0: 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73  gant than this s
a3d0: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28  tatic analysis (
a3e0: 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  i.e..      ** st
a3f0: 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ore the type of 
a400: 71 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66  query as part of
a410: 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e   the compliation
a420: 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20   phase), but .  
a430: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20      ** handling 
a440: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
a450: 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72  ailure is a fair
a460: 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20  ly obscure edge 
a470: 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a  case so .      *
a480: 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62  * this is probab
a490: 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a  ly easier. Todo:
a4a0: 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70   Might be an opp
a4b0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75  ortunity to redu
a4c0: 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ce .      ** cod
a4d0: 65 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d  e size a very sm
a4e0: 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67  all amount thoug
a4f0: 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  h....      */.  
a500: 20 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f      int notReadO
a510: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  nly = 0;.      i
a520: 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d  nt isStatement =
a530: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
a540: 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f  (p->aOp || p->nO
a550: 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p==0);.      for
a560: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
a570: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73  i++){ .        s
a580: 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d  witch( p->aOp[i]
a590: 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  .opcode ){.     
a5a0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
a5b0: 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20  nsaction:.      
a5c0: 20 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c        notReadOnl
a5d0: 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  y |= p->aOp[i].p
a5e0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  2;.            b
a5f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a600: 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e  case OP_Statemen
a610: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t:.            i
a620: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a  sStatement = 1;.
a630: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a640: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
a650: 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20     }..   .      
a660: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
a670: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
a680: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
a690: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
a6a0: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
a6b0: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
a6c0: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
a6d0: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
a6e0: 20 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f      if( notReadO
a6f0: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
a700: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
a710: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
a720: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
a730: 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61  BLOCKED && isSta
a740: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
a750: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
a760: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a770: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
a780: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
a790: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
a7a0: 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51  lse if( (mrc==SQ
a7b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
a7c0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
a7d0: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
a7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
a7f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a800: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
a810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a820: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
a830: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
a840: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
a850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
a860: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
a870: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
a880: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
a890: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
a8a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
a8b0: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
a8c0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
a8d0: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
a8e0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
a8f0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
a900: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a910: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
a920: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
a930: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
a940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a950: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
a960: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
a970: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
a980: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
a990: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
a9a0: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
a9b0: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
a9c0: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
a9d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
a9e0: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
a9f0: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
aa00: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
aa10: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
aa20: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
aa30: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
aa40: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
aa50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
aa60: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
aa70: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
aa80: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
aa90: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
aaa0: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
aab0: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
aac0: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
aad0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
aae0: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
aaf0: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
ab00: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
ab10: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
ab20: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
ab30: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
ab40: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
ab50: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
ab60: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
ab70: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
ab80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
ab90: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
aba0: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  t(db);.        i
abb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
abc0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
abd0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
abe0: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
abf0: 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
ac00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ac10: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
ac20: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
ac30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac40: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
ac50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ac60: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
ac70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ac80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ac90: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
aca0: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
acb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
acc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
acd0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
ace0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
acf0: 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63  }else if( !xFunc
ad00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
ad10: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
ad20: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
ad30: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
ad40: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
ad50: 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  edStatement ){. 
ad60: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
ad70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
ad80: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  mitStmt;.       
ad90: 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   } .      }else 
ada0: 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
adb0: 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
adc0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
add0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
ade0: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
adf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
ae00: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
ae10: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
ae20: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
ae30: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
ae40: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
ae50: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
ae60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ae70: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
ae80: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
ae90: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
aea0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
aeb0: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
aec0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
aed0: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
aee0: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
aef0: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
af00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
af10: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
af20: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
af30: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
af40: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
af50: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
af60: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
af70: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
af80: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
af90: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
afa0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
afb0: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
afc0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
afd0: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
afe0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
aff0: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
b000: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
b010: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
b020: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
b030: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
b040: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
b050: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
b060: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b070: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
b080: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
b090: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
b0a0: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
b0b0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
b0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
b0d0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
b0e0: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
b0f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b100: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b110: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
b120: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
b130: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
b140: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
b150: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
b160: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
b170: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
b180: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
b190: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
b1a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
b1b0: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
b1c0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
b1d0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
b1e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
b1f0: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
b200: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
b210: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b220: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
b230: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
b240: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
b250: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
b260: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
b270: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
b280: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
b290: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
b2a0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
b2b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
b2c0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
b2d0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
b2e0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
b2f0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
b300: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
b310: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
b320: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
b330: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
b340: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
b350: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
b360: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
b370: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
b380: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
b390: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
b3a0: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
b3b0: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
b3c0: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
b3d0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
b3e0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
b3f0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
b400: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
b410: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
b420: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
b430: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
b440: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
b450: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b460: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
b470: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
b480: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b490: 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e  t(db);..  return
b4a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
b4b0: 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
b4c0: 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
b4d0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b4e0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
b4f0: 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
b500: 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
b510: 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
b520: 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
b530: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
b540: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
b550: 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
b560: 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
b570: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b580: 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
b590: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
b5a0: 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
b5b0: 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
b5c0: 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
b5d0: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
b5e0: 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
b5f0: 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
b600: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
b610: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
b620: 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
b630: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
b640: 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
b650: 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
b660: 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
b670: 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
b680: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
b690: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
b6a0: 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
b6b0: 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
b6c0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
b6d0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
b6e0: 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
b6f0: 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
b700: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
b710: 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
b720: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
b730: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
b740: 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
b750: 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
b760: 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
b770: 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
b780: 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
b790: 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
b7a0: 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
b7b0: 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
b7c0: 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
b7d0: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
b7e0: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
b7f0: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73  VdbeHalt(p);.  s
b800: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
b810: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
b820: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
b830: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
b840: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
b850: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
b860: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
b870: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
b880: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
b890: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
b8a0: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
b8b0: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
b8c0: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
b8d0: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
b8e0: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
b8f0: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
b900: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
b910: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
b920: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
b930: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
b940: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
b950: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
b960: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
b970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
b980: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
b990: 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
b9a0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69  SQLITE_UTF8,sqli
b9b0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20  te3_free);.     
b9c0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
b9d0: 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ->rc;.      p->z
b9e0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
b9f0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
ba00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ba10: 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
ba20: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
ba30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ba40: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
ba50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
ba60: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
ba70: 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
ba80: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
ba90: 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
baa0: 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
bab0: 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
bac0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
bad0: 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
bae0: 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
baf0: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
bb00: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
bb10: 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
bb20: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
bb30: 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
bb40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
bb50: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
bb60: 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >rc, 0);.    sql
bb70: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
bb80: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
bb90: 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
bba0: 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
bbb0: 72 65 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  ree);.    p->zEr
bbc0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
bbd0: 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
bbe0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
bbf0: 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
bc00: 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
bc10: 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
bc20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
bc30: 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
bc40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
bc50: 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63  ->pTos<&p->aStac
bc60: 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70  k[p->pc<0?0:p->p
bc70: 63 5d 20 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b  c] || !p->aStack
bc80: 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   );.#ifdef VDBE_
bc90: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
bca0: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
bcb0: 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
bcc0: 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
bcd0: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
bce0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
bcf0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
bd00: 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
bd10: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
bd20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
bd30: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
bd40: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
bd50: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
bd60: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
bd70: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
bd80: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
bd90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
bda0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
bdb0: 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
bdc0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
bdd0: 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
bde0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
bdf0: 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
be00: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
be10: 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
be20: 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
be30: 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
be40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
be50: 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
be60: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
be70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
be80: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
be90: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
bea0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
beb0: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
bec0: 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72  aborted = 0;.  r
bed0: 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
bee0: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
bef0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
bf00: 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
bf10: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
bf20: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
bf30: 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
bf40: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
bf50: 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
bf60: 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
bf70: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
bf80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
bf90: 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
bfa0: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
bfb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
bfc0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bfd0: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
bfe0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
bff0: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
c000: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
c010: 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
c020: 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
c030: 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
c040: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d    }else if( p->m
c050: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
c060: 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74  _INIT ){.    ret
c070: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
c080: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
c090: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
c0a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c0b0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
c0c0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
c0d0: 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
c0e0: 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
c0f0: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
c100: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
c110: 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
c120: 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
c130: 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
c140: 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
c150: 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
c160: 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
c170: 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
c180: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
c190: 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
c1a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
c1b0: 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
c1c0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
c1d0: 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
c1e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
c1f0: 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
c200: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
c210: 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
c220: 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
c230: 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
c240: 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
c250: 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75  &(1<<i))) && pAu
c260: 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
c270: 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
c280: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
c290: 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
c2a0: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
c2b0: 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
c2c0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
c2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
c2e0: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
c2f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c300: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
c310: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
c320: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c330: 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  n;.  Cleanup(p);
c340: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
c350: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
c360: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
c370: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
c380: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70  assert( p->db->p
c390: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Vdbe==p );.    p
c3a0: 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d  ->db->pVdbe = p-
c3b0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
c3c0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
c3d0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
c3e0: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
c3f0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29  }.  if( p->aOp )
c400: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
c410: 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p->aOp;.    for(
c420: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
c430: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
c440: 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34    freeP4(pOp->p4
c450: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
c460: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c470: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
c480: 74 65 33 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43  te3_free(pOp->zC
c490: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
c4a0: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73      .    }.    s
c4b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c4c0: 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  Op);.  }.  relea
c4d0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
c4e0: 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
c4f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c500: 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
c510: 65 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63  e3_free(p->aStac
c520: 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  k);.  releaseMem
c530: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
c540: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
c550: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
c560: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c570: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
c580: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c  te3_free(p->zSql
c590: 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  );.  p->magic = 
c5a0: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
c5b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c5c0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  p);.}../*.** If 
c5d0: 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
c5e0: 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
c5f0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
c600: 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
c610: 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
c620: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
c630: 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76  code.  If no Mov
c640: 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  eTo is pending, 
c650: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
c660: 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64  does nothing and
c670: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
c680: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
c690: 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
c6a0: 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  to(Cursor *p){. 
c6b0: 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
c6c0: 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
c6d0: 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
c6e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
c6f0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
c700: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
c710: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  t;.#endif.    as
c720: 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
c730: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
c740: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
c750: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
c760: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
c770: 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
c780: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c790: 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b  ;.    *p->pIncrK
c7a0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c  ey = 0;.    p->l
c7b0: 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f  astRowid = keyTo
c7c0: 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  Int(p->movetoTar
c7d0: 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  get);.    p->row
c7e0: 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
c7f0: 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  =0;.    if( res<
c800: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c810: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
c820: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  (p->pCursor, &re
c830: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
c840: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c850: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
c860: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
c870: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
c880: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  +;.#endif.    p-
c890: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
c8a0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
c8b0: 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
c8c0: 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74  STALE;.  }.  ret
c8d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c8e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
c8f0: 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
c900: 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
c910: 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
c920: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
c930: 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
c940: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c950: 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74  lRead().** sqlit
c960: 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
c970: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
c980: 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a  SerialWrite().**
c990: 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
c9a0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
c9b0: 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
c9c0: 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
c9d0: 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
c9e0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
c9f0: 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
ca00: 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
ca10: 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
ca20: 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
ca30: 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
ca40: 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
ca50: 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
ca60: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
ca70: 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
ca80: 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
ca90: 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
caa0: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
cab0: 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
cac0: 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
cad0: 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
cae0: 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
caf0: 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
cb00: 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
cb10: 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
cb20: 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
cb30: 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
cb40: 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
cb50: 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
cb60: 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
cb70: 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
cb80: 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
cb90: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
cba0: 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
cbb0: 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
cbc0: 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
cbd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
cbe0: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
cbf0: 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
cc00: 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
cc10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
cc20: 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
cc30: 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
cc40: 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cc80: 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
cca0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
ccb0: 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
ccd0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
cce0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
ccf0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
cd00: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
cd10: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
cd20: 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
cd50: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
cd60: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
cd80: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
cd90: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
cda0: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
cdb0: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
cdc0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
cdd0: 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
ce00: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
ce10: 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
ce20: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
ce30: 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
ce40: 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
ce70: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
ce80: 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
cea0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
ceb0: 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
cec0: 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
cef0: 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
cf00: 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
cf10: 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
cf20: 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
cf30: 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
cf40: 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
cf50: 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
cf60: 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
cf70: 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
cf80: 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
cf90: 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
cfa0: 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
cfb0: 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
cfc0: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
cfd0: 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
cfe0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
cff0: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
d000: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
d010: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
d020: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
d030: 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
d040: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
d050: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
d060: 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
d070: 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
d080: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
d090: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
d0a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
d0b0: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
d0c0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
d0d0: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
d0e0: 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
d0f0: 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
d100: 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
d110: 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30  ((((i64)0x000010
d120: 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
d130: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
d140: 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
d150: 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
d160: 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
d170: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d180: 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   8+i;.    }.    
d190: 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69  u = i<0 ? -i : i
d1a0: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  ;.    if( u<=127
d1b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
d1c0: 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
d1d0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
d1e0: 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
d1f0: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
d200: 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
d210: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
d220: 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
d230: 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
d240: 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
d250: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
d260: 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
d270: 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
d280: 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  ( flags&(MEM_Str
d290: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
d2a0: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
d2b0: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
d2c0: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
d2d0: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20  pMem->u.i;.  }. 
d2e0: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
d2f0: 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
d300: 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
d310: 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
d320: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d330: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
d340: 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
d350: 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
d360: 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
d370: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d380: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
d390: 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
d3a0: 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
d3b0: 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
d3c0: 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
d3d0: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
d3e0: 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
d3f0: 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
d400: 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
d410: 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
d420: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
d430: 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
d440: 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
d450: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
d460: 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
d470: 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
d480: 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
d490: 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
d4a0: 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
d4b0: 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
d4c0: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
d4d0: 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
d4e0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
d4f0: 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
d500: 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
d510: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
d520: 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
d530: 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
d540: 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
d550: 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
d560: 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
d570: 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
d580: 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
d590: 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
d5a0: 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
d5b0: 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
d5c0: 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
d5d0: 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
d5e0: 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
d5f0: 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
d600: 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
d610: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
d620: 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
d630: 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
d640: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
d650: 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
d660: 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
d670: 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
d680: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
d690: 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
d6a0: 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
d6b0: 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
d6c0: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
d6d0: 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
d6e0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
d6f0: 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
d700: 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
d710: 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
d720: 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
d730: 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
d740: 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
d750: 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
d760: 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
d770: 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
d780: 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
d790: 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
d7a0: 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
d7b0: 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
d7c0: 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
d7d0: 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
d7e0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
d7f0: 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
d800: 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
d810: 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
d820: 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
d830: 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
d840: 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
d850: 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
d860: 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
d870: 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
d880: 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
d890: 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
d8a0: 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
d8b0: 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
d8c0: 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
d8d0: 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
d8e0: 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
d8f0: 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
d900: 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
d910: 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
d920: 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
d930: 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
d940: 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
d950: 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
d960: 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
d970: 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
d980: 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
d990: 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
d9a0: 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
d9b0: 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
d9c0: 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
d9d0: 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
d9e0: 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
d9f0: 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
da00: 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
da10: 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
da20: 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
da30: 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
da40: 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
da50: 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
da60: 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
da70: 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
da80: 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
da90: 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
daa0: 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
dab0: 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
dac0: 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
dad0: 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
dae0: 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
daf0: 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
db00: 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
db10: 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
db20: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
db30: 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
db40: 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
db50: 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
db60: 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
db70: 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
db80: 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
db90: 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
dba0: 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
dbb0: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
dbc0: 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
dbd0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
dbe0: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
dbf0: 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
dc00: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
dc10: 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
dc20: 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
dc30: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
dc40: 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
dc50: 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
dc60: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
dc70: 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
dc80: 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
dc90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
dca0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
dcb0: 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
dcc0: 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
dcd0: 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
dce0: 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73  buf[].  nBuf mus
dcf0: 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c  t always be.** l
dd00: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
dd10: 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
dd20: 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ield.  Except, i
dd30: 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a  f the field is.*
dd40: 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20  * a blob with a 
dd50: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
dd60: 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67  , then buf[] mig
dd70: 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72  ht be just the r
dd80: 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20  ight.** size to 
dd90: 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20  hold everything 
dda0: 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a  except for the z
ddb0: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e  ero-filled tail.
ddc0: 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73    If buf[].** is
ddd0: 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68   only big enough
dde0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e   to hold the non
ddf0: 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68  -zero prefix, th
de00: 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  en only write th
de10: 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74  at.** prefix int
de20: 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66  o buf[].  But if
de30: 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20   buf[] is large 
de40: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62  enough to hold b
de50: 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69  oth the.** prefi
de60: 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74  x and the tail t
de70: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72  hen write the pr
de80: 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65  efix and set the
de90: 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20   tail to all.** 
dea0: 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  zeros..**.** Ret
deb0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
dec0: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
ded0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
dee0: 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
def0: 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
df00: 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
df10: 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
df20: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
df30: 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
df40: 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
df50: 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
df60: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
df70: 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
df80: 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66  8 *buf, int nBuf
df90: 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  , Mem *pMem, int
dfa0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
dfb0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
dfc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
dfd0: 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66  rialType(pMem, f
dfe0: 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69  ile_format);.  i
dff0: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  nt len;..  /* In
e000: 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
e010: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
e020: 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
e030: 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
e040: 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b  64 v;.    int i;
e050: 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
e060: 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
e070: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e080: 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
e090: 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  >r) );.      mem
e0a0: 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72  cpy(&v, &pMem->r
e0b0: 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
e0c0: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
e0d0: 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
e0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
e0f0: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
e100: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
e110: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e120: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
e130: 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  _type);.    asse
e140: 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b  rt( len<=nBuf );
e150: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20  .    while( i-- 
e160: 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20  ){.      buf[i] 
e170: 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  = (v&0xFF);.    
e180: 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
e190: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
e1a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
e1b0: 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
e1c0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
e1d0: 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
e1e0: 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
e1f0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
e200: 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a  Zero)?pMem->u.i:
e210: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
e220: 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  == sqlite3VdbeSe
e230: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
e240: 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
e250: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c  assert( pMem->n<
e260: 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e  =nBuf );.    len
e270: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
e280: 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
e290: 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ->z, len);.    i
e2a0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
e2b0: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
e2c0: 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e     len += pMem->
e2d0: 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  u.i;.      if( l
e2e0: 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  en>nBuf ){.     
e2f0: 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20     len = nBuf;. 
e300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
e310: 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e  set(&buf[pMem->n
e320: 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e  ], 0, len-pMem->
e330: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  n);.    }.    re
e340: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
e350: 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
e360: 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
e370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
e380: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
e390: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
e3a0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
e3b0: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
e3c0: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
e3d0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
e3e0: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
e3f0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e400: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
e410: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
e420: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
e430: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
e440: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
e450: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
e460: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
e470: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e490: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
e4a0: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
e4b0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4d0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
e4e0: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
e4f0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
e500: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
e510: 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
e520: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
e530: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
e540: 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
e550: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
e560: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
e570: 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
e580: 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
e590: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
e5a0: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
e5b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
e5c0: 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
e5d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
e5e0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e5f0: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
e600: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
e610: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e620: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
e630: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
e640: 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
e650: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
e660: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
e670: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
e680: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
e690: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
e6a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e6b0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
e6c0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
e6d0: 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
e6e0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
e6f0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
e700: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
e710: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
e720: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<16) | (buf[1]<
e730: 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20  <8) | buf[2];.  
e740: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e750: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e760: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
e770: 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
e780: 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
e790: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
e7a0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75   pMem->u.i = (bu
e7b0: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
e7c0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
e7d0: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
e7e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
e7f0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e800: 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
e810: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
e820: 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
e830: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
e840: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73      u64 x = (((s
e850: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
e860: 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
e870: 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28  .      u32 y = (
e880: 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[2]<<24) | (b
e890: 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[3]<<16) | (bu
e8a0: 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35  f[4]<<8) | buf[5
e8b0: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
e8c0: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
e8d0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
e8e0: 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65  4*)&x;.      pMe
e8f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e900: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
e910: 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
e920: 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
e930: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
e940: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
e950: 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
e960: 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
e970: 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75    u64 x;.      u
e980: 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e  32 y;.#if !defin
e990: 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
e9a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e9b0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
e9c0: 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69  T).      /* Veri
e9d0: 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
e9e0: 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
e9f0: 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
ea00: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
ea10: 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
ea20: 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
ea30: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
ea40: 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
ea50: 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
ea60: 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
ea70: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
ea80: 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
ea90: 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  .      ** endian
eaa0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
eab0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
eac0: 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
ead0: 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
eae0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
eaf0: 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
eb00: 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d  ;.      u64 t2 =
eb10: 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d   t1;.      swapM
eb20: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
eb30: 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t2);.      asser
eb40: 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
eb50: 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
eb60: 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
eb70: 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
eb80: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20  #endif..      x 
eb90: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
eba0: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
ebb0: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
ebc0: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20  f[3];.      y = 
ebd0: 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28  (buf[4]<<24) | (
ebe0: 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[5]<<16) | (b
ebf0: 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[6]<<8) | buf[
ec00: 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  7];.      x = (x
ec10: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
ec20: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
ec30: 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
ec40: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
ec50: 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
ec60: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ec70: 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Int;.      }else
ec80: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
ec90: 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
eca0: 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  & sizeof(pMem->r
ecb0: 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
ecc0: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
ecd0: 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20  loat(x);.       
ece0: 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
ecf0: 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
ed00: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ed10: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c  flags = MEM_Real
ed20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ed30: 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
ed40: 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
ed50: 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
ed60: 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
ed70: 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
ed80: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
ed90: 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
eda0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
edb0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
edc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
edd0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
ede0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  .      int len =
edf0: 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
ee00: 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
ee10: 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
ee20: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
ee30: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
ee40: 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
ee50: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
ee60: 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
ee70: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ee80: 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
ee90: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
eea0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
eeb0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
eec0: 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
eed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
eee0: 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
eef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
ef00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
ef10: 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63  er of a record c
ef20: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 71  onsists of a seq
ef30: 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c  uence variable-l
ef40: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a  ength integers..
ef50: 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72  ** These integer
ef60: 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77  s are almost alw
ef70: 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72  ays small and ar
ef80: 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73  e encoded as a s
ef90: 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54  ingle byte..** T
efa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
efb0: 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  ro takes advanta
efc0: 67 65 20 74 68 69 73 20 66 61 63 74 20 74 6f 20  ge this fact to 
efd0: 70 72 6f 76 69 64 65 20 61 20 66 61 73 74 20 64  provide a fast d
efe0: 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20  ecode.** of the 
eff0: 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72 65  integers in a re
f000: 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49 74  cord header.  It
f010: 20 69 73 20 66 61 73 74 65 72 20 66 6f 72 20 74   is faster for t
f020: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a  he common case.*
f030: 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65  * where the inte
f040: 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ger is a single 
f050: 62 79 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c  byte.  It is a l
f060: 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65  ittle slower whe
f070: 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  n the.** integer
f080: 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   is two or more 
f090: 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72  bytes.  But over
f0a0: 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65 72  all it is faster
f0b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
f0c0: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
f0d0: 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
f0e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20  :.**.**     x = 
f0f0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
f100: 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a  32( A, &B );.**.
f110: 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56 61  **     x = GetVa
f120: 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a  rint( A, B );.**
f130: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56  .*/.#define GetV
f140: 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20  arint(A,B)  ((B 
f150: 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20  = *(A))<=0x7f ? 
f160: 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61  1 : sqlite3GetVa
f170: 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a  rint32(A, &B))..
f180: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f190: 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
f1a0: 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
f1b0: 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
f1c0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a   specified by .*
f1d0: 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  * {nKey1, pKey1}
f1e0: 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65   and {nKey2, pKe
f1f0: 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61  y2}, returning a
f200: 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
f210: 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
f220: 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31  nteger if {nKey1
f230: 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73  , pKey1} is less
f240: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
f250: 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
f260: 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79  han {nKey2, pKey
f270: 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61  2}.  Both Key1 a
f280: 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20  nd Key2 must be 
f290: 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20  byte strings.** 
f2a0: 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20  composed by the 
f2b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
f2c0: 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
f2d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f2e0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
f2f0: 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44  e(.  void *userD
f300: 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ata,.  int nKey1
f310: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
f320: 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79  ey1, .  int nKey
f330: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
f340: 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66  Key2.){.  KeyInf
f350: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b  o *pKeyInfo = (K
f360: 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61  eyInfo*)userData
f370: 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20  ;.  u32 d1, d2; 
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f390: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
f3a0: 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
f3b0: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
f3c0: 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a  1, idx2;      /*
f3d0: 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
f3e0: 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
f3f0: 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
f400: 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64  u32 szHdr1, szHd
f410: 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  r2;  /* Number o
f420: 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
f430: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
f440: 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
f450: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
f460: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f470: 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
f480: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f490: 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e  r *)pKey1;.  con
f4a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f4b0: 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74   *aKey2 = (const
f4c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f4d0: 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d  )pKey2;..  Mem m
f4e0: 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b  em1;.  Mem mem2;
f4f0: 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
f500: 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
f510: 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
f520: 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e  o->db;.  mem2.en
f530: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
f540: 63 3b 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70  c;.  mem2.db = p
f550: 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a  KeyInfo->db;.  .
f560: 20 20 69 64 78 31 20 3d 20 47 65 74 56 61 72 69    idx1 = GetVari
f570: 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  nt(aKey1, szHdr1
f580: 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
f590: 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74 56 61  ;.  idx2 = GetVa
f5a0: 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64  rint(aKey2, szHd
f5b0: 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64  r2);.  d2 = szHd
f5c0: 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70  r2;.  nField = p
f5d0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
f5e0: 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
f5f0: 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a  zHdr1 && idx2<sz
f600: 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20  Hdr2 ){.    u32 
f610: 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20  serial_type1;.  
f620: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
f630: 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e2;..    /* Read
f640: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
f650: 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
f660: 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
f670: 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
f680: 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b  += GetVarint( aK
f690: 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
f6a0: 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66  _type1 );.    if
f6b0: 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
f6c0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f6d0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
f6e0: 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
f6f0: 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74  .    idx2 += Get
f700: 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64  Varint( aKey2+id
f710: 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32  x2, serial_type2
f720: 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d   );.    if( d2>=
f730: 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65 33  nKey2 && sqlite3
f740: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
f750: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e  n(serial_type2)>
f760: 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
f770: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
f780: 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
f790: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
f7a0: 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
f7b0: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
f7c0: 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
f7d0: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
f7e0: 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56    d2 += sqlite3V
f7f0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
f800: 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f  ey2[d2], serial_
f810: 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a  type2, &mem2);..
f820: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
f830: 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
f840: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f850: 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
f860: 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c  , &mem2, i<nFiel
f870: 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
f880: 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
f890: 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20   if( mem1.flags 
f8a0: 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  & MEM_Dyn ) sqli
f8b0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
f8c0: 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66  e(&mem1);.    if
f8d0: 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d  ( mem2.flags & M
f8e0: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
f8f0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
f900: 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72  mem2);.    if( r
f910: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
f920: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
f930: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  ++;.  }..  /* On
f940: 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
f950: 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
f960: 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
f970: 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
f980: 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
f990: 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
f9a0: 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
f9b0: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
f9c0: 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
f9d0: 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
f9e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
f9f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
fa00: 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
fa10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
fa20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fa30: 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69  !pKeyInfo->prefi
fa40: 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20  xIsEqual ){.    
fa50: 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29    if( d1<nKey1 )
fa60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
fa70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
fa80: 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20  ( d2<nKey2 ){.  
fa90: 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
faa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fab0: 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
fac0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
fad0: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
fae0: 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
faf0: 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
fb00: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
fb10: 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
fb20: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
fb30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
fb40: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64  gument is an ind
fb50: 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65  ex entry compose
fb60: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
fb70: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
fb80: 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e  ..** The last en
fb90: 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f  try in this reco
fba0: 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  rd should be an 
fbb0: 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69  integer (specifi
fbc0: 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  cally.** an inte
fbd0: 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69  ger rowid).  Thi
fbe0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
fbf0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
fc00: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74  bytes in.** that
fc10: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74   integer..*/.int
fc20: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
fc30: 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38  owidLen(const u8
fc40: 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73   *aKey){.  u32 s
fc50: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
fc60: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
fc70: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
fc80: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
fc90: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
fca0: 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69  rowid */..  sqli
fcb0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61  te3GetVarint32(a
fcc0: 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  Key, &szHdr);.  
fcd0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
fce0: 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31  32(&aKey[szHdr-1
fcf0: 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
fd00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
fd10: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
fd20: 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a  n(typeRowid);.}.
fd30: 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70    ../*.** pCur p
fd40: 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
fd50: 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
fd60: 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
fd70: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
fd80: 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
fd90: 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
fda0: 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
fdb0: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
fdc0: 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
fdd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
fde0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
fdf0: 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
fe00: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
fe10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
fe20: 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f  IdxRowid(BtCurso
fe30: 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
fe40: 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
fe50: 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
fe60: 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
fe70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
fe80: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
fe90: 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
fea0: 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
feb0: 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
fec0: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
fed0: 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
fee0: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
fef0: 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73    Mem m, v;..  s
ff00: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
ff10: 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
ff20: 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
ff30: 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  Key<=0 ){.    re
ff40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ff50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
ff60: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
ff70: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
ff80: 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
ff90: 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
ffa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
ffb0: 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  c;.  }.  sqlite3
ffc0: 47 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  GetVarint32((u8*
ffd0: 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20  )m.z, &szHdr);. 
ffe0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
fff0: 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
10000 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77  Hdr-1], &typeRow
10010 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20  id);.  lenRowid 
10020 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
10030 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
10040 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
10050 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
10060 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
10070 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
10080 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
10090 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
100a0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
100b0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
100c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
100d0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
100e0 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
100f0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
10100 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f  r pC is point to
10110 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
10120 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b  key string in pK
10130 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b  ey (of length nK
10140 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ey).  Write into
10150 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
10160 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
10170 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
10180 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
10190 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
101a0 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
101b0 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52  er than pKey.  R
101c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
101d0 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
101e0 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72  * pKey is either
101f0 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
10200 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
10210 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
10220 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
10230 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
10240 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
10250 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10260 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
10270 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
10280 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
10290 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
102a0 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43  re(.  Cursor *pC
102b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
102c0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
102d0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
102e0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  st */.  int nKey
102f0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79  , const u8 *pKey
10300 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74  ,   /* The key t
10310 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
10320 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
10330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
10340 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
10350 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
10360 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
10370 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
10380 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
10390 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
103a0 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69  r;.  int lenRowi
103b0 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73  d;.  Mem m;..  s
103c0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
103d0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
103e0 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
103f0 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72  Key<=0 ){.    *r
10400 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
10410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10420 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10430 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
10440 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
10450 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d   nCellKey, 1, &m
10460 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
10470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10480 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
10490 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
104a0 69 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b  idLen((u8*)m.z);
104b0 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
104c0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
104d0 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  re(pC->pKeyInfo,
104e0 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d   m.n-lenRowid, m
104f0 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  .z, nKey, pKey);
10500 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
10510 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
10520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
10540 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
10550 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
10560 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
10570 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
10580 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
10590 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
105a0 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
105b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
105c0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
105d0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
105e0 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
105f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10600 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
10610 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
10620 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
10630 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
10640 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
10650 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
10660 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
10670 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
10680 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
10690 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
106a0 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
106b0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
106c0 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
106d0 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
106e0 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
106f0 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
10700 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
10710 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
10720 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
10730 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
10740 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
10750 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
10760 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
10770 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
10780 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
10790 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
107a0 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
107b0 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
107c0 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
107d0 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
107e0 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
107f0 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
10800 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
10810 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
10820 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
10830 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
10840 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
10850 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
10860 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
10870 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10880 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
10890 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
108a0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
108b0 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
108c0 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
108d0 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
108e0 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
108f0 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
10900 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
10910 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10920 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
10930 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
10940 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
10950 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
10960 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
10970 76 2d 3e 64 62 3b 0a 7d 0a                       v->db;.}.