/ Hex Artifact Content
Login

Artifact 9c2ce05e86502ac3dd148ed13535886e82678e04:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0660: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65  mt *pStmt){.  re
0670: 74 75 72 6e 20 28 28 56 64 62 65 20 2a 29 70 53  turn ((Vdbe *)pS
0680: 74 6d 74 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f  tmt)->zSql;.}../
0690: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06a0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06b0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06d0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06e0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06f0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0710: 0a 20 20 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74  .  int nTmp;.  t
0720: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0730: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0740: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0750: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0760: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0770: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0780: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0790: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07a0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07b0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07c0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07d0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07e0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07f0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0800: 70 3b 0a 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e  p;.  nTmp = pA->
0810: 6e 53 71 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c  nSql;.  pA->nSql
0820: 20 3d 20 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pB->nSql;.  p
0830: 42 2d 3e 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a  B->nSql = nTmp;.
0840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0850: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0860: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0870: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0880: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0890: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
08a0: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
08b0: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
08c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
08d0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
08e0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  y so that it con
08f0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 4e  tains at least N
0900: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  .** elements..**
0910: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0920: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0930: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0940: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a  ing the array,.*
0950: 2a 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  * Vdbe.aOp and V
0960: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0970: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74  ain unchanged (t
0980: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a  his is so that.*
0990: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  * any opcodes al
09a0: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
09b0: 63 61 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79  can be correctly
09c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20   deallocated.** 
09d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
09e0: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
09f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a00: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56   resizeOpArray(V
0a10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
0a20: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0a30: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0a40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70  p->nOpAlloc;.  p
0a50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a60: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a70: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0a80: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0a90: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0aa0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ab0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  Op = pNew;.    i
0ac0: 66 28 20 4e 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a  f( N>oldSize ){.
0ad0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
0ae0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
0af0: 2c 20 28 4e 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  , (N-oldSize)*si
0b00: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 7d  zeof(Op));.    }
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0b20: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b30: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b40: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b50: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b60: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0b80: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0b90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0ba0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bd0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0bf0: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c10: 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20 20 20  *    p1, p2     
0c20: 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20 6f       First two o
0c30: 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73 73  f the three poss
0c40: 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a 2a  ible operands..*
0c50: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
0c60: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
0c70: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
0c80: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
0c90: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
0ca0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
0cb0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
0cc0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
0cd0: 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70 65  of the P3.** ope
0ce0: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
0cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56 64  ite3VdbeAddOp(Vd
0d00: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0d10: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a  nt p1, int p2){.
0d20: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0d30: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0d40: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0d50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0d60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0d70: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0d80: 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  =i ){.    resize
0d90: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
0da0: 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30 29 3b  pAlloc*2 + 100);
0db0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
0dc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
0dd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0de0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0df0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0e00: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0e10: 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20 20  >opcode = op;.  
0e20: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
0e30: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
0e40: 70 4f 70 2d 3e 70 33 2e 70 20 3d 20 30 3b 0a 20  pOp->p3.p = 0;. 
0e50: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
0e60: 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e  3_NOTUSED;.  p->
0e70: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66  expired = 0;.#if
0e80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0e90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
0ea0: 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20  dbe_addop_trace 
0eb0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0ec0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0ed0: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  Op[i]);.#endif. 
0ee0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
0ef0: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
0f00: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
0f10: 74 68 65 20 70 33 20 76 61 6c 75 65 20 61 73 20  the p3 value as 
0f20: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
0f30: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33  t sqlite3VdbeOp3
0f40: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
0f50: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0f60: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
0f70: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
0f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
0f90: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
0fa0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 69 6e 74  */.  int p1, int
0fb0: 20 70 32 2c 20 20 20 20 20 2f 2a 20 50 31 20 61   p2,     /* P1 a
0fc0: 6e 64 20 50 32 20 6f 70 65 72 61 6e 64 73 20 2a  nd P2 operands *
0fd0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0fe0: 7a 50 33 2c 20 20 20 20 2f 2a 20 54 68 65 20 50  zP3,    /* The P
0ff0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  3 operand */.  i
1000: 6e 74 20 70 33 74 79 70 65 20 20 20 20 20 20 20  nt p3type       
1010: 20 20 20 2f 2a 20 50 33 20 6f 70 65 72 61 6e 64     /* P3 operand
1020: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   type */.){.  in
1030: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
1040: 56 64 62 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c  VdbeAddOp(p, op,
1050: 20 70 31 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69   p1, p2);.  sqli
1060: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
1070: 70 2c 20 61 64 64 72 2c 20 7a 50 33 2c 20 70 33  p, addr, zP3, p3
1080: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1090: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
10a0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
10b0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
10c0: 33 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  3 value as an in
10d0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
10e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 49 6e 74 28  lite3VdbeOp3Int(
10f0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1100: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1110: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1120: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1140: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1150: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  /.  int p1, int 
1160: 70 32 2c 20 20 20 20 20 2f 2a 20 50 31 20 61 6e  p2,     /* P1 an
1170: 64 20 50 32 20 6f 70 65 72 61 6e 64 73 20 2a 2f  d P2 operands */
1180: 0a 20 20 69 6e 74 20 70 33 20 20 20 20 20 20 20  .  int p3       
1190: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
11a0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20   operand */.){. 
11b0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
11c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 2c 20  te3VdbeAddOp(p, 
11d0: 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 69  op, p1, p2);.  i
11e0: 66 28 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  f( !p->db->mallo
11f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 4f  cFailed ){.    O
1200: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
1210: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 4f 70 2d  [addr];.    pOp-
1220: 3e 70 33 2e 69 20 3d 20 70 33 3b 0a 20 20 20 20  >p3.i = p3;.    
1230: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
1240: 5f 49 4e 54 33 32 3b 0a 20 20 7d 0a 20 20 72 65  _INT32;.  }.  re
1250: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1260: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1270: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1280: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1290: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
12a0: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
12b0: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
12c0: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
12d0: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
12e0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
12f0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
1300: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
1310: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
1320: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
1330: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1340: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1350: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1360: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1370: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1380: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1390: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
13a0: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
13b0: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
13c0: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
13d0: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
13e0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
13f0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
1400: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
1410: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
1420: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
1430: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1440: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1450: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1460: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1470: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1480: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1490: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
14a0: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
14b0: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
14c0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
14d0: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
14e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
1500: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
1510: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1520: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1530: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1540: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1550: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
1560: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d  nLabelAlloc = p-
1570: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1580: 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62   10;.    p->aLab
1590: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
15a0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
15b0: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
15f0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
1600: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
1610: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
1620: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1630: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1640: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1650: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1660: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1670: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1680: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1690: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
16a0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
16b0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
16c0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
16d0: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
16e0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
16f0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
1700: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1710: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
1720: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
1730: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1740: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1750: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1760: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
1770: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
1780: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
1790: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
17a0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
17b0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
17c0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
17d0: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
17e0: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
17f0: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
1800: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
1810: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
1820: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
1830: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1840: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1850: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1860: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
1870: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
1880: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
1890: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
18a0: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
18b0: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
18c0: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
18d0: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
18e0: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
18f0: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
1900: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
1910: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
1920: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
1930: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1940: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1950: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1960: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
1970: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
1980: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
1990: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
19a0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
19b0: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
19c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
19d0: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
19e0: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
19f0: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
1a00: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
1a10: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
1a20: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
1a30: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1a40: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1a50: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1a60: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
1a70: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
1a80: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
1a90: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
1aa0: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
1ab0: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
1ac0: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1ad0: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
1ae0: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
1af0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
1b00: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
1b10: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
1b20: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
1b30: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1b40: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1b50: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1b60: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
1b70: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
1b80: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
1b90: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
1ba0: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
1bb0: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
1bc0: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1bd0: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1be0: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1bf0: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1c00: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1c10: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1c20: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1c30: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1c40: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1c50: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1c60: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1c70: 55 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29  USH_MASK_1)<<16)
1c80: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1c90: 4b 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_2 + (((unsigne
1ca0: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29  d)NOPUSH_MASK_3)
1cb0: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1cc0: 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e  H_MASK_4 + (((un
1cd0: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1ce0: 53 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_5)<<16),.    
1cf0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20  NOPUSH_MASK_6 + 
1d00: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1d10: 53 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c  SH_MASK_7)<<16),
1d20: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1d30: 5f 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _8 + (((unsigned
1d40: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c  )NOPUSH_MASK_9)<
1d50: 3c 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65  <16).  };.  asse
1d60: 72 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20  rt( op<32*5 );. 
1d70: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f   return (masks[o
1d80: 70 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26  p>>5] & (1<<(op&
1d90: 30 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e  0x1F)));.}..#ifn
1da0: 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
1db0: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1dc0: 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20  NoPush(u8 op){. 
1dd0: 20 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f   return opcodeNo
1de0: 50 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64  Push(op);.}.#end
1df0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  if../*.** Loop t
1e00: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
1e10: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
1e20: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
1e30: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45  e negative..** E
1e40: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
1e50: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
1e60: 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79  lve the label by
1e70: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a   setting the P2.
1e80: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  ** value to its 
1e90: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
1ea0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1eb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ec0: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
1ed0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
1ee0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
1ef0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
1f00: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
1f10: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1f20: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
1f30: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
1f40: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
1f50: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
1f60: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
1f70: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
1f80: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
1f90: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
1fa0: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
1fb0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
1fc0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  *.** The integer
1fd0: 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73   *pMaxStack is s
1fe0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1ff0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  m number of vdbe
2000: 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65   stack.** entrie
2010: 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e  s that static an
2020: 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74  alysis reveals t
2030: 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68  his program migh
2040: 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t need..**.** Th
2050: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
2060: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
2070: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ng optimization:
2080: 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a    It scans for.*
2090: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  * instructions t
20a0: 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65 20  hat might cause 
20b0: 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  a statement roll
20c0: 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74  back.  Such inst
20d0: 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a  ructions.** are:
20e0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
20f0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
2100: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
2110: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2120: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
2130: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
2140: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
2150: 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66  VRename.**.** If
2160: 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63   no such instruc
2170: 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  tion is found, t
2180: 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d  hen every Statem
2190: 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ent instruction 
21a0: 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74  .** is changed t
21b0: 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68  o a Noop.  In th
21c0: 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64  is way, we avoid
21d0: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73 74   creating the st
21e0: 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72  atement .** jour
21f0: 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73  nal file unneces
2200: 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sarily..*/.stati
2210: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
2220: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
2230: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
2240: 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63  s, int *pMaxStac
2250: 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  k){.  int i;.  i
2260: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b  nt nMaxArgs = 0;
2270: 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b  .  int nMaxStack
2280: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20   = p->nOp;.  Op 
2290: 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  *pOp;.  int *aLa
22a0: 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b  bel = p->aLabel;
22b0: 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65  .  int doesState
22c0: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  mentRollback = 0
22d0: 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65  ;.  int hasState
22e0: 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20  mentBegin = 0;. 
22f0: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
2300: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
2310: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
2320: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
2330: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
2340: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
2350: 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63  _Function || opc
2360: 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20  ode==OP_AggStep 
2370: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2380: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2390: 45 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63  E.        || opc
23a0: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a  ode==OP_VUpdate.
23b0: 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
23c0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
23d0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
23e0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
23f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
2400: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a  ode==OP_Halt ){.
2410: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2420: 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  1==SQLITE_CONSTR
2430: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
2440: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
2450: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
2460: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
2470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2480: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2490: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
24a0: 20 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74      hasStatement
24b0: 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  Begin = 1;.    }
24c0: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
24d0: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20  =OP_Destroy ){. 
24e0: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
24f0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
2500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2510: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2520: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2530: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
2540: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
2550: 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  VRename ){.     
2560: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
2570: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
2580: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2590: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
25a0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
25b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
25c0: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
25d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
25e0: 2d 32 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -2].opcode==OP_I
25f0: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
2600: 6e 20 3d 20 70 4f 70 5b 2d 32 5d 2e 70 31 3b 0a  n = pOp[-2].p1;.
2610: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
2620: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
2630: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
2640: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
2650: 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65 29 20 29  NoPush(opcode) )
2660: 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53 74 61 63  {.      nMaxStac
2670: 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  k--;.    }..    
2680: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  if( pOp->p2>=0 )
2690: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
26a0: 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70  ssert( -1-pOp->p
26b0: 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  2<p->nLabel );. 
26c0: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
26d0: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
26e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
26f0: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
2700: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
2710: 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ..  *pMaxFuncArg
2720: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
2730: 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d 61  *pMaxStack = nMa
2740: 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  xStack;..  /* If
2750: 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61   we never rollba
2760: 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ck a statement t
2770: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
2780: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
2790: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
27a0: 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f   not needed.  So
27b0: 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50   change every OP
27c0: 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20  _Statement.  ** 
27d0: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f  opcode into an O
27e0: 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76  P_Noop.  This av
27f0: 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  oid a call to sq
2800: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
2810: 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69 63  sive().  ** whic
2820: 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69  h can be expensi
2830: 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66  ve on some platf
2840: 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  orms..  */.  if(
2850: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
2860: 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74 65  in && !doesState
2870: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  mentRollback ){.
2880: 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61      for(pOp=p->a
2890: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
28a0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
28b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
28c0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61  ->opcode==OP_Sta
28d0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
28e0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
28f0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  OP_Noop;.      }
2900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2910: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
2920: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2930: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2940: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
2950: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2960: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
2970: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
2980: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2990: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
29a0: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
29b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
29c0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
29d0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
29e0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
29f0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
2a00: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
2a10: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
2a20: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2a30: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
2a40: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
2a50: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
2a60: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
2a70: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
2a80: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2a90: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2aa0: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
2ab0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b  > p->nOpAlloc ){
2ac0: 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72  .    resizeOpArr
2ad0: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 2a 32 20 2b  ay(p, p->nOp*2 +
2ae0: 20 6e 4f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28   nOp);.  }.  if(
2af0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
2b00: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
2b10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72  rn 0;.  }.  addr
2b20: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
2b30: 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e   nOp>0 ){.    in
2b40: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c  t i;.    VdbeOpL
2b50: 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d  ist const *pIn =
2b60: 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d   aOp;.    for(i=
2b70: 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70  0; i<nOp; i++, p
2b80: 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  In++){.      int
2b90: 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20   p2 = pIn->p2;. 
2ba0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75       VdbeOp *pOu
2bb0: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  t = &p->aOp[i+ad
2bc0: 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  dr];.      pOut-
2bd0: 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f  >opcode = pIn->o
2be0: 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75  pcode;.      pOu
2bf0: 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b  t->p1 = pIn->p1;
2c00: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20  .      pOut->p2 
2c10: 3d 20 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20  = p2<0 ? addr + 
2c20: 41 44 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20  ADDR(p2) : p2;. 
2c30: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 2e 70 20       pOut->p3.p 
2c40: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
2c50: 20 70 4f 75 74 2d 3e 70 33 74 79 70 65 20 3d 20   pOut->p3type = 
2c60: 70 49 6e 2d 3e 70 33 20 3f 20 50 33 5f 53 54 41  pIn->p3 ? P3_STA
2c70: 54 49 43 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44  TIC : P3_NOTUSED
2c80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2c90: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
2ca0: 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64  sqlite3_vdbe_add
2cb0: 6f 70 5f 74 72 61 63 65 20 29 7b 0a 20 20 20 20  op_trace ){.    
2cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
2cd0: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
2ce0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
2cf0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
2d00: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
2d10: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
2d20: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2d30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2d40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2d50: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
2d60: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2d70: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
2d80: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
2d90: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
2da0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
2db0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
2dc0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
2dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2de0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
2df0: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
2e00: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
2e10: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
2e20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2e30: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
2e40: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
2e50: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
2e60: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
2e70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2e80: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
2e90: 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f  addr>=0 && p->nO
2ea0: 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70  p>addr && p->aOp
2eb0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
2ec0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
2ed0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
2ee0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2ef0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
2f00: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2f10: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
2f20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2f30: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
2f40: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
2f50: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2f60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
2f70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2f80: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2f90: 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20 29  assert( val>=0 )
2fa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  ;.  assert( p==0
2fb0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2fc0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2fd0: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2fe0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2ff0: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
3000: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3010: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
3020: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3030: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
3040: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
3050: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
3060: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
3070: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
3080: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
3090: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
30a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
30b0: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
30c0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c  int addr){.  sql
30d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
30e0: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
30f0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
3100: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
3110: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
3120: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
3130: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
3140: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
3150: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
3160: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
3170: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3180: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3190: 6e 28 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  n(FuncDef *pDef)
31a0: 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26 20  {.  if( pDef && 
31b0: 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
31c0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
31d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
31e0: 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a  te3_free(pDef);.
31f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
3200: 65 74 65 20 61 20 50 33 20 76 61 6c 75 65 20 69  ete a P3 value i
3210: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
3220: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3230: 50 33 28 69 6e 74 20 70 33 74 79 70 65 2c 20 76  P3(int p3type, v
3240: 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69 66 28 20  oid *p3){.  if( 
3250: 70 33 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  p3 ){.    switch
3260: 28 20 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p3type ){.    
3270: 20 20 63 61 73 65 20 50 33 5f 52 45 41 4c 3a 0a    case P3_REAL:.
3280: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 49 4e        case P3_IN
3290: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
32a0: 50 33 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20  P3_MPRINTF:.    
32b0: 20 20 63 61 73 65 20 50 33 5f 44 59 4e 41 4d 49    case P3_DYNAMI
32c0: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 33  C:.      case P3
32d0: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
32e0: 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  case P3_KEYINFO_
32f0: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
3300: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3310: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
3320: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3330: 20 20 63 61 73 65 20 50 33 5f 56 44 42 45 46 55    case P3_VDBEFU
3340: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
3350: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
3360: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
3370: 70 33 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p3;.        free
3380: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3390: 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  n(pVdbeFunc->pFu
33a0: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nc);.        sql
33b0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
33c0: 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c  xData(pVdbeFunc,
33d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
33e0: 69 74 65 33 5f 66 72 65 65 28 70 56 64 62 65 46  ite3_free(pVdbeF
33f0: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  unc);.        br
3400: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3410: 20 20 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44     case P3_FUNCD
3420: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
3430: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3440: 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a 29 70 33  ion((FuncDef*)p3
3450: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3470: 63 61 73 65 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20  case P3_MEM: {. 
3480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
3490: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
34a0: 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20  _value*)p3);.   
34b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
34d0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e  ../*.** Change N
34e0: 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e   opcodes startin
34f0: 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d  g at addr to No-
3500: 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ops..*/.void sql
3510: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
3520: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
3530: 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a  t addr, int N){.
3540: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f    if( p && p->aO
3550: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
3560: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
3570: 64 64 72 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  ddr];.    while(
3580: 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72   N-- ){.      fr
3590: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
35a0: 2c 20 70 4f 70 2d 3e 70 33 2e 70 29 3b 0a 20 20  , pOp->p3.p);.  
35b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
35c0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
35d0: 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ));.      pOp->o
35e0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
35f0: 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20  .      pOp++;.  
3600: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3610: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3620: 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72  e of the P3 oper
3630: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3640: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3650: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3660: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
3670: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
3680: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
3690: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
36a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
36b0: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
36c0: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
36d0: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
36e0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
36f0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
3700: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33 20  >=0 then the P3 
3710: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
3720: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
3730: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
3740: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
3750: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
3760: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3770: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
3780: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
3790: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
37a0: 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e   of zP3 up to an
37b0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
37c0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
37d0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
37e0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
37f0: 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP3..**.** If
3800: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69   n==P3_KEYINFO i
3810: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33  t means that zP3
3820: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3830: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
3840: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
3850: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
3860: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3870: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
3880: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
3890: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f  lite3_malloc, to
38a0: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
38b0: 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c  he Vdbe is final
38c0: 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b  ized..** n==P3_K
38d0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
38e0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50  ndicates that zP
38f0: 33 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  3 points to a Ke
3900: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
3910: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ** stored in mem
3920: 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c  ory that the cal
3930: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
3940: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3950: 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61  lloc. The .** ca
3960: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
3970: 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  free the allocat
3980: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
3990: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
39a0: 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69  dbe is.** finali
39b0: 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zed..** .** Othe
39c0: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
39d0: 33 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f 4c  3_STATIC, P3_COL
39e0: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
39f0: 61 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f 69  ate that zP3 poi
3a00: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
3a10: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
3a20: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
3a30: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
3a40: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
3a50: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
3a60: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
3a70: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
3a80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
3a90: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
3aa0: 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65 20  hange P3 on the 
3ab0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
3ac0: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
3ad0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3ae0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3af0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3b00: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
3b10: 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P3, int n){.  Op
3b20: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28   *pOp;.  assert(
3b30: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
3b40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3b50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  IT );.  if( p==0
3b60: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c   || p->aOp==0 ||
3b70: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
3b80: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28  iled ){.    if (
3b90: 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 29  n != P3_KEYINFO)
3ba0: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 33 28   {.      freeP3(
3bb0: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
3bc0: 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d 0a  **)&zP3);.    }.
3bd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3be0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c 20    if( addr<0 || 
3bf0: 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  addr>=p->nOp ){.
3c00: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
3c10: 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61  p - 1;.    if( a
3c20: 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ddr<0 ) return;.
3c30: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
3c40: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
3c50: 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c  eP3(pOp->p3type,
3c60: 20 70 4f 70 2d 3e 70 33 2e 70 29 3b 0a 20 20 70   pOp->p3.p);.  p
3c70: 4f 70 2d 3e 70 33 2e 70 20 3d 20 30 3b 0a 20 20  Op->p3.p = 0;.  
3c80: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3c90: 20 20 70 4f 70 2d 3e 70 33 2e 70 20 3d 20 30 3b    pOp->p3.p = 0;
3ca0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
3cb0: 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P3_NOTUSED;. 
3cc0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
3cd0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
3ce0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
3cf0: 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  o;.    int nFiel
3d00: 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  d, nByte;..    n
3d10: 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66  Field = ((KeyInf
3d20: 6f 2a 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b  o*)zP3)->nField;
3d30: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
3d40: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b  eof(*pKeyInfo) +
3d50: 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65   (nField-1)*size
3d60: 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of(pKeyInfo->aCo
3d70: 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b  ll[0]) + nField;
3d80: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
3d90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
3da0: 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70  nByte );.    pOp
3db0: 2d 3e 70 33 2e 70 20 3d 20 28 63 68 61 72 2a 29  ->p3.p = (char*)
3dc0: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66  pKeyInfo;.    if
3dd0: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
3de0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
3df0: 72 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  r *aSortOrder;. 
3e00: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3e10: 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42 79 74 65  Info, zP3, nByte
3e20: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
3e30: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
3e40: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3e50: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
3e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
3e70: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3e80: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3e90: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
3ea0: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
3eb0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3ec0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3ed0: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
3ee0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
3ef0: 20 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65       pOp->p3type
3f00: 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P3_KEYINFO;. 
3f10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3f20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3f30: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
3f40: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
3f50: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3f60: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
3f70: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3f80: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 2e   ){.    pOp->p3.
3f90: 70 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a  p = (char*)zP3;.
3fa0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
3fb0: 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P3_KEYINFO;.  
3fc0: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3fd0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 2e 70 20 3d  .    pOp->p3.p =
3fe0: 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20   (char*)zP3;.   
3ff0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e   pOp->p3type = n
4000: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
4010: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74  f( n==0 ) n = st
4020: 72 6c 65 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70  rlen(zP3);.    p
4030: 4f 70 2d 3e 70 33 2e 70 20 3d 20 73 71 6c 69 74  Op->p3.p = sqlit
4040: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
4050: 62 2c 20 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20  b, zP3, n);.    
4060: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
4070: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
4080: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
4090: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
40a0: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
40b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
40c0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
40d0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
40e0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
40f0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
4100: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
4110: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
4120: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
4130: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
4140: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4150: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
4160: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
4170: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
4180: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4190: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
41a0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d  , zFormat);.  p-
41b0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
41c0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
41d0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
41e0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
41f0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23   va_end(ap);.}.#
4200: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
4210: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
4220: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
4230: 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ss..*/.VdbeOp *s
4240: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
4250: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4260: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  r){.  assert( p-
4270: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4280: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
4290: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
42a0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
42b0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
42c0: 69 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  iled );.  return
42d0: 20 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64   ((addr>=0 && ad
42e0: 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e  dr<p->nOp)?(&p->
42f0: 61 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d  aOp[addr]):0);.}
4300: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
4320: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
4330: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
4340: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
4350: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
4360: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4370: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
4380: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
4390: 63 72 69 62 65 73 20 74 68 65 20 50 33 20 70 61  cribes the P3 pa
43a0: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
43b0: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
43c0: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
43d0: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
43e0: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
43f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
4400: 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20  playP3(Op *pOp, 
4410: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
4420: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
4430: 2a 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP3 = zTemp;.  
4440: 69 6e 74 20 6e 50 33 3b 0a 20 20 61 73 73 65 72  int nP3;.  asser
4450: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
4460: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
4470: 33 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  3type ){.    cas
4480: 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P3_KEYINFO: {.
4490: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
44a0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
44b0: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
44c0: 66 6f 2a 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20  fo*)pOp->p3.p;. 
44d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
44e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
44f0: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
4500: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
4510: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
4520: 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20  trlen(zTemp);.  
4530: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
4540: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
4550: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
4560: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
4570: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
4580: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
4590: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
45a0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
45b0: 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  n(pColl->zName);
45c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
45d0: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
45e0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
45f0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
4600: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
4610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4620: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
4630: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
4640: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
4650: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
4660: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
4670: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
4680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
4690: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
46a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
46b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
46c0: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
46d0: 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20  Name,n+1);.     
46e0: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
46f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
4700: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
4710: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
4720: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c  zTemp[i],",nil",
4730: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  4);.          i 
4740: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
4750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
4760: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
4770: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
4780: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
4790: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
47a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
47b0: 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c      case P3_COLL
47c0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
47d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
47e0: 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 2e  ollSeq*)pOp->p3.
47f0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
4800: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4810: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
4820: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
4830: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
4840: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4850: 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a  case P3_FUNCDEF:
4860: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
4870: 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65   *pDef = (FuncDe
4880: 66 2a 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20 20  f*)pOp->p3.p;.  
4890: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
48a0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
48b0: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
48c0: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
48d0: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
48e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
48f0: 73 65 20 50 33 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P3_INT64: {. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4910: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4920: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 28 73 71  mp, "%lld", *(sq
4930: 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 4f 70  lite3_int64*)pOp
4940: 2d 3e 70 33 2e 70 29 3b 0a 20 20 20 20 20 20 62  ->p3.p);.      b
4950: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4960: 63 61 73 65 20 50 33 5f 49 4e 54 33 32 3a 20 7b  case P3_INT32: {
4970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4980: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4990: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
49a0: 3e 70 33 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p3.i);.      br
49b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
49c0: 61 73 65 20 50 33 5f 52 45 41 4c 3a 20 7b 0a 20  ase P3_REAL: {. 
49d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
49e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
49f0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 28 64  mp, "%.16g", *(d
4a00: 6f 75 62 6c 65 2a 29 70 4f 70 2d 3e 70 33 2e 70  ouble*)pOp->p3.p
4a10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4a30: 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  3_MEM: {.      M
4a40: 65 6d 20 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a  em *pMem = (Mem*
4a50: 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20 20 20 20  )pOp->p3.p;.    
4a60: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
4a70: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
4a80: 20 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4d 65         zP3 = pMe
4a90: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
4aa0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
4ab0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
4ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
4ad0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4ae0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
4af0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
4b00: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
4b10: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
4b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4b30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4b40: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
4b50: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
4b60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
4b70: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4b80: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
4b90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4ba0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4bb0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  NULL");.      }.
4bc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4bd0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4be0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4bf0: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 33 5f  BLE.    case P3_
4c00: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
4c10: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
4c20: 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
4c30: 62 2a 29 70 4f 70 2d 3e 70 33 2e 70 3b 0a 20 20  b*)pOp->p3.p;.  
4c40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4c50: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4c60: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
4c70: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
4c80: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62  Module);.      b
4c90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4ca0: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
4cb0: 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f  {.      zP3 = pO
4cc0: 70 2d 3e 70 33 2e 70 3b 0a 20 20 20 20 20 20 69  p->p3.p;.      i
4cd0: 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70  f( zP3==0 || pOp
4ce0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
4cf0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 33  p ){.        zP3
4d00: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
4d10: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
4d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4d30: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 33 21  }.  assert( zP3!
4d40: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
4d50: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
4d60: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 26 26  pOp->zComment &&
4d70: 20 7a 50 33 3d 3d 7a 54 65 6d 70 20 26 26 20 28   zP3==zTemp && (
4d80: 6e 50 33 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33  nP3 = strlen(zP3
4d90: 29 29 3c 6e 54 65 6d 70 20 29 7b 0a 20 20 20 20  ))<nTemp ){.    
4da0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4db0: 28 6e 54 65 6d 70 2d 6e 50 33 2c 20 26 7a 50 33  (nTemp-nP3, &zP3
4dc0: 5b 6e 50 33 5d 2c 20 22 25 73 23 20 25 73 22 2c  [nP3], "%s# %s",
4dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4de0: 20 20 20 20 20 20 6e 50 33 3e 30 20 3f 20 22 20        nP3>0 ? " 
4df0: 22 20 3a 20 22 22 2c 20 70 4f 70 2d 3e 7a 43 6f  " : "", pOp->zCo
4e00: 6d 6d 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  mment);.  }.#end
4e10: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b  if.  return zP3;
4e20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4e30: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
4e40: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
4e50: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
4e60: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
4e70: 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ..**.*/.void sql
4e80: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
4e90: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
4ea0: 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20  ){.  int mask;. 
4eb0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4ec0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b   i<p->db->nDb );
4ed0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73 69 7a  .  assert( i<siz
4ee0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
4ef0: 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  )*8 );.  mask = 
4f00: 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e  1<<i;.  if( (p->
4f10: 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b  btreeMask & mask
4f20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62  )==0 ){.    p->b
4f30: 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  treeMask |= mask
4f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
4f50: 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65  eeMutexArrayInse
4f60: 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70  rt(&p->aMutex, p
4f70: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
4f80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64  );.  }.}...#if d
4f90: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
4fa0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
4fb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
4fc0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
4fd0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
4fe0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4ff0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
5000: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
5010: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
5020: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
5030: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
5040: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61  char *zP3;.  cha
5050: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74  r zPtr[50];.  st
5060: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5070: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
5080: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
5090: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
50a0: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
50b0: 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73  out;.  zP3 = dis
50c0: 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72  playP3(pOp, zPtr
50d0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
50e0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
50f0: 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20   zFormat1,.     
5100: 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f   pc, sqlite3Opco
5110: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
5120: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
5130: 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20 66  p->p2, zP3);.  f
5140: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
5150: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
5160: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
5170: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
5180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
5190: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
51a0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
51b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68   if( p ){.    wh
51c0: 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20  ile( N-->0 ){.  
51d0: 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32 20      assert( N<2 
51e0: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
51f0: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  .db );.      sql
5200: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
5210: 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20  se(p++);.    }. 
5220: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5230: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5240: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
5250: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
5260: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
5270: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
5280: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
5290: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
52a0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
52b0: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
52c0: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
52d0: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
52e0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
52f0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
5300: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
5310: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
5320: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
5330: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69   "EXPLAIN"..*/.i
5340: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
5350: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
5380: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
5390: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  = p->db;.  int i
53a0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
53b0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
53c0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
53d0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
53e0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
53f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5400: 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74  MISUSE;.  assert
5410: 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c  ( db->magic==SQL
5420: 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29  ITE_MAGIC_BUSY )
5430: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
5440: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
5450: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
5460: 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  SY );..  /* Even
5470: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
5480: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 75 74  ode does not put
5490: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
54a0: 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   onto the.  ** t
54b0: 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79 20 6d  he stack, they m
54c0: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
54d0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
54e0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
54f0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
5500: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
5510: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
5520: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
5530: 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 73 75 6c  .  if( p->pResul
5540: 74 53 65 74 20 29 7b 0a 20 20 20 20 72 65 6c 65  tSet ){.    rele
5550: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 70  aseMemArray(p->p
5560: 52 65 73 75 6c 74 53 65 74 2c 20 35 29 3b 0a 20  ResultSet, 5);. 
5570: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
5580: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b   = 0;.  }..  do{
5590: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
55a0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d  ;.  }while( i<p-
55b0: 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61  >nOp && p->expla
55c0: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
55d0: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
55e0: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
55f0: 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  >=p->nOp ){.    
5600: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
5610: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
5620: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
5630: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
5640: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
5650: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5660: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
5670: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
5690: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
56a0: 73 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  sg, sqlite3ErrSt
56b0: 72 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a  r(p->rc), (char*
56c0: 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )0);.  }else{.  
56d0: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e    Op *pOp = &p->
56e0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20  aOp[i];.    Mem 
56f0: 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75  *pMem = p->pResu
5700: 6c 74 53 65 74 20 3d 20 70 2d 3e 61 53 74 61 63  ltSet = p->aStac
5710: 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  k;.    pMem->fla
5720: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
5730: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5740: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
5750: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
5760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
5790: 74 65 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b  ter */.    pMem+
57a0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
57b0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
57c0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
57d0: 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  m;.    pMem->z =
57e0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
57f0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
5800: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
5810: 64 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  de */.    assert
5820: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
5830: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
5840: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
5850: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5860: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
5870: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
5880: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d  ITE_UTF8;.    pM
5890: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
58a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
58b0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
58c0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
58f0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5900: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5910: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5920: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5930: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
5940: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
5970: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
5980: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5990: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
59a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
59b0: 20 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53   MEM_Ephem|MEM_S
59c0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 20  tr|MEM_Term;    
59d0: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
59e0: 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50  em->z = displayP
59f0: 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68  3(pOp, pMem->zSh
5a00: 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d  ort, sizeof(pMem
5a10: 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20  ->zShort));.    
5a20: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
5a30: 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  =0 );.    pMem->
5a40: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
5a50: 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  >z);.    pMem->t
5a60: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
5a70: 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  T;.    pMem->enc
5a80: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
5a90: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
5aa0: 6d 6e 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65  mn = 5 - 2*(p->e
5ab0: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
5ac0: 2d 3e 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20  ->pTos = pMem;. 
5ad0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
5ae0: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
5af0: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
5b00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
5b10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5b20: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
5b30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5b40: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
5b50: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
5b60: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
5b70: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
5b80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5b90: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
5ba0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
5bb0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
5bc0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
5bd0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
5be0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
5bf0: 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70  [nOp-1];.  if( p
5c00: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
5c10: 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 2e 70  oop && pOp->p3.p
5c20: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=0 ){.    const
5c30: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
5c40: 70 33 2e 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  p3.p;.    while(
5c50: 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a   isspace(*(u8*)z
5c60: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69  ) ) z++;.    pri
5c70: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
5c80: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
5c90: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
5ca0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5cb0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
5cc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
5cd0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
5ce0: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
5cf0: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
5d00: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
5d10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
5d20: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
5d30: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
5d40: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
5d50: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
5d60: 74 65 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20  te3_io_trace==0 
5d70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5d80: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
5d90: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
5da0: 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f  nOp-1];.  if( pO
5db0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f  p->opcode==OP_No
5dc0: 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 2e 70 21  op && pOp->p3.p!
5dd0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
5de0: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
5df0: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
5e00: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
5e10: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
5e20: 4f 70 2d 3e 70 33 2e 70 29 3b 0a 20 20 20 20 66  Op->p3.p);.    f
5e30: 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28  or(i=0; isspace(
5e40: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
5e50: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
5e60: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
5e70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
5e80: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
5e90: 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a  d char)z[i]) ){.
5ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
5eb0: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
5ec0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
5ed0: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
5ee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5ef0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
5f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5f10: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
5f20: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63   sqlite3_io_trac
5f30: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
5f40: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
5f50: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
5f60: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
5f70: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
5f80: 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  .../*.** Prepare
5f90: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
5fa0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
5fb0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
5fc0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
5fd0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
5fe0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
5ff0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
6000: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
6010: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
6020: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
6030: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
6040: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
6050: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
6060: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
6070: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
6080: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
6090: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
60a0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
60b0: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
60c0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69  AGIC_RUN..*/.voi
60d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
60e0: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
60f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6100: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6110: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  VDBE */.  int nV
6120: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
6130: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6140: 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e  er of '?' see in
6150: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
6160: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  nt */.  int nMem
6170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6180: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6190: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
61a0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
61b0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20    int nCursor,  
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
61e0: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  rsors to allocat
61f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70  e */.  int isExp
6200: 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
6210: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
6220: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
6230: 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74  words is present
6240: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
6250: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6260: 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  p->db;..  assert
6270: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
6280: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
6290: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
62a0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
62b0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
62c0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
62d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
62e0: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
62f0: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
6300: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
6310: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
6320: 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a  later. This.   *
6330: 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
6340: 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70  call to resizeOp
6350: 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61  Array() below ma
6360: 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20  y shrink the.   
6370: 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79  * p->aOp[] array
6380: 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20   to save memory 
6390: 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  if called when i
63a0: 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  n VDBE_MAGIC_RUN
63b0: 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20   .   * state..  
63c0: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
63d0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
63e0: 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75  ..  /* No instru
63f0: 63 74 69 6f 6e 20 65 76 65 72 20 70 75 73 68 65  ction ever pushe
6400: 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 73 69  s more than a si
6410: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74  ngle element ont
6420: 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b  o the.  ** stack
6430: 2e 20 20 41 6e 64 20 74 68 65 20 73 74 61 63 6b  .  And the stack
6440: 20 6e 65 76 65 72 20 67 72 6f 77 73 20 6f 6e 20   never grows on 
6450: 73 75 63 63 65 73 73 69 76 65 20 65 78 65 63 75  successive execu
6460: 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a  tions of the.  *
6470: 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f  * same loop.  So
6480: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
6490: 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  r of instruction
64a0: 73 20 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f  s is an upper bo
64b0: 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  und.  ** on the 
64c0: 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65  maximum stack de
64d0: 70 74 68 20 72 65 71 75 69 72 65 64 2e 20 20 28  pth required.  (
64e0: 41 64 64 65 64 20 6c 61 74 65 72 3a 29 20 20 54  Added later:)  T
64f0: 68 65 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 50  he.  ** resolveP
6500: 32 56 61 6c 75 65 73 28 29 20 63 61 6c 6c 20 63  2Values() call c
6510: 6f 6d 70 75 74 65 73 20 61 20 74 69 67 68 74 65  omputes a tighte
6520: 72 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  r upper bound on
6530: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
6540: 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  size..  **.  ** 
6550: 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74  Allocation all t
6560: 68 65 20 73 74 61 63 6b 20 73 70 61 63 65 20 77  he stack space w
6570: 65 20 77 69 6c 6c 20 65 76 65 72 20 6e 65 65 64  e will ever need
6580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
6590: 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  aStack==0 ){.   
65a0: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
65b0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
65c0: 65 72 20 6f 66 20 61 72 67 73 20 70 61 73 73 65  er of args passe
65d0: 64 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63  d to a user func
65e0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tion. */.    int
65f0: 20 6e 53 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20   nStack;     /* 
6600: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
6610: 66 20 73 74 61 63 6b 20 65 6e 74 72 69 65 73 20  f stack entries 
6620: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
6630: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
6640: 70 2c 20 26 6e 41 72 67 2c 20 26 6e 53 74 61 63  p, &nArg, &nStac
6650: 6b 29 3b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70  k);.    resizeOp
6660: 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29  Array(p, p->nOp)
6670: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 56  ;.    assert( nV
6680: 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ar>=0 );.    ass
6690: 65 72 74 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e  ert( nStack<p->n
66a0: 4f 70 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  Op );.    if( is
66b0: 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
66c0: 20 6e 53 74 61 63 6b 20 3d 20 31 30 3b 0a 20 20   nStack = 10;.  
66d0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 53 74 61 63    }.    p->aStac
66e0: 6b 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  k = sqlite3DbMal
66f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
6700: 20 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a 65 6f      nStack*sizeo
6710: 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20  f(p->aStack[0]) 
6720: 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a     /* aStack */.
6730: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
6740: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
6750: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
6760: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
6770: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
6780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61            /* aVa
6790: 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  r */.      + nVa
67a0: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  r*sizeof(char*) 
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
67c0: 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  zVar */.      + 
67d0: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
67f0: 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  * aMem */.      
6800: 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  + nCursor*sizeof
6810: 28 43 75 72 73 6f 72 2a 29 20 20 20 20 20 20 20  (Cursor*)       
6820: 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20   /* apCsr */.   
6830: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d   );.    if( !db-
6840: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6850: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  .      p->aMem =
6860: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61   &p->aStack[nSta
6870: 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  ck];.      p->nM
6880: 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20  em = nMem;.     
6890: 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61   p->aVar = &p->a
68a0: 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20  Mem[nMem];.     
68b0: 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b   p->nVar = nVar;
68c0: 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20  .      p->okVar 
68d0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  = 0;.      p->ap
68e0: 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d  Arg = (Mem**)&p-
68f0: 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  >aVar[nVar];.   
6900: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63     p->azVar = (c
6910: 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b  har**)&p->apArg[
6920: 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nArg];.      p->
6930: 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a  apCsr = (Cursor*
6940: 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72  *)&p->azVar[nVar
6950: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72  ];.      p->nCur
6960: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
6970: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
6980: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
6990: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
69a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
69b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
69c0: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
69d0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e     }.      for(n
69e0: 3d 30 3b 20 6e 3c 6e 53 74 61 63 6b 3b 20 6e 2b  =0; n<nStack; n+
69f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
6a00: 53 74 61 63 6b 5b 6e 5d 2e 64 62 20 3d 20 64 62  Stack[n].db = db
6a10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a20: 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e    }.  for(n=0; n
6a30: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
6a40: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
6a50: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
6a60: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e  .    p->aMem[n].
6a70: 64 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 0a 20 20  db = db;.  }..  
6a80: 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53  p->pTos = &p->aS
6a90: 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70  tack[-1];.  p->p
6aa0: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
6ab0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
6ac0: 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b  ->uniqueCnt = 0;
6ad0: 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74  .  p->returnDept
6ae0: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f  h = 0;.  p->erro
6af0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
6b00: 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63  rt;.  p->popStac
6b10: 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70  k =  0;.  p->exp
6b20: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
6b30: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
6b40: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
6b50: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
6b60: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
6b70: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
6b80: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
6b90: 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53  55;.  p->openedS
6ba0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69  tatement = 0;.#i
6bb0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
6bc0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
6bd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6be0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
6bf0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
6c00: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
6c10: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
6c20: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
6c30: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
6c40: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
6c50: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
6c60: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
6c70: 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70 65  hat cursor happe
6c80: 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ns.** to hold..*
6c90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6ca0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
6cb0: 65 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43  e *p, Cursor *pC
6cc0: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
6cd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
6ce0: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
6cf0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
6d00: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
6d10: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
6d20: 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  or);.  }.  if( p
6d30: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
6d40: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
6d50: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a  (pCx->pBt);.  }.
6d60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6d70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6d80: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
6d90: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
6da0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
6db0: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
6dc0: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
6dd0: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
6de0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
6df0: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
6e00: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
6e10: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
6e20: 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79     sqlite3Safety
6e30: 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  Off(p->db);.    
6e40: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
6e50: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
6e60: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
6e70: 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  n(p->db);.    p-
6e80: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
6e90: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
6ea0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78  sqlite3_free(pCx
6eb0: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->pData);.  sqli
6ec0: 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 61 54  te3_free(pCx->aT
6ed0: 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ype);.  sqlite3_
6ee0: 66 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a  free(pCx);.}../*
6ef0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
6f00: 72 73 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72  rsors except for
6f10: 20 56 54 61 62 20 63 75 72 73 6f 72 73 20 74 68   VTab cursors th
6f20: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
6f30: 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  .** in use..*/.s
6f40: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
6f50: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
6f60: 41 63 74 69 76 65 56 74 61 62 73 28 56 64 62 65  ActiveVtabs(Vdbe
6f70: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
6f80: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30   if( p->apCsr==0
6f90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6fa0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
6fb0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75  or; i++){.    Cu
6fc0: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
6fd0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Csr[i];.    if( 
6fe0: 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61  pC && (!p->inVta
6ff0: 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e  bMethod || !pC->
7000: 70 56 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a  pVtabCursor) ){.
7010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7020: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
7030: 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  C);.      p->apC
7040: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  sr[i] = 0;.    }
7050: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
7060: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
7070: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
7080: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7090: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
70a0: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
70b0: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
70c0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
70d0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
70e0: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
70f0: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
7100: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
7110: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
7120: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
7130: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
7140: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7150: 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b  .  if( p->aStack
7160: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
7170: 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63  emArray(p->aStac
7180: 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20  k, 1 + (p->pTos 
7190: 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20  - p->aStack));. 
71a0: 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d     p->pTos = &p-
71b0: 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d  >aStack[-1];.  }
71c0: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
71d0: 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74  rsExceptActiveVt
71e0: 61 62 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73  abs(p);.  releas
71f0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
7200: 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73  m, p->nMem);.  s
7210: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
7220: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
7230: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
7240: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
7250: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
7260: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
7270: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7280: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
7290: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
72a0: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
72b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
72c0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
72d0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
72e0: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
72f0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
7300: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
7310: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
7320: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
7330: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
7340: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
7350: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
7360: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
7370: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7380: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
7390: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
73a0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
73b0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
73c0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
73d0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
73e0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
73f0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
7400: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
7410: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
7420: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
7430: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
7440: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
7450: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
7460: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
7470: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7480: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
7490: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
74a0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
74b0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
74c0: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
74d0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
74e0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
74f0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
7500: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43  lite3_free(p->aC
7510: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
7520: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
7530: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
7540: 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  lumn = nResColum
7550: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
7560: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
7570: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
7580: 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73  locZero(p->db, s
7590: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
75a0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
75b0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
75c0: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
75d0: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
75e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
75f0: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
7600: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
7610: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
7630: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
7640: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
7650: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7660: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
7670: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
7680: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
7690: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
76a0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
76b0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
76c0: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
76d0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
76e0: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
76f0: 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41  .** If N==P3_STA
7700: 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68  TIC  it means th
7710: 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f  at zName is a po
7720: 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74  inter to a const
7730: 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74  ant static.** st
7740: 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20  ring and we can 
7750: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
7760: 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20  inter. If it is 
7770: 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  P3_DYNAMIC, then
7780: 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20   .** the string 
7790: 69 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  is freed using s
77a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 77 68  qlite3_free() wh
77b0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 66  en the vdbe is f
77c0: 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20  inished with.** 
77d0: 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e  it. Otherwise, N
77e0: 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20   bytes of zName 
77f0: 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69  are copied..*/.i
7800: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
7810: 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70  tColName(Vdbe *p
7820: 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 76  , int idx, int v
7830: 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ar, const char *
7840: 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20  zName, int N){. 
7850: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
7860: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
7870: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
7880: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
7890: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
78a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
78b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
78c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
78d0: 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  MEM;.  assert( p
78e0: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
78f0: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
7900: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
7910: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
7920: 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33  n]);.  if( N==P3
7930: 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50  _DYNAMIC || N==P
7940: 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20  3_STATIC ){.    
7950: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
7960: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
7970: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
7980: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
7990: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  TE_STATIC);.  }e
79a0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
79b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
79c0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
79d0: 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54  me, N, SQLITE_UT
79e0: 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  F8,SQLITE_TRANSI
79f0: 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ENT);.  }.  if( 
7a00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7a10: 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29   N==P3_DYNAMIC )
7a20: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
7a30: 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d  flags = (pColNam
7a40: 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53  e->flags&(~MEM_S
7a50: 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b  tatic))|MEM_Dyn;
7a60: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78  .    pColName->x
7a70: 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Del = 0;.  }.  r
7a80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7a90: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
7aa0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
7ab0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
7ac0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
7ad0: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
7ae0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
7af0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
7b00: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
7b10: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
7b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
7b30: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
7b40: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
7b50: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
7b60: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
7b70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7b80: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
7b90: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
7ba0: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
7bb0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
7bc0: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
7bd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
7be0: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
7bf0: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
7c00: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
7c10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7c20: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
7c30: 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65  it = 0;..  /* Be
7c40: 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
7c50: 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
7c60: 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
7c70: 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
7c80: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
7c90: 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
7ca0: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
7cb0: 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
7cc0: 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
7cd0: 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
7ce0: 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
7cf0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
7d00: 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
7d10: 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
7d20: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
7d30: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
7d40: 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
7d50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
7d60: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
7d70: 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 72 63  3VtabSync(db, rc
7d80: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7d90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
7da0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7db0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
7dc0: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
7dd0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
7de0: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
7df0: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
7e00: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
7e10: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
7e20: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
7e30: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
7e40: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
7e50: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
7e60: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
7e70: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
7e80: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
7e90: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
7ea0: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
7eb0: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
7ec0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7ed0: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
7ee0: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
7ef0: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
7f00: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
7f10: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
7f20: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
7f30: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
7f40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
7f50: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
7f60: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
7f70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
7f80: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
7f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7fa0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
7fb0: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
7fc0: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
7fd0: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
7fe0: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
7ff0: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
8000: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
8010: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  ){.    sqlite3Sa
8020: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
8030: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
8040: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
8050: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73  ommitArg);.    s
8060: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
8070: 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  b);.    if( rc )
8080: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8090: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
80a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
80b0: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
80c0: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
80d0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
80e0: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
80f0: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
8100: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
8110: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
8120: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
8130: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
8140: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
8150: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
8160: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
8170: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
8180: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
8190: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
81a0: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
81b0: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
81c0: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
81d0: 79 3a 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  y:.  In that cas
81e0: 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  e we do.  ** not
81f0: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
8200: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
8210: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73  ts, so use the s
8220: 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a  imple case then.
8230: 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20    ** too..  */. 
8240: 20 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73   if( 0==strlen(s
8250: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
8260: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
8270: 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e  ].pBt)) || nTran
8280: 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28  s<=1 ){.    for(
8290: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
82a0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
82b0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
82c0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
82d0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
82e0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
82f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8300: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8310: 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
8320: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8330: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
8340: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
8350: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
8360: 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
8370: 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
8380: 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
8390: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
83a0: 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
83b0: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
83c0: 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
83d0: 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
83e0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
83f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
8400: 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
8410: 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
8420: 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
8430: 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
8440: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
8450: 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
8460: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
8470: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8480: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
8490: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
84a0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
84b0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
84c0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
84d0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
84e0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
84f0: 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
8500: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
8510: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8520: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
8530: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
8540: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
8550: 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
8560: 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
8570: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
8580: 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
8590: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
85a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
85b0: 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
85c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
85d0: 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
85e0: 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a   atomicly..  */.
85f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8600: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
8610: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
8620: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
8630: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
8640: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
8650: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
8660: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
8670: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
8680: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
8690: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
86a0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
86b0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
86c0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
86d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
86e0: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
86f0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
8700: 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  0;..    /* Selec
8710: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
8720: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
8730: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
8740: 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  32 random;.     
8750: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
8760: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
8770: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
8780: 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20  sizeof(random), 
8790: 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  &random);.      
87a0: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
87b0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
87c0: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
87d0: 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66  ile, random&0x7f
87e0: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
87f0: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
8800: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8810: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8820: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
8830: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
8840: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
8850: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
8860: 53 54 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  STS) );..    /* 
8870: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
8880: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
8890: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
88a0: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
88b0: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
88c0: 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  , .        SQLIT
88d0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
88e0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
88f0: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  ATE|.        SQL
8900: 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
8910: 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
8920: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
8930: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
8940: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8960: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8970: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8980: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
8990: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
89a0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
89b0: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
89c0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
89d0: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
89e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
89f0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8a00: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
8a10: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
8a20: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
8a30: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8a40: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
8a50: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
8a60: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
8a70: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
8a80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8a90: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
8aa0: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
8ab0: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
8ac0: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
8ad0: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
8ae0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
8af0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
8b00: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8b10: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8b20: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  t;.      if( i==
8b30: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  1 ) continue;   
8b40: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45  /* Ignore the TE
8b50: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
8b60: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8b70: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
8b80: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
8b90: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
8ba0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
8bb0: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
8bc0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
8bd0: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
8be0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
8bf0: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
8c00: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
8c10: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
8c20: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
8c30: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
8c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
8c50: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
8c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
8c70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8c80: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
8c90: 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  , strlen(zFile)+
8ca0: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
8cb0: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74      offset += st
8cc0: 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  rlen(zFile)+1;. 
8cd0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
8ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
8d00: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
8d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
8d20: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
8d30: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
8d40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8d50: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8d60: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8d70: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
8d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8d90: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
8da0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8db0: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
8dc0: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
8dd0: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
8de0: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
8df0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
8e00: 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65  */.    zMainFile
8e10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
8e20: 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44  etDirname(db->aD
8e30: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[0].pBt);.    i
8e40: 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20  f( (needSync .  
8e50: 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74     && (0==(sqlit
8e60: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
8e70: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
8e80: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
8e90: 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20  SEQUENTIAL)).   
8ea0: 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33    && (rc=sqlite3
8eb0: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
8ec0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
8ed0: 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  AL))!=SQLITE_OK)
8ee0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8ef0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
8f00: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
8f10: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
8f20: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
8f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8f40: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8f50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8f60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
8f70: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
8f80: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
8f90: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
8fa0: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
8fb0: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
8fc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
8fd0: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
8fe0: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
8ff0: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
9000: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
9010: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
9020: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9030: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
9040: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
9050: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
9060: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
9070: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
9080: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9090: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
90a0: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
90b0: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
90c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
90d0: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
90e0: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
90f0: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
9100: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
9110: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9120: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
9130: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
9140: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
9150: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
9160: 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20  lure occured..  
9170: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
9180: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
9190: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
91a0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
91b0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
91c0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
91d0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
91e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
91f0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
9200: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
9210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9220: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
9230: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
9240: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9250: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
9260: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
9270: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
9280: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
9290: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
92a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
92b0: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
92c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
92d0: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
92e0: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
92f0: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
9300: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
9310: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
9320: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
9330: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
9340: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
9350: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
9360: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
9370: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
9380: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
9390: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
93a0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
93b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
93c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
93d0: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
93e0: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
93f0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
9400: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
9410: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
9420: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
9430: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
9440: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
9450: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
9460: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
9470: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
9480: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
9490: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
94a0: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
94b0: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
94c0: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
94d0: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
94e0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
94f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
9500: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
9510: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
9520: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
9530: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
9540: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
9550: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
9560: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
9570: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
9580: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
9590: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
95a0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
95b0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
95c0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
95d0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
95e0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
95f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
9600: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9610: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
9620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9630: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
9640: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
9650: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
9660: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
9670: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
9680: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
9690: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
96a0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
96b0: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
96c0: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
96d0: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
96e0: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
96f0: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
9700: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
9710: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
9720: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
9730: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
9740: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
9750: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
9760: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
9770: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
9780: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
9790: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
97a0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
97b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
97c0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
97d0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
97e0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
97f0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
9800: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
9810: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
9820: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
9830: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
9840: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
9850: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
9860: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
9870: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
9880: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
9890: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
98a0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
98b0: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
98c0: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  tiveVdbeCnt );.}
98d0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
98e0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
98f0: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
9900: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
9910: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
9920: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
9930: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
9940: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
9950: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
9960: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
9970: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
9980: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
9990: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
99a0: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
99b0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
99c0: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
99d0: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
99e0: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
99f0: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
9a00: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
9a10: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
9a20: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
9a30: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
9a40: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
9a50: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
9a60: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
9a70: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
9a80: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
9a90: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
9aa0: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
9ab0: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
9ac0: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
9ad0: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
9ae0: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
9af0: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
9b00: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
9b10: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
9b20: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
9b30: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
9b40: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
9b50: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
9b60: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
9b70: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
9b80: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
9b90: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
9ba0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
9bb0: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
9bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
9bd0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
9be0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
9bf0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
9c00: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
9c10: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9c20: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
9c30: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
9c40: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
9c50: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
9c60: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
9c70: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
9c80: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
9c90: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
9ca0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9cb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9cc0: 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
9cd0: 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
9ce0: 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
9cf0: 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
9d00: 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
9d10: 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
9d20: 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
9d30: 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
9d40: 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
9d50: 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
9d60: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
9d70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9d80: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
9d90: 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
9da0: 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
9db0: 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
9dc0: 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
9dd0: 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
9de0: 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
9df0: 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
9e00: 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
9e10: 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
9e20: 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
9e30: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
9e40: 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
9e50: 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
9e60: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
9e70: 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
9e80: 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
9e90: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
9ea0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
9eb0: 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
9ec0: 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
9ed0: 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
9ee0: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
9ef0: 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
9f00: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
9f10: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
9f20: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
9f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
9f40: 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a  (*xFunc)(Btree *
9f50: 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75  pBt) = 0;  /* Fu
9f60: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f  nction to call o
9f70: 6e 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63  n each btree bac
9f80: 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  kend */.  int is
9f90: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
9fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
9fb0: 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54  to true if SQLIT
9fc0: 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52  E_NOMEM or IOERR
9fd0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
9fe0: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
9ff0: 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
a000: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
a010: 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
a020: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
a030: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
a040: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
a050: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
a060: 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
a070: 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
a080: 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
a090: 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
a0a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
a0b0: 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
a0c0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
a0d0: 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
a0e0: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
a0f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
a100: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
a110: 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
a120: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
a130: 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
a140: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
a150: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
a160: 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
a170: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
a180: 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
a190: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
a1a0: 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
a1b0: 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
a1c0: 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
a1d0: 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
a1e0: 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
a1f0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
a200: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
a210: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a220: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
a230: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  OMEM;.  }.  clos
a240: 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70  eAllCursorsExcep
a250: 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b  tActiveVtabs(p);
a260: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
a270: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
a280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a290: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
a2a0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
a2b0: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
a2c0: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
a2d0: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
a2e0: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
a2f0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
a300: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
a310: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
a320: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
a330: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a   from p->rc */..
a340: 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
a350: 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
a360: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
a370: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a380: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
a390: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20  &p->aMutex);..  
a3a0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
a3b0: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
a3c0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
a3d0: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
a3e0: 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
a3f0: 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
a400: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
a410: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
a440: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
a450: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
a460: 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
a470: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
a480: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
a490: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
a4a0: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
a4b0: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
a4c0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
a4d0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
a4e0: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
a4f0: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
a500: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
a510: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
a520: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
a530: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a540: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  al.      **     
a550: 51 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74  Query without st
a560: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
a570: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
a580: 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f  * We could do so
a590: 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65  mething more ele
a5a0: 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73  gant than this s
a5b0: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28  tatic analysis (
a5c0: 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  i.e..      ** st
a5d0: 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ore the type of 
a5e0: 71 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66  query as part of
a5f0: 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e   the compliation
a600: 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20   phase), but .  
a610: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20      ** handling 
a620: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
a630: 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72  ailure is a fair
a640: 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20  ly obscure edge 
a650: 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a  case so .      *
a660: 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62  * this is probab
a670: 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a  ly easier. Todo:
a680: 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70   Might be an opp
a690: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75  ortunity to redu
a6a0: 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ce .      ** cod
a6b0: 65 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d  e size a very sm
a6c0: 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67  all amount thoug
a6d0: 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  h....      */.  
a6e0: 20 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f      int notReadO
a6f0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  nly = 0;.      i
a700: 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d  nt isStatement =
a710: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
a720: 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f  (p->aOp || p->nO
a730: 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p==0);.      for
a740: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
a750: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73  i++){ .        s
a760: 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d  witch( p->aOp[i]
a770: 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  .opcode ){.     
a780: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
a790: 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20  nsaction:.      
a7a0: 20 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c        notReadOnl
a7b0: 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  y |= p->aOp[i].p
a7c0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  2;.            b
a7d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a7e0: 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e  case OP_Statemen
a7f0: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t:.            i
a800: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a  sStatement = 1;.
a810: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a820: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
a830: 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20     }..   .      
a840: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
a850: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
a860: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
a870: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
a880: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
a890: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
a8a0: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
a8b0: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
a8c0: 20 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f      if( notReadO
a8d0: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
a8e0: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
a8f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
a900: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
a910: 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61  BLOCKED && isSta
a920: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
a930: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
a940: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a950: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
a960: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
a970: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
a980: 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51  lse if( (mrc==SQ
a990: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
a9a0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
a9b0: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
a9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
a9d0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a9e0: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
a9f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aa00: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
aa10: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
aa20: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
aa30: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
aa40: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
aa50: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
aa60: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
aa70: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
aa80: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
aa90: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
aaa0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
aab0: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
aac0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
aad0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
aae0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
aaf0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
ab00: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
ab10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
ab20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ab30: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
ab40: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
ab50: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
ab60: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
ab70: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
ab80: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
ab90: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
aba0: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
abb0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
abc0: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
abd0: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
abe0: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
abf0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
ac00: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
ac10: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
ac20: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
ac30: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
ac40: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
ac50: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
ac60: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
ac70: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
ac80: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
ac90: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
aca0: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
acb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
acc0: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
acd0: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
ace0: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
acf0: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
ad00: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
ad10: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
ad20: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
ad30: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
ad40: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
ad50: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
ad60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
ad70: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
ad80: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  t(db);.        i
ad90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
ada0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
adb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
adc0: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
add0: 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
ade0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
adf0: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
ae00: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
ae10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ae20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
ae30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ae40: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
ae50: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ae60: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ae70: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
ae80: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
ae90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
aea0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
aeb0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
aec0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
aed0: 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63  }else if( !xFunc
aee0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
aef0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
af00: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
af10: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
af20: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
af30: 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  edStatement ){. 
af40: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
af50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
af60: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  mitStmt;.       
af70: 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   } .      }else 
af80: 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
af90: 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
afa0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
afb0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
afc0: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
afd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
afe0: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
aff0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b000: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
b010: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
b020: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
b030: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
b040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b050: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
b060: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
b070: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
b080: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
b090: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
b0a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
b0b0: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
b0c0: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
b0d0: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
b0e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
b0f0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
b100: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
b110: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
b120: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
b130: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
b140: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
b150: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b160: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
b170: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
b180: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
b190: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
b1a0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b1b0: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
b1c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
b1d0: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
b1e0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
b1f0: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
b200: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
b210: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
b220: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
b230: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
b240: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b250: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
b260: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
b270: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
b280: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
b290: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
b2a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
b2b0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
b2c0: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
b2d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b2e0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b2f0: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
b300: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
b310: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
b320: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
b330: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
b340: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
b350: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
b360: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
b370: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
b380: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
b390: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
b3a0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
b3b0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
b3c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
b3d0: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
b3e0: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
b3f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b400: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
b410: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
b420: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
b430: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
b440: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
b450: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
b460: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
b470: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
b480: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
b490: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
b4a0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
b4b0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
b4c0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
b4d0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
b4e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
b4f0: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
b500: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
b510: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
b520: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
b530: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
b540: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
b550: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
b560: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
b570: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
b580: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
b590: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
b5a0: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
b5b0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
b5c0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
b5d0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
b5e0: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
b5f0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
b600: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
b610: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
b620: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
b630: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b640: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
b650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
b660: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b670: 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e  t(db);..  return
b680: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
b690: 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
b6a0: 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
b6b0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b6c0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
b6d0: 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
b6e0: 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
b6f0: 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
b700: 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
b710: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
b720: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
b730: 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
b740: 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
b750: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b760: 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
b770: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
b780: 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
b790: 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
b7a0: 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
b7b0: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
b7c0: 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
b7d0: 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
b7e0: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
b7f0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
b800: 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
b810: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
b820: 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
b830: 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
b840: 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
b850: 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
b860: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
b870: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
b880: 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
b890: 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
b8a0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
b8b0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
b8c0: 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
b8d0: 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
b8e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
b8f0: 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
b900: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
b910: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
b920: 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
b930: 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
b940: 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
b950: 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
b960: 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
b970: 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
b980: 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
b990: 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
b9a0: 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
b9b0: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
b9c0: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
b9d0: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73  VdbeHalt(p);.  s
b9e0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
b9f0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
ba00: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
ba10: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
ba20: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
ba30: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
ba40: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
ba50: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
ba60: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
ba70: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
ba80: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
ba90: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
baa0: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
bab0: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
bac0: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
bad0: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
bae0: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
baf0: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
bb00: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
bb10: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
bb20: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
bb30: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
bb40: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
bb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
bb60: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
bb70: 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
bb80: 53 51 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69  SQLITE_UTF8,sqli
bb90: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20  te3_free);.     
bba0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
bbb0: 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ->rc;.      p->z
bbc0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
bbd0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
bbe0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bbf0: 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
bc00: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
bc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bc20: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
bc30: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
bc40: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
bc50: 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
bc60: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
bc70: 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
bc80: 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
bc90: 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
bca0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
bcb0: 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
bcc0: 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
bcd0: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
bce0: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
bcf0: 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
bd00: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
bd10: 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
bd20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
bd30: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
bd40: 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >rc, 0);.    sql
bd50: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
bd60: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
bd70: 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
bd80: 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
bd90: 72 65 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  ree);.    p->zEr
bda0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
bdb0: 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
bdc0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
bdd0: 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
bde0: 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
bdf0: 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
be00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
be10: 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
be20: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
be30: 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63  ->pTos<&p->aStac
be40: 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70  k[p->pc<0?0:p->p
be50: 63 5d 20 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b  c] || !p->aStack
be60: 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   );.#ifdef VDBE_
be70: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
be80: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
be90: 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
bea0: 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
beb0: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
bec0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
bed0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
bee0: 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
bef0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
bf00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
bf10: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
bf20: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
bf30: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
bf40: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
bf50: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
bf60: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
bf70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
bf80: 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
bf90: 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
bfa0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
bfb0: 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
bfc0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
bfd0: 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
bfe0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
bff0: 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
c000: 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
c010: 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
c020: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c030: 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
c040: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
c050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
c060: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
c070: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
c080: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
c090: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
c0a0: 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72  aborted = 0;.  r
c0b0: 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
c0c0: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
c0d0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
c0e0: 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
c0f0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
c100: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
c110: 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
c120: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
c130: 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
c140: 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
c150: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
c160: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c170: 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
c180: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
c190: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
c1a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
c1b0: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
c1c0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
c1d0: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
c1e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
c1f0: 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
c200: 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
c210: 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
c220: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d    }else if( p->m
c230: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
c240: 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74  _INIT ){.    ret
c250: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
c260: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
c270: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
c280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c290: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
c2a0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
c2b0: 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
c2c0: 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
c2d0: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
c2e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
c2f0: 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
c300: 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
c310: 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
c320: 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
c330: 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
c340: 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
c350: 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
c360: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
c370: 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
c380: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
c390: 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
c3a0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
c3b0: 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
c3c0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
c3d0: 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
c3e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
c3f0: 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
c400: 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
c410: 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
c420: 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
c430: 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75  &(1<<i))) && pAu
c440: 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
c450: 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
c460: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
c470: 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
c480: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
c490: 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
c4a0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
c4b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
c4c0: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
c4d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c4e0: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
c4f0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
c500: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c510: 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  n;.  Cleanup(p);
c520: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
c530: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
c540: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
c550: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
c560: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70  assert( p->db->p
c570: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Vdbe==p );.    p
c580: 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d  ->db->pVdbe = p-
c590: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
c5a0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
c5b0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
c5c0: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
c5d0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29  }.  if( p->aOp )
c5e0: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
c5f0: 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p->aOp;.    for(
c600: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
c610: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
c620: 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33    freeP3(pOp->p3
c630: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 2e 70 29  type, pOp->p3.p)
c640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c650: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
c660: 74 65 33 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43  te3_free(pOp->zC
c670: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
c680: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73      .    }.    s
c690: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c6a0: 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  Op);.  }.  relea
c6b0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
c6c0: 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
c6d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c6e0: 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
c6f0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63  e3_free(p->aStac
c700: 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  k);.  releaseMem
c710: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
c720: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
c730: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
c740: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c750: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
c760: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c  te3_free(p->zSql
c770: 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  );.  p->magic = 
c780: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
c790: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c7a0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  p);.}../*.** If 
c7b0: 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
c7c0: 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
c7d0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
c7e0: 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
c7f0: 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
c800: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
c810: 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76  code.  If no Mov
c820: 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  eTo is pending, 
c830: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
c840: 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64  does nothing and
c850: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
c860: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
c870: 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
c880: 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  to(Cursor *p){. 
c890: 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
c8a0: 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
c8b0: 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
c8c0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
c8d0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
c8e0: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
c8f0: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  t;.#endif.    as
c900: 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
c910: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
c920: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
c930: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
c940: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
c950: 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
c960: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c970: 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b  ;.    *p->pIncrK
c980: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c  ey = 0;.    p->l
c990: 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f  astRowid = keyTo
c9a0: 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  Int(p->movetoTar
c9b0: 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  get);.    p->row
c9c0: 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
c9d0: 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  =0;.    if( res<
c9e0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c9f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
ca00: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  (p->pCursor, &re
ca10: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
ca20: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ca30: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
ca40: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
ca50: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
ca60: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  +;.#endif.    p-
ca70: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
ca80: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
ca90: 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
caa0: 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74  STALE;.  }.  ret
cab0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
cad0: 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
cae0: 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
caf0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
cb00: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
cb10: 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
cb20: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
cb30: 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74  lRead().** sqlit
cb40: 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
cb50: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
cb60: 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a  SerialWrite().**
cb70: 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
cb80: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
cb90: 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
cba0: 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
cbb0: 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
cbc0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
cbd0: 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
cbe0: 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
cbf0: 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
cc00: 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
cc10: 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
cc20: 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
cc30: 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
cc40: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
cc50: 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
cc60: 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
cc70: 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
cc80: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
cc90: 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
cca0: 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
ccb0: 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
ccc0: 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
ccd0: 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
cce0: 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
ccf0: 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
cd00: 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
cd10: 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
cd20: 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
cd30: 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
cd40: 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
cd50: 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
cd60: 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
cd70: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
cd80: 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
cd90: 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
cda0: 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
cdb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
cdc0: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
cdd0: 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
cde0: 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
cdf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
ce00: 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
ce10: 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
ce20: 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ce60: 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
ce80: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
ce90: 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
ceb0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
cec0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
ced0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
cee0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
cef0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
cf00: 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
cf30: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
cf40: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
cf60: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
cf70: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
cf80: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
cf90: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
cfa0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
cfb0: 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
cfe0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
cff0: 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
d000: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
d010: 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
d020: 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
d050: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
d060: 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
d080: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
d090: 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
d0a0: 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
d0d0: 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
d0e0: 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
d0f0: 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
d100: 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
d110: 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
d120: 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
d130: 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
d140: 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
d150: 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
d160: 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
d170: 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
d180: 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
d190: 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
d1a0: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
d1b0: 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
d1c0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
d1d0: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
d1e0: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
d1f0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
d200: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
d210: 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
d220: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
d230: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
d240: 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
d250: 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
d260: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
d270: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
d280: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
d290: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
d2a0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
d2b0: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
d2c0: 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
d2d0: 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
d2e0: 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
d2f0: 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30  ((((i64)0x000010
d300: 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
d310: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
d320: 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
d330: 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
d340: 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
d350: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d360: 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   8+i;.    }.    
d370: 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69  u = i<0 ? -i : i
d380: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  ;.    if( u<=127
d390: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
d3a0: 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
d3b0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
d3c0: 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
d3d0: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
d3e0: 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
d3f0: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
d400: 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
d410: 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
d420: 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
d430: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
d440: 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
d450: 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
d460: 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  ( flags&(MEM_Str
d470: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
d480: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
d490: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
d4a0: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
d4b0: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20  pMem->u.i;.  }. 
d4c0: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
d4d0: 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
d4e0: 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
d4f0: 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
d500: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d510: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
d520: 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
d530: 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
d540: 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
d550: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d560: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
d570: 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
d580: 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
d590: 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
d5a0: 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
d5b0: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
d5c0: 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
d5d0: 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
d5e0: 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
d5f0: 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
d600: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
d610: 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
d620: 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
d630: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
d640: 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
d650: 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
d660: 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
d670: 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
d680: 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
d690: 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
d6a0: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
d6b0: 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
d6c0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
d6d0: 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
d6e0: 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
d6f0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
d700: 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
d710: 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
d720: 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
d730: 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
d740: 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
d750: 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
d760: 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
d770: 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
d780: 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
d790: 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
d7a0: 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
d7b0: 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
d7c0: 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
d7d0: 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
d7e0: 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
d7f0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
d800: 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
d810: 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
d820: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
d830: 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
d840: 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
d850: 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
d860: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
d870: 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
d880: 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
d890: 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
d8a0: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
d8b0: 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
d8c0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
d8d0: 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
d8e0: 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
d8f0: 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
d900: 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
d910: 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
d920: 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
d930: 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
d940: 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
d950: 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
d960: 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
d970: 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
d980: 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
d990: 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
d9a0: 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
d9b0: 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
d9c0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
d9d0: 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
d9e0: 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
d9f0: 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
da00: 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
da10: 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
da20: 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
da30: 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
da40: 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
da50: 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
da60: 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
da70: 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
da80: 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
da90: 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
daa0: 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
dab0: 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
dac0: 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
dad0: 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
dae0: 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
daf0: 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
db00: 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
db10: 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
db20: 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
db30: 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
db40: 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
db50: 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
db60: 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
db70: 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
db80: 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
db90: 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
dba0: 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
dbb0: 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
dbc0: 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
dbd0: 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
dbe0: 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
dbf0: 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
dc00: 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
dc10: 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
dc20: 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
dc30: 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
dc40: 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
dc50: 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
dc60: 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
dc70: 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
dc80: 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
dc90: 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
dca0: 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
dcb0: 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
dcc0: 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
dcd0: 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
dce0: 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
dcf0: 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
dd00: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
dd10: 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
dd20: 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
dd30: 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
dd40: 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
dd50: 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
dd60: 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
dd70: 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
dd80: 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
dd90: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
dda0: 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
ddb0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
ddc0: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
ddd0: 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
dde0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
ddf0: 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
de00: 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
de10: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
de20: 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
de30: 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
de40: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
de50: 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
de60: 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
de70: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
de80: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
de90: 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
dea0: 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
deb0: 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
dec0: 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73  buf[].  nBuf mus
ded0: 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c  t always be.** l
dee0: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
def0: 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
df00: 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ield.  Except, i
df10: 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a  f the field is.*
df20: 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20  * a blob with a 
df30: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
df40: 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67  , then buf[] mig
df50: 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72  ht be just the r
df60: 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20  ight.** size to 
df70: 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20  hold everything 
df80: 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a  except for the z
df90: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e  ero-filled tail.
dfa0: 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73    If buf[].** is
dfb0: 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68   only big enough
dfc0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e   to hold the non
dfd0: 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68  -zero prefix, th
dfe0: 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  en only write th
dff0: 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74  at.** prefix int
e000: 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66  o buf[].  But if
e010: 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20   buf[] is large 
e020: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62  enough to hold b
e030: 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69  oth the.** prefi
e040: 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74  x and the tail t
e050: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72  hen write the pr
e060: 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65  efix and set the
e070: 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20   tail to all.** 
e080: 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  zeros..**.** Ret
e090: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
e0a0: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
e0b0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
e0c0: 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
e0d0: 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
e0e0: 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
e0f0: 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
e100: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
e110: 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
e120: 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
e130: 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
e140: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
e150: 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
e160: 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66  8 *buf, int nBuf
e170: 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  , Mem *pMem, int
e180: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
e190: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
e1a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
e1b0: 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66  rialType(pMem, f
e1c0: 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69  ile_format);.  i
e1d0: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  nt len;..  /* In
e1e0: 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
e1f0: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
e200: 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
e210: 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
e220: 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b  64 v;.    int i;
e230: 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
e240: 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
e250: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e260: 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
e270: 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  >r) );.      mem
e280: 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72  cpy(&v, &pMem->r
e290: 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
e2a0: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
e2b0: 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
e2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
e2d0: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
e2e0: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
e2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e300: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
e310: 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  _type);.    asse
e320: 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b  rt( len<=nBuf );
e330: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20  .    while( i-- 
e340: 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20  ){.      buf[i] 
e350: 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  = (v&0xFF);.    
e360: 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
e370: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
e380: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
e390: 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
e3a0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
e3b0: 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
e3c0: 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
e3d0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
e3e0: 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a  Zero)?pMem->u.i:
e3f0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
e400: 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  == sqlite3VdbeSe
e410: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
e420: 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
e430: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c  assert( pMem->n<
e440: 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e  =nBuf );.    len
e450: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
e460: 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
e470: 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ->z, len);.    i
e480: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
e490: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
e4a0: 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e     len += pMem->
e4b0: 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  u.i;.      if( l
e4c0: 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  en>nBuf ){.     
e4d0: 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20     len = nBuf;. 
e4e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
e4f0: 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e  set(&buf[pMem->n
e500: 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e  ], 0, len-pMem->
e510: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  n);.    }.    re
e520: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
e530: 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
e540: 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
e550: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
e560: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
e570: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
e580: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
e590: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
e5a0: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
e5b0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
e5c0: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
e5d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e5e0: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
e5f0: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
e600: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
e610: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
e620: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
e630: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
e640: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
e650: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e670: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
e680: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
e690: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6b0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
e6c0: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
e6d0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
e6e0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
e6f0: 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
e700: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
e710: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
e720: 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
e730: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
e740: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
e750: 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
e760: 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
e770: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
e780: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
e790: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
e7a0: 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
e7b0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
e7c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e7d0: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
e7e0: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
e7f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e800: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
e810: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
e820: 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
e830: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
e840: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
e850: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
e860: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
e870: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
e880: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e890: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
e8a0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
e8b0: 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
e8c0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
e8d0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
e8e0: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
e8f0: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
e900: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<16) | (buf[1]<
e910: 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20  <8) | buf[2];.  
e920: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e930: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e940: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
e950: 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
e960: 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
e970: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
e980: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75   pMem->u.i = (bu
e990: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
e9a0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
e9b0: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
e9c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
e9d0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e9e0: 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
e9f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
ea00: 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
ea10: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
ea20: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73      u64 x = (((s
ea30: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
ea40: 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
ea50: 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28  .      u32 y = (
ea60: 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[2]<<24) | (b
ea70: 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[3]<<16) | (bu
ea80: 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35  f[4]<<8) | buf[5
ea90: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
eaa0: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
eab0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
eac0: 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65  4*)&x;.      pMe
ead0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
eae0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
eaf0: 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
eb00: 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
eb10: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
eb20: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
eb30: 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
eb40: 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
eb50: 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75    u64 x;.      u
eb60: 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e  32 y;.#if !defin
eb70: 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
eb80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
eb90: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
eba0: 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69  T).      /* Veri
ebb0: 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
ebc0: 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
ebd0: 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
ebe0: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
ebf0: 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
ec00: 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
ec10: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
ec20: 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
ec30: 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
ec40: 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
ec50: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
ec60: 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
ec70: 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  .      ** endian
ec80: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ec90: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
eca0: 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
ecb0: 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
ecc0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
ecd0: 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
ece0: 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d  ;.      u64 t2 =
ecf0: 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d   t1;.      swapM
ed00: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
ed10: 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t2);.      asser
ed20: 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
ed30: 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
ed40: 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
ed50: 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
ed60: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20  #endif..      x 
ed70: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
ed80: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
ed90: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
eda0: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20  f[3];.      y = 
edb0: 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28  (buf[4]<<24) | (
edc0: 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[5]<<16) | (b
edd0: 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[6]<<8) | buf[
ede0: 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  7];.      x = (x
edf0: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
ee00: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
ee10: 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
ee20: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
ee30: 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
ee40: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ee50: 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Int;.      }else
ee60: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
ee70: 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
ee80: 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  & sizeof(pMem->r
ee90: 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
eea0: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
eeb0: 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20  loat(x);.       
eec0: 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
eed0: 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
eee0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
eef0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c  flags = MEM_Real
ef00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ef10: 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
ef20: 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
ef30: 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
ef40: 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
ef50: 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
ef60: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
ef70: 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
ef80: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
ef90: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
efa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
efb0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
efc0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  .      int len =
efd0: 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
efe0: 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
eff0: 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
f000: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
f010: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
f020: 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
f030: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
f040: 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
f050: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f060: 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
f070: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
f080: 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
f090: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
f0a0: 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
f0b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
f0c0: 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
f0d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
f0f0: 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63  er of a record c
f100: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 71  onsists of a seq
f110: 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c  uence variable-l
f120: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a  ength integers..
f130: 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72  ** These integer
f140: 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77  s are almost alw
f150: 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72  ays small and ar
f160: 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73  e encoded as a s
f170: 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54  ingle byte..** T
f180: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
f190: 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  ro takes advanta
f1a0: 67 65 20 74 68 69 73 20 66 61 63 74 20 74 6f 20  ge this fact to 
f1b0: 70 72 6f 76 69 64 65 20 61 20 66 61 73 74 20 64  provide a fast d
f1c0: 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20  ecode.** of the 
f1d0: 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72 65  integers in a re
f1e0: 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49 74  cord header.  It
f1f0: 20 69 73 20 66 61 73 74 65 72 20 66 6f 72 20 74   is faster for t
f200: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a  he common case.*
f210: 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65  * where the inte
f220: 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ger is a single 
f230: 62 79 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c  byte.  It is a l
f240: 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65  ittle slower whe
f250: 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  n the.** integer
f260: 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   is two or more 
f270: 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72  bytes.  But over
f280: 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65 72  all it is faster
f290: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
f2a0: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
f2b0: 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
f2c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20  :.**.**     x = 
f2d0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
f2e0: 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a  32( A, &B );.**.
f2f0: 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56 61  **     x = GetVa
f300: 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a  rint( A, B );.**
f310: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56  .*/.#define GetV
f320: 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20  arint(A,B)  ((B 
f330: 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20  = *(A))<=0x7f ? 
f340: 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61  1 : sqlite3GetVa
f350: 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a  rint32(A, &B))..
f360: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f370: 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
f380: 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
f390: 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
f3a0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a   specified by .*
f3b0: 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  * {nKey1, pKey1}
f3c0: 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65   and {nKey2, pKe
f3d0: 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61  y2}, returning a
f3e0: 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
f3f0: 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
f400: 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31  nteger if {nKey1
f410: 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73  , pKey1} is less
f420: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
f430: 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
f440: 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79  han {nKey2, pKey
f450: 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61  2}.  Both Key1 a
f460: 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20  nd Key2 must be 
f470: 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20  byte strings.** 
f480: 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20  composed by the 
f490: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
f4a0: 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
f4b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f4c0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
f4d0: 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44  e(.  void *userD
f4e0: 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ata,.  int nKey1
f4f0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
f500: 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79  ey1, .  int nKey
f510: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
f520: 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66  Key2.){.  KeyInf
f530: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b  o *pKeyInfo = (K
f540: 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61  eyInfo*)userData
f550: 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20  ;.  u32 d1, d2; 
f560: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f570: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
f580: 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
f590: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
f5a0: 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a  1, idx2;      /*
f5b0: 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
f5c0: 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
f5d0: 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
f5e0: 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64  u32 szHdr1, szHd
f5f0: 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  r2;  /* Number o
f600: 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
f610: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
f620: 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
f630: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
f640: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f650: 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
f660: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f670: 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e  r *)pKey1;.  con
f680: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f690: 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74   *aKey2 = (const
f6a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f6b0: 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d  )pKey2;..  Mem m
f6c0: 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b  em1;.  Mem mem2;
f6d0: 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
f6e0: 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
f6f0: 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
f700: 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e  o->db;.  mem2.en
f710: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
f720: 63 3b 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70  c;.  mem2.db = p
f730: 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a  KeyInfo->db;.  .
f740: 20 20 69 64 78 31 20 3d 20 47 65 74 56 61 72 69    idx1 = GetVari
f750: 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  nt(aKey1, szHdr1
f760: 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
f770: 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74 56 61  ;.  idx2 = GetVa
f780: 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64  rint(aKey2, szHd
f790: 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64  r2);.  d2 = szHd
f7a0: 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70  r2;.  nField = p
f7b0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
f7c0: 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
f7d0: 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a  zHdr1 && idx2<sz
f7e0: 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20  Hdr2 ){.    u32 
f7f0: 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20  serial_type1;.  
f800: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
f810: 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e2;..    /* Read
f820: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
f830: 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
f840: 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
f850: 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
f860: 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b  += GetVarint( aK
f870: 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
f880: 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66  _type1 );.    if
f890: 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
f8a0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f8b0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
f8c0: 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
f8d0: 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74  .    idx2 += Get
f8e0: 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64  Varint( aKey2+id
f8f0: 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32  x2, serial_type2
f900: 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d   );.    if( d2>=
f910: 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65 33  nKey2 && sqlite3
f920: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
f930: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e  n(serial_type2)>
f940: 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
f950: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
f960: 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
f970: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
f980: 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
f990: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
f9a0: 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
f9b0: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
f9c0: 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56    d2 += sqlite3V
f9d0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
f9e0: 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f  ey2[d2], serial_
f9f0: 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a  type2, &mem2);..
fa00: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
fa10: 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
fa20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fa30: 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
fa40: 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c  , &mem2, i<nFiel
fa50: 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
fa60: 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
fa70: 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20   if( mem1.flags 
fa80: 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  & MEM_Dyn ) sqli
fa90: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
faa0: 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66  e(&mem1);.    if
fab0: 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d  ( mem2.flags & M
fac0: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
fad0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
fae0: 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72  mem2);.    if( r
faf0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
fb00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
fb10: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  ++;.  }..  /* On
fb20: 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
fb30: 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
fb40: 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
fb50: 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
fb60: 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
fb70: 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
fb80: 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
fb90: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
fba0: 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
fbb0: 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
fbc0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
fbd0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
fbe0: 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
fbf0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
fc00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fc10: 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69  !pKeyInfo->prefi
fc20: 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20  xIsEqual ){.    
fc30: 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29    if( d1<nKey1 )
fc40: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
fc50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
fc60: 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20  ( d2<nKey2 ){.  
fc70: 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
fc80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fc90: 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
fca0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
fcb0: 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
fcc0: 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
fcd0: 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
fce0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
fcf0: 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
fd00: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
fd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
fd20: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64  gument is an ind
fd30: 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65  ex entry compose
fd40: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
fd50: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
fd60: 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e  ..** The last en
fd70: 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f  try in this reco
fd80: 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  rd should be an 
fd90: 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69  integer (specifi
fda0: 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  cally.** an inte
fdb0: 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69  ger rowid).  Thi
fdc0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
fdd0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
fde0: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74  bytes in.** that
fdf0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74   integer..*/.int
fe00: 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
fe10: 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38  owidLen(const u8
fe20: 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73   *aKey){.  u32 s
fe30: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
fe40: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
fe50: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
fe60: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
fe70: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
fe80: 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69  rowid */..  sqli
fe90: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61  te3GetVarint32(a
fea0: 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  Key, &szHdr);.  
feb0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
fec0: 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31  32(&aKey[szHdr-1
fed0: 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
fee0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
fef0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
ff00: 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a  n(typeRowid);.}.
ff10: 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70    ../*.** pCur p
ff20: 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
ff30: 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
ff40: 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
ff50: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
ff60: 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
ff70: 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
ff80: 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
ff90: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
ffa0: 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
ffb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
ffc0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
ffd0: 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
ffe0: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
fff0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10000 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f  IdxRowid(BtCurso
10010 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
10020 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
10030 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
10040 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
10050 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10060 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
10070 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
10080 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
10090 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
100a0 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
100b0 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
100c0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
100d0 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73    Mem m, v;..  s
100e0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
100f0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
10100 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
10110 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  Key<=0 ){.    re
10120 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10130 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
10140 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10150 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
10160 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
10170 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
10180 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10190 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  c;.  }.  sqlite3
101a0 47 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  GetVarint32((u8*
101b0 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20  )m.z, &szHdr);. 
101c0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
101d0 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
101e0 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77  Hdr-1], &typeRow
101f0 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20  id);.  lenRowid 
10200 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
10210 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
10220 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
10230 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
10240 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
10250 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
10260 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
10270 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
10280 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
10290 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
102a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
102b0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
102c0 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
102d0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
102e0 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f  r pC is point to
102f0 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
10300 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b  key string in pK
10310 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b  ey (of length nK
10320 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ey).  Write into
10330 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
10340 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
10350 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
10360 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
10370 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
10380 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
10390 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52  er than pKey.  R
103a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
103b0 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
103c0 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72  * pKey is either
103d0 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
103e0 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
103f0 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
10400 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
10410 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
10420 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
10430 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10440 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
10450 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
10460 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
10470 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
10480 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43  re(.  Cursor *pC
10490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
104a0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
104b0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
104c0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  st */.  int nKey
104d0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79  , const u8 *pKey
104e0 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74  ,   /* The key t
104f0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
10500 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
10510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
10520 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
10530 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
10540 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
10550 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
10560 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
10570 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
10580 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69  r;.  int lenRowi
10590 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73  d;.  Mem m;..  s
105a0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
105b0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
105c0 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
105d0 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72  Key<=0 ){.    *r
105e0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
105f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10600 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10610 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
10620 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
10630 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d   nCellKey, 1, &m
10640 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
10650 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10660 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
10670 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
10680 69 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b  idLen((u8*)m.z);
10690 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
106a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
106b0 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  re(pC->pKeyInfo,
106c0 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d   m.n-lenRowid, m
106d0 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  .z, nKey, pKey);
106e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
106f0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
10700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
10720 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
10730 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
10740 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
10750 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
10760 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
10770 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
10780 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
10790 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
107a0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
107b0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
107c0 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
107d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107e0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
107f0 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
10800 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
10810 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
10820 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
10830 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
10840 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
10850 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
10860 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
10870 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
10880 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
10890 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
108a0 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
108b0 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
108c0 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
108d0 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
108e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
108f0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
10900 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
10910 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
10920 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
10930 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
10940 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
10950 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
10960 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
10970 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
10980 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
10990 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
109a0 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
109b0 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
109c0 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
109d0 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
109e0 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
109f0 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
10a00 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
10a10 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
10a20 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
10a30 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
10a40 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
10a50 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10a60 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
10a70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
10a80 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
10a90 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
10aa0 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
10ab0 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
10ac0 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
10ad0 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
10ae0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
10af0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10b00 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
10b10 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
10b20 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
10b30 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
10b40 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
10b50 76 2d 3e 64 62 3b 0a 7d 0a                       v->db;.}.