/ Hex Artifact Content
Login

Artifact 758e5f4e31d322c155c5db506dfbf93ae1df54a0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0660: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65  mt *pStmt){.  re
0670: 74 75 72 6e 20 28 28 56 64 62 65 20 2a 29 70 53  turn ((Vdbe *)pS
0680: 74 6d 74 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f  tmt)->zSql;.}../
0690: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06a0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06b0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06d0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06e0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06f0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0710: 0a 20 20 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74  .  int nTmp;.  t
0720: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0730: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0740: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0750: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0760: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0770: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0780: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0790: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07a0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07b0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07c0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07d0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07e0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07f0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0800: 70 3b 0a 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e  p;.  nTmp = pA->
0810: 6e 53 71 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c  nSql;.  pA->nSql
0820: 20 3d 20 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pB->nSql;.  p
0830: 42 2d 3e 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a  B->nSql = nTmp;.
0840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0850: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0860: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0870: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0880: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0890: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
08a0: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
08b0: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
08c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
08d0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
08e0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  y so that it con
08f0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 4e  tains at least N
0900: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  .** elements..**
0910: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0920: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0930: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0940: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a  ing the array,.*
0950: 2a 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  * Vdbe.aOp and V
0960: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0970: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74  ain unchanged (t
0980: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a  his is so that.*
0990: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  * any opcodes al
09a0: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
09b0: 63 61 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79  can be correctly
09c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20   deallocated.** 
09d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
09e0: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
09f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a00: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56   resizeOpArray(V
0a10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
0a20: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0a30: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0a40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70  p->nOpAlloc;.  p
0a50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a60: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a70: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0a80: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0a90: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0aa0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ab0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  Op = pNew;.    i
0ac0: 66 28 20 4e 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a  f( N>oldSize ){.
0ad0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
0ae0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
0af0: 2c 20 28 4e 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  , (N-oldSize)*si
0b00: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 7d  zeof(Op));.    }
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0b20: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b30: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b40: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b50: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b60: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0b80: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0b90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0ba0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bd0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0bf0: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c10: 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20  *    p1, p2, p3 
0c20: 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a       Operands.**
0c30: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
0c40: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
0c50: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0c60: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0c70: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0c80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0c90: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0ca0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0cb0: 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72  f the P4.** oper
0cc0: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64  te3VdbeAddOp3(Vd
0ce0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0cf0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
0d00: 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p3){.  int i;
0d10: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
0d20: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  .  i = p->nOp;. 
0d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0d40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0d50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
0d60: 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20  OpAlloc<=i ){.  
0d70: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
0d80: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32  p, p->nOpAlloc*2
0d90: 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28   + 100);.    if(
0da0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
0db0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  iled ){.      re
0dc0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
0dd0: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
0de0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
0df0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
0e00: 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20  = op;.  pOp->p1 
0e10: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0e20: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0e30: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0e40: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0e50: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0e60: 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  D;.  p->expired 
0e70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
0e80: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 73  TE_DEBUG.  if( s
0e90: 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f  qlite3_vdbe_addo
0ea0: 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69 74 65  p_trace ) sqlite
0eb0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
0ec0: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
0ed0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
0ee0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
0ef0: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
0f00: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
0f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
0f20: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
0f30: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
0f40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
0f50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0f60: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
0f70: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
0f80: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
0f90: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
0fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
0fb0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0fc0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
0fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
0fe0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
0ff0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1000: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  }.../*.** Add an
1010: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1020: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1030: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
1040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1050: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1060: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1070: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1080: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1090: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
10b0: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
10c0: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
10d0: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
10e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1100: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1110: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1120: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1130: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
1150: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1160: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1170: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
1180: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
1190: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
11a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11b0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
11c0: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
11d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
11e0: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
11f0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1200: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1210: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1220: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1230: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1240: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1250: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1260: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1270: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1280: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1290: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
12a0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
12b0: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
12c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
12d0: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
12e0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
12f0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
1300: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
1310: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
1320: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
1330: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1340: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1350: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1360: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1370: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1380: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1390: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
13a0: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
13b0: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
13c0: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
13d0: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
13e0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
13f0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
1400: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
1410: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
1420: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
1430: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1440: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1460: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1470: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1490: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
14a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
14b0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
14c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
14d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
14e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
14f0: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
1500: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
1510: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
1520: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
1530: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1540: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1550: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1560: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1590: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
15a0: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
15b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
15c0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
15d0: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
15e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
15f0: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1600: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1610: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
1620: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
1630: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
1640: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
1650: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1660: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1670: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1680: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1690: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16a0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
16d0: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
16e0: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
16f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1700: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1710: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
1720: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
1730: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1740: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1750: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20  }.}../*.** Loop 
1770: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
1780: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
1790: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
17a0: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
17b0: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
17c0: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
17d0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
17e0: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
17f0: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
1800: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
1810: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
1820: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
1830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1840: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
1850: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
1860: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
1870: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
1880: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
1890: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
18a0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
18b0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
18c0: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
18d0: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
18e0: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
18f0: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
1900: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
1910: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1920: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
1930: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
1940: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rray..**.** This
1950: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
1960: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
1970: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20   optimization:  
1980: 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20  It scans for.** 
1990: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
19a0: 74 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  t might cause a 
19b0: 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
19c0: 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74 72 75  ck.  Such instru
19d0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a  ctions.** are:.*
19e0: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  *.**   *  OP_Hal
19f0: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  t with P1=SQLITE
1a00: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
1a10: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
1a20: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
1a30: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
1a40: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
1a50: 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ename.**.** If n
1a60: 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74 69  o such instructi
1a70: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  on is found, the
1a80: 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e  n every Statemen
1a90: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a  t instruction .*
1aa0: 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  * is changed to 
1ab0: 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68 69 73  a Noop.  In this
1ac0: 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63   way, we avoid c
1ad0: 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61 74  reating the stat
1ae0: 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61  ement .** journa
1af0: 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61  l file unnecessa
1b00: 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rily..*/.static 
1b10: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
1b20: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
1b30: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
1b40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1b50: 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20   nMaxArgs = 0;. 
1b60: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20   Op *pOp;.  int 
1b70: 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61  *aLabel = p->aLa
1b80: 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53  bel;.  int doesS
1b90: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1ba0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53   = 0;.  int hasS
1bb0: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20  tatementBegin = 
1bc0: 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  0;.  for(pOp=p->
1bd0: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
1be0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
1bf0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64  +){.    u8 opcod
1c00: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
1c10: 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ..    if( opcode
1c20: 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b  ==OP_Function ){
1c30: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1c40: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
1c50: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
1c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
1c80: 65 70 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ep .#ifndef SQLI
1c90: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ca0: 41 42 4c 45 0a 20 20 20 20 20 20 20 20 7c 7c 20  ABLE.        || 
1cb0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
1cc0: 74 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b  te.#endif.    ){
1cd0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1ce0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
1cf0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
1d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
1d20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
1d30: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->p1==SQLITE_CON
1d40: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
1d50: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  p2==OE_Abort ){.
1d60: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1d70: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1d80: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1d90: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1da0: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
1db0: 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d  .      hasStatem
1dc0: 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20  entBegin = 1;.  
1dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1de0: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29  de==OP_Destroy )
1df0: 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61 74  {.      doesStat
1e00: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1e10: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1e20: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e30: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
1e40: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
1e50: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
1e60: 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20  OP_VRename ){.  
1e70: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
1e80: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
1e90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1ea0: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
1eb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
1ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1ed0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
1ee0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ef0: 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
1f00: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
1f10: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
1f20: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
1f30: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
1f40: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
1f50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
1f60: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48  lite3VdbeOpcodeH
1f70: 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64  asProperty(opcod
1f80: 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26  e, OPFLG_JUMP) &
1f90: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
1fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
1fb0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
1fc0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
1fd0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
1fe0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
1ff0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2000: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
2010: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a  p->aLabel = 0;..
2020: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
2030: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f  = nMaxArgs;..  /
2040: 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f  * If we never ro
2050: 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
2060: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
2070: 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20  then statement. 
2080: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
2090: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e   are not needed.
20a0: 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72    So change ever
20b0: 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20  y OP_Statement. 
20c0: 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20   ** opcode into 
20d0: 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69  an OP_Noop.  Thi
20e0: 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74  s avoid a call t
20f0: 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  o sqlite3OsOpenE
2100: 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20  xclusive().  ** 
2110: 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70  which can be exp
2120: 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70  ensive on some p
2130: 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20  latforms..  */. 
2140: 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e   if( hasStatemen
2150: 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53  tBegin && !doesS
2160: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
2170: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d   ){.    for(pOp=
2180: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
2190: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
21a0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
21b0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
21c0: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
21d0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
21e0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
21f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2210: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2220: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2230: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2240: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2250: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2260: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
2270: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2280: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2290: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
22a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
22b0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
22c0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
22d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
22e0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
22f0: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
2300: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
2310: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
2320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
2330: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
2340: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
2350: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
2360: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
2370: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
2380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2390: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
23a0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
23b0: 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f  c ){.    resizeO
23c0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
23d0: 2a 32 20 2b 20 6e 4f 70 29 3b 0a 20 20 7d 0a 20  *2 + nOp);.  }. 
23e0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
23f0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2410: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
2420: 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20   if( nOp>0 ){.  
2430: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
2440: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70  eOpList const *p
2450: 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f  In = aOp;.    fo
2460: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
2470: 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20  +, pIn++){.     
2480: 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70   int p2 = pIn->p
2490: 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  2;.      VdbeOp 
24a0: 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b  *pOut = &p->aOp[
24b0: 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70  i+addr];.      p
24c0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49  Out->opcode = pI
24d0: 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20  n->opcode;.     
24e0: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d   pOut->p1 = pIn-
24f0: 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  >p1;.      if( p
2500: 32 3c 30 20 26 26 20 73 71 6c 69 74 65 33 56 64  2<0 && sqlite3Vd
2510: 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65  beOpcodeHasPrope
2520: 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty(pOut->opcode
2530: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b  , OPFLG_JUMP) ){
2540: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
2550: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
2560: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
2570: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
2580: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
2590: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
25a0: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
25b0: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
25c0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
25d0: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
25e0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
25f0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
2600: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
2610: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62 65  if( sqlite3_vdbe
2620: 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a  _addop_trace ){.
2630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2640: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
2650: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
2660: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
2670: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2680: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
2690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
26a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
26b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
26c0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
26d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
26e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
26f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2700: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
2710: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
2720: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
2730: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
2740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2750: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
2760: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
2770: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
2780: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
2790: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27a0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
27b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
27c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
27d0: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
27e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
27f0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2800: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2810: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2820: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2830: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
2840: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2850: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2860: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
2870: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2880: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2890: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
28a0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
28b0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
28c0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
28d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
28e0: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP2(Vdbe *p, in
28f0: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2900: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2910: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2920: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2930: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2940: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2950: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2960: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2970: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
2980: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2990: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
29a0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
29b0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
29c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
29d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
29e0: 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P3(Vdbe *p, int 
29f0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2a00: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
2a10: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
2a20: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2a30: 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d   if( p && addr>=
2a40: 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72  0 && p->nOp>addr
2a50: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
2a60: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
2a70: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
2a80: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2a90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
2aa0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
2ab0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
2ac0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
2ad0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2ae0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
2af0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
2b00: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2b10: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2b20: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2b30: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f    if( p && p->aO
2b40: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
2b50: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
2b60: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
2b70: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
2b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2b90: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
2ba0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
2bb0: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
2bc0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
2bd0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2be0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2bf0: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
2c00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
2c10: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
2c20: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
2c30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2c40: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
2c50: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
2c60: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
2c70: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
2c80: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
2c90: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
2ca0: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
2cb0: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
2cc0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
2cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2ce0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
2cf0: 6f 6e 28 46 75 6e 63 44 65 66 20 2a 70 44 65 66  on(FuncDef *pDef
2d00: 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26  ){.  if( pDef &&
2d10: 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
2d20: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
2d30: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
2d40: 69 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b  ite3_free(pDef);
2d50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
2d60: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20  lete a P4 value 
2d70: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
2d80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2d90: 65 50 34 28 69 6e 74 20 70 34 74 79 70 65 2c 20  eP4(int p4type, 
2da0: 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69 66 28  void *p3){.  if(
2db0: 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69 74 63   p3 ){.    switc
2dc0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
2dd0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
2de0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
2df0: 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65  NT64:.      case
2e00: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20   P4_MPRINTF:.   
2e10: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
2e20: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
2e30: 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20  4_KEYINFO:.     
2e40: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
2e50: 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20  _HANDOFF: {.    
2e60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e70: 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p3);.        br
2e80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2e90: 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46     case P4_VDBEF
2ea0: 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  UNC: {.        V
2eb0: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
2ec0: 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a  nc = (VdbeFunc *
2ed0: 29 70 33 3b 0a 20 20 20 20 20 20 20 20 66 72 65  )p3;.        fre
2ee0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
2ef0: 6f 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e 70 46  on(pVdbeFunc->pF
2f00: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71  unc);.        sq
2f10: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
2f20: 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63  uxData(pVdbeFunc
2f30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2f40: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 64 62 65  lite3_free(pVdbe
2f50: 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62  Func);.        b
2f60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2f70: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
2f80: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66  DEF: {.        f
2f90: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2fa0: 74 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a 29 70  tion((FuncDef*)p
2fb0: 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  3);.        brea
2fc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2fd0: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
2fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ff0: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
3000: 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20  3_value*)p3);.  
3010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3020: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
3030: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
3040: 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69  N opcodes starti
3050: 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f  ng at addr to No
3060: 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  -ops..*/.void sq
3070: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
3080: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
3090: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b  nt addr, int N){
30a0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61  .  if( p && p->a
30b0: 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  Op ){.    VdbeOp
30c0: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
30d0: 61 64 64 72 5d 3b 0a 20 20 20 20 77 68 69 6c 65  addr];.    while
30e0: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66  ( N-- ){.      f
30f0: 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70  reeP4(pOp->p4typ
3100: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
3110: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
3120: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
3130: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
3140: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
3150: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
3160: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3170: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3180: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
3190: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
31a0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
31b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
31c0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
31d0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
31e0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
31f0: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
3200: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
3210: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
3220: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
3230: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
3240: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
3250: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
3260: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
3270: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
3280: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
3290: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
32a0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
32b0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
32c0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
32d0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
32e0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
32f0: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
3300: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
3310: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
3320: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
3330: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
3340: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
3350: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
3360: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
3370: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
3380: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
3390: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
33a0: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
33b0: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
33c0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
33d0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
33e0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
33f0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
3400: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
3410: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
3420: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
3430: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
3440: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
3450: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
3460: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3470: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
3480: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
3490: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
34a0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
34b0: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
34c0: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
34d0: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
34e0: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
34f0: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3500: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3510: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3520: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3530: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
3540: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
3550: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
3560: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
3570: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
3580: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
3590: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
35a0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
35b0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
35c0: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
35d0: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
35e0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
35f0: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3600: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
3610: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3620: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3630: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3640: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
3650: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3660: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
3670: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
3680: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
3690: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
36a0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
36b0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
36c0: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
36d0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
36e0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
36f0: 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e  f (n != P4_KEYIN
3700: 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  FO) {.      free
3710: 50 34 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  P4(n, (void*)*(c
3720: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
3730: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
3740: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 64 64   }.  assert( add
3750: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
3760: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
3770: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
3780: 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c  1;.    if( addr<
3790: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
37a0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
37b0: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
37c0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
37d0: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
37e0: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  p4.p = 0;.  if( 
37f0: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
3800: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 28     pOp->p4.i = (
3810: 69 6e 74 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  int)zP4;.    pOp
3820: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
3830: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
3840: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3850: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
3860: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3870: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
3880: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
3890: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
38a0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
38b0: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
38c0: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
38d0: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
38e0: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
38f0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
3900: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
3910: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
3920: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
3930: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
3940: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  nfo = sqlite3_ma
3950: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
3960: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
3970: 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
3980: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
3990: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
39a0: 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20  (pKeyInfo, zP4, 
39b0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 2f 2a  nByte);.      /*
39c0: 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
39d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
39e0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 73 20 6f 6e  P4_KEYINFO is on
39f0: 6c 79 20 65 76 65 72 20 75 73 65 64 20 6f 6e 0a  ly ever used on.
3a00: 20 20 20 20 20 20 2a 2a 20 4b 65 79 49 6e 66 6f        ** KeyInfo
3a10: 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
3a20: 20 68 61 76 65 20 6e 6f 20 61 53 6f 72 74 4f 72   have no aSortOr
3a30: 64 65 72 20 63 6f 6d 70 6f 6e 65 6e 74 2e 20 20  der component.  
3a40: 45 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 2a  Elements.      *
3a50: 2a 20 77 69 74 68 20 61 6e 20 61 53 6f 72 74 4f  * with an aSortO
3a60: 72 64 65 72 20 61 6c 77 61 79 73 20 75 73 65 20  rder always use 
3a70: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
3a80: 46 46 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  FF.  So we do no
3a90: 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20  t.      ** need 
3aa0: 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68 20 64  to bother with d
3ab0: 75 70 6c 69 63 61 74 69 6e 67 20 74 68 65 20 61  uplicating the a
3ac0: 53 6f 72 74 4f 72 64 65 72 2e 20 2a 2f 0a 20 20  SortOrder. */.  
3ad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
3ae0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3af0: 3d 3d 30 20 29 3b 0a 23 69 66 20 30 0a 20 20 20  ==0 );.#if 0.   
3b00: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
3b10: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3b20: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
3b30: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
3b40: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
3b50: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
3b60: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
3b70: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
3b80: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
3b90: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
3ba0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
3bb0: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
3bc0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
3bd0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
3be0: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
3bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c00: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
3c10: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
3c20: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3c30: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a  _NOTUSED;.    }.
3c40: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
3c50: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
3c60: 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  F ){.    pOp->p4
3c70: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
3c80: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3c90: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
3ca0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29   }else if( n<0 )
3cb0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
3cc0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
3cd0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3ce0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
3cf0: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
3d00: 74 72 6c 65 6e 28 7a 50 34 29 3b 0a 20 20 20 20  trlen(zP4);.    
3d10: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
3d20: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
3d30: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
3d40: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3d50: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
3d60: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
3d70: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3d80: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
3d90: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3da0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
3db0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3dc0: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
3dd0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
3de0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
3df0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
3e00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
3e10: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
3e20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3e30: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
3e40: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
3e50: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
3e60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3e70: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3e80: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
3e90: 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  z = &p->aOp[p->n
3ea0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a  Op-1].zComment;.
3eb0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
3ec0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73   zFormat);.    s
3ed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 29  qlite3_free(*pz)
3ee0: 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69  ;.    *pz = sqli
3ef0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
3f00: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
3f10: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
3f20: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
3f30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3f40: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
3f50: 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56  en address..*/.V
3f60: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
3f70: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
3f80: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73   int addr){.  as
3f90: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3fa0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 61 64  );.  assert( (ad
3fc0: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
3fd0: 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e  >nOp) || p->db->
3fe0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3ff0: 20 20 72 65 74 75 72 6e 20 28 28 61 64 64 72 3e    return ((addr>
4000: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
4010: 70 29 3f 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p)?(&p->aOp[addr
4020: 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64  ]):0);.}..#if !d
4030: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4040: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
4050: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
4060: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
4070: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
4080: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4090: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
40a0: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
40b0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
40c0: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
40d0: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
40e0: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
40f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
4100: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
4110: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
4120: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
4130: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
4140: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
4150: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
4160: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
4170: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
4180: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
4190: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
41a0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
41b0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
41c0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
41d0: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
41e0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
41f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4200: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
4210: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
4220: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4230: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4240: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4250: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4260: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4270: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4280: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4290: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
42a0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
42b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
42c0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
42d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
42e0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
42f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4300: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4310: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
4320: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4330: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4340: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4350: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4360: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4370: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4380: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4390: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
43a0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
43b0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
43c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
43d0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
43e0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
43f0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
4400: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
4410: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
4420: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4430: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4440: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4450: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4460: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4470: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4480: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4490: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
44a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
44b0: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
44c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
44d0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
44e0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
44f0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
4500: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
4510: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4520: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
4530: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
4540: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
4550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4560: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
4570: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
4580: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
4590: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
45a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
45b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
45c0: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
45d0: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
45e0: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
45f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4600: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
4610: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4620: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4630: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
4640: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
4650: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4660: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
4670: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4680: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4690: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
46a0: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
46b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
46c0: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
46d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
46e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
46f0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
4700: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
4710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4720: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
4730: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
4740: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
4750: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
4760: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4770: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
4780: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
4790: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
47a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
47b0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
47c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
47d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
47e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
47f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4800: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
4810: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
4820: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4830: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4840: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
4850: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4860: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4870: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
4880: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
4890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
48a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
48b0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
48c0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
48d0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
48e0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
48f0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
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 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
4930: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
4940: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
4950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4960: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
4970: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
4980: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
4990: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
49a0: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
49b0: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
49c0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
49d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
49e0: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
49f0: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
4a00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  endif../*.** Dec
4a10: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
4a20: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
4a30: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
4a40: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a  b[i] is used..**
4a50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4a60: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
4a70: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
4a80: 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73   int mask;.  ass
4a90: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
4aa0: 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  ->db->nDb );.  a
4ab0: 73 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66 28  ssert( i<sizeof(
4ac0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
4ad0: 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  );.  mask = 1<<i
4ae0: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65  ;.  if( (p->btre
4af0: 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
4b00: 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65   ){.    p->btree
4b10: 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
4b20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
4b30: 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26  texArrayInsert(&
4b40: 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62  p->aMutex, p->db
4b50: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
4b60: 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e   }.}...#if defin
4b70: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
4b80: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
4b90: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
4ba0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
4bb0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
4bc0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
4bd0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
4be0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4bf0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
4c00: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
4c10: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
4c20: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
4c30: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
4c40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
4c50: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
4c60: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
4c70: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
4c80: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
4c90: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
4ca0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
4cb0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
4cc0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
4cd0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
4ce0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
4cf0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
4d00: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
4d10: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
4d20: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
4d30: 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20  pOp->p5,.#ifdef 
4d40: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
4d50: 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74     pOp->zComment
4d60: 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   ? pOp->zComment
4d70: 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20   : "".#else.    
4d80: 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b    "".#endif.  );
4d90: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
4da0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4db0: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
4dc0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
4dd0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
4de0: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
4df0: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
4e00: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
4e10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
4e20: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
4e30: 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  int malloc_faile
4e40: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
4e50: 69 6c 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28  iled;.    while(
4e60: 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20   N-->0 ){.      
4e70: 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70  assert( N<2 || p
4e80: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
4e90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4ea0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
4eb0: 29 3b 0a 20 20 20 20 20 20 70 2b 2b 2d 3e 66 6c  );.      p++->fl
4ec0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
4ed0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61      }.    db->ma
4ee0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
4ef0: 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  loc_failed;.  }.
4f00: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4f10: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
4f20: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
4f30: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
4f40: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
4f50: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
4f60: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
4f70: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
4f80: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
4f90: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
4fa0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
4fb0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
4fc0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
4fd0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
4fe0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
4ff0: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
5000: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
5010: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
5020: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
5030: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
5040: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
5050: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
5060: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
5070: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
5080: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
5090: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
50a0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
50b0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
50c0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
50d0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
50e0: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
50f0: 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  Y PLAN..*/.int s
5100: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
5110: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
5120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5130: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
5140: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
5150: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
5160: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5170: 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  OK;.  Mem *pMem 
5180: 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  = p->pResultSet 
5190: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a  = &p->aMem[1];..
51a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
51b0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  lain );.  if( p-
51c0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
51d0: 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20  IC_RUN ) return 
51e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
51f0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67   assert( db->mag
5200: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
5210: 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72  _BUSY );.  asser
5220: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
5230: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
5240: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20  LITE_BUSY );..  
5250: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
5260: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
5270: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
5280: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
5290: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
52a0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
52b0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
52c0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
52d0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
52e0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
52f0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
5300: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
5310: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
5320: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5330: 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  pMem, p->nMem);.
5340: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
5350: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
5360: 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d  ( i<p->nOp && p-
5370: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
5380: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
5390: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
53a0: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29   if( i>=p->nOp )
53b0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
53c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
53d0: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
53e0: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
53f0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
5400: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
5410: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
5420: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5430: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
5440: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
5450: 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  >zErrMsg, sqlite
5460: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20  3ErrStr(p->rc), 
5470: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c  (char*)0);.  }el
5480: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
5490: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26  .    Op *pOp = &
54a0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 69  p->aOp[i];.    i
54b0: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
54c0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
54d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
54e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
54f0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5500: 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ER;.      pMem->
5510: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
5540: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
5550: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
5560: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
5570: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
5580: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
5590: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
55a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
55b0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
55c0: 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64  code);  /* Opcod
55d0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
55e0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
55f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
5600: 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29   strlen(pMem->z)
5610: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
5620: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5630: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
5640: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
5650: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
5660: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
5670: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
5680: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
5690: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
56c0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
56d0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
56e0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
56f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5700: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
5710: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
5740: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
5750: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
5760: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
5770: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
5780: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
5790: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
57a0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
57b0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
57e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
57f0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5800: 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ER;.      pMem++
5810: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
5820: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
5830: 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29  row(pMem, 32, 0)
5840: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f   ){            /
5850: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 70 2d  * P4 */.      p-
5860: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5870: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  d = 1;.      ret
5880: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
58a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
58b0: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
58c0: 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70  rm;.    z = disp
58d0: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
58e0: 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28  >z, 32);.    if(
58f0: 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20   z!=pMem->z ){. 
5900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5910: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
5920: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  z, -1, SQLITE_UT
5930: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
5940: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5950: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
5960: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
5970: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5980: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
5990: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
59a0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
59b0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
59c0: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
59d0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
59e0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
59f0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
5a00: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20  mGrow(pMem, 32, 
5a10: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  0) ){.        p-
5a20: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5a30: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  d = 1;.        r
5a40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5a50: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
5a60: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5a70: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
5a80: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
5a90: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 70 72 69 6e 74  pMem->n = sprint
5aa0: 66 28 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78  f(pMem->z, "%.2x
5ab0: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
5ac0: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P5 */.      pM
5ad0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5ae0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
5af0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
5b00: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
5b10: 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53  m++;.  .#ifdef S
5b20: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
5b30: 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d    if( pOp->zComm
5b40: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ent ){.        p
5b50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5b60: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
5b70: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d         pMem->z =
5b80: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a   pOp->zComment;.
5b90: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
5ba0: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5bb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
5bc0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5bd0: 46 38 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  F8;.      }else.
5be0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
5bf0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
5c00: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
5c30: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  */.        pMem-
5c40: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
5c50: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
5c60: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
5c70: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70  olumn = 8 - 5*(p
5c80: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
5c90: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
5ca0: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
5cb0: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
5cc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
5cd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5ce0: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
5cf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5d00: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
5d10: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
5d20: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
5d30: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
5d40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5d50: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
5d60: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
5d70: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
5d80: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
5d90: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
5da0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
5db0: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
5dc0: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
5dd0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
5de0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
5df0: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  r *z = pOp->p4.z
5e00: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73  ;.    while( iss
5e10: 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20  pace(*(u8*)z) ) 
5e20: 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  z++;.    printf(
5e30: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
5e40: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
5e50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5e60: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
5e70: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5e80: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
5e90: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
5ea0: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
5eb0: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
5ec0: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
5ed0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
5ee0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
5ef0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
5f00: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
5f10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
5f20: 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29 20 72 65  io_trace==0 ) re
5f30: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
5f40: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
5f50: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
5f60: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
5f70: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
5f80: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
5f90: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
5fa0: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
5fb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5fc0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
5fd0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
5fe0: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
5ff0: 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e   isspace((unsign
6000: 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b 20 69  ed char)z[i]); i
6010: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
6020: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
6030: 20 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65       if( isspace
6040: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
6050: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
6060: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
6070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
6080: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
6090: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
60a0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
60b0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
60c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
60d0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
60e0: 33 5f 69 6f 5f 74 72 61 63 65 28 22 53 51 4c 20  3_io_trace("SQL 
60f0: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
6100: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
6110: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
6120: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
6130: 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  OTRACE */.../*.*
6140: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
6150: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
6160: 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73  execution.  This
6170: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
6180: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
6190: 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61  cating stack spa
61a0: 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ce and initializ
61b0: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
61c0: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
61d0: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
61e0: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
61f0: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
6200: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
6210: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
6220: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
6230: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
6240: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
6250: 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42   a VDBE from VDB
6260: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a  E_MAGIC_INIT to.
6270: 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  ** VDBE_MAGIC_RU
6280: 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  N..*/.void sqlit
6290: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
62a0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
62d0: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
6300: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
6310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
6320: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
6350: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
6360: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
6370: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
6380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6390: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
63a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
63b0: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
63d0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
63e0: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
63f0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
6400: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
6410: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
6420: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
6430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6440: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6450: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
6460: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
6470: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
6480: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
6490: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
64a0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
64b0: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
64c0: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
64d0: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
64e0: 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62 65 63  This.   * is bec
64f0: 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
6500: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 29   resizeOpArray()
6510: 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e   below may shrin
6520: 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f  k the.   * p->aO
6530: 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73 61 76  p[] array to sav
6540: 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c  e memory if call
6550: 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42 45 5f  ed when in VDBE_
6560: 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20  MAGIC_RUN .   * 
6570: 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70  state..   */.  p
6580: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
6590: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 0a  AGIC_RUN;..  /*.
65a0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20    ** Allocation 
65b0: 73 70 61 63 65 20 66 6f 72 20 72 65 67 69 73 74  space for regist
65c0: 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
65d0: 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  p->aMem==0 ){.  
65e0: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
65f0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
6600: 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73 73  ber of args pass
6610: 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e  ed to a user fun
6620: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72 65  ction. */.    re
6630: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
6640: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 72 65 73   &nArg);.    res
6650: 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d  izeOpArray(p, p-
6660: 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72  >nOp);.    asser
6670: 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20  t( nVar>=0 );.  
6680: 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20    if( isExplain 
6690: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
66a0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
66b0: 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20  em = 10;.    }. 
66c0: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71 6c     p->aMem = sql
66d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
66e0: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 4d 65  (db,.        nMe
66f0: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20  m*sizeof(Mem)   
6700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6710: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Mem */.      + n
6720: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Var*sizeof(Mem) 
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6740: 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b   aVar */.      +
6750: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
6760: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
6770: 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20  /* apArg */.    
6780: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6790: 63 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20  char*)          
67a0: 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20     /* azVar */. 
67b0: 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73       + nCursor*s
67c0: 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 2b  izeof(Cursor*) +
67d0: 20 31 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a   1    /* apCsr *
67e0: 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  /.    );.    if(
67f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
6800: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
6810: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
6820: 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65     /* aMem[] goe
6830: 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a  s from 1..nMem *
6840: 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  /.      p->nMem 
6850: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 2f  = nMem;        /
6860: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
6870: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
6880: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70      p->aVar = &p
6890: 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b 0a  ->aMem[nMem+1];.
68a0: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
68b0: 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  nVar;.      p->o
68c0: 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  kVar = 0;.      
68d0: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a  p->apArg = (Mem*
68e0: 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d  *)&p->aVar[nVar]
68f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
6900: 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61   = (char**)&p->a
6910: 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20  pArg[nArg];.    
6920: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75    p->apCsr = (Cu
6930: 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72  rsor**)&p->azVar
6940: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
6950: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
6960: 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  or;.      for(n=
6970: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
6980: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
6990: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
69a0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
69b0: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
69c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69d0: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
69e0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
69f0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
6a00: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
6a10: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
6a20: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
6a30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
6a40: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
6a50: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e   for(n=1; n<p->n
6a60: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61  Mem; n++){.    a
6a70: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e  ssert( p->aMem[n
6a80: 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20  ].db==db );.    
6a90: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
6aa0: 6e 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75  n].flags==MEM_Nu
6ab0: 6c 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ll );.  }.#endif
6ac0: 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  ..  p->pc = -1;.
6ad0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
6ae0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65  _OK;.  p->unique
6af0: 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65  Cnt = 0;.  p->re
6b00: 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20  turnDepth = 0;. 
6b10: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
6b20: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
6b30: 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78  >explain |= isEx
6b40: 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69  plain;.  p->magi
6b50: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
6b60: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
6b70: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
6b80: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
6b90: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
6ba0: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70 65   = 255;.  p->ope
6bb0: 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  nedStatement = 0
6bc0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
6bd0: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e  OFILE.  {.    in
6be0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
6bf0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
6c00: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  {.      p->aOp[i
6c10: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ].cnt = 0;.     
6c20: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
6c30: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
6c40: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6c50: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
6c60: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
6c70: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
6c80: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 68  es that cursor h
6c90: 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c  appens.** to hol
6ca0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6cb0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
6cc0: 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73 6f 72  (Vdbe *p, Cursor
6cd0: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
6ce0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
6cf0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
6d00: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
6d10: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
6d20: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
6d30: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  Cursor);.  }.  i
6d40: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
6d50: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
6d60: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
6d70: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
6d80: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6d90: 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e  ABLE.  if( pCx->
6da0: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
6db0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
6dc0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
6dd0: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
6de0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
6df0: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
6e00: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d   *pModule = pCx-
6e10: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d  >pModule;.    p-
6e20: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
6e30: 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  1;.    (void)sql
6e40: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 2d  ite3SafetyOff(p-
6e50: 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c  >db);.    pModul
6e60: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
6e70: 75 72 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69  ursor);.    (voi
6e80: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
6e90: 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  n(p->db);.    p-
6ea0: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
6eb0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
6ec0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78  sqlite3_free(pCx
6ed0: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->pData);.  sqli
6ee0: 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 61 54  te3_free(pCx->aT
6ef0: 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ype);.  sqlite3_
6f00: 66 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a  free(pCx);.}../*
6f10: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
6f20: 72 73 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72  rsors except for
6f30: 20 56 54 61 62 20 63 75 72 73 6f 72 73 20 74 68   VTab cursors th
6f40: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
6f50: 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  .** in use..*/.s
6f60: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
6f70: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
6f80: 41 63 74 69 76 65 56 74 61 62 73 28 56 64 62 65  ActiveVtabs(Vdbe
6f90: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
6fa0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30   if( p->apCsr==0
6fb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6fc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
6fd0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75  or; i++){.    Cu
6fe0: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
6ff0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Csr[i];.    if( 
7000: 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61  pC && (!p->inVta
7010: 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e  bMethod || !pC->
7020: 70 56 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a  pVtabCursor) ){.
7030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7040: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
7050: 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  C);.      p->apC
7060: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  sr[i] = 0;.    }
7070: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
7080: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
7090: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
70a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
70b0: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
70c0: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
70d0: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
70e0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
70f0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
7100: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
7110: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
7120: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
7130: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
7140: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
7150: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
7160: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7170: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
7180: 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74  rsExceptActiveVt
7190: 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d  abs(p);.  for(i=
71a0: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
71b0: 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  ++){.    MemSetT
71c0: 79 70 65 46 6c 61 67 28 26 70 2d 3e 61 4d 65 6d  ypeFlag(&p->aMem
71d0: 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  [i], MEM_Null);.
71e0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
71f0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
7200: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73  ], 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 34 5f 53 54 41  .** If N==P4_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 34 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  P4_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 34  n]);.  if( N==P4
7930: 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50  _DYNAMIC || N==P
7940: 34 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20  4_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 34 5f 44 59 4e 41 4d 49 43 20 29   N==P4_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 28 76 6f 69 64 29 73 71 6c  ){.    (void)sql
8020: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
8030: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  );.    rc = db->
8040: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
8050: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
8060: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
8070: 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a  e3SafetyOn(db);.
8080: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
8090: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
80a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
80b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
80c0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
80d0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
80e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
80f0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
8100: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
8110: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
8120: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
8130: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
8140: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
8150: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
8160: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
8170: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
8180: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
8190: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
81a0: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
81b0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
81c0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
81d0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20  se is :memory:. 
81e0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   In that case we
81f0: 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70   do.  ** not sup
8200: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
8210: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
8220: 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c  so use the simpl
8230: 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a  e case then.  **
8240: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
8250: 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74   0==strlen(sqlit
8260: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
8270: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
8280: 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  t)) || nTrans<=1
8290: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
82a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
82b0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
82c0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
82d0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
82e0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
82f0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
8300: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
8310: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
8320: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
8330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
8340: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
8350: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
8360: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
8370: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
8380: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
8390: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
83a0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
83b0: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
83c0: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
83d0: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
83e0: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
83f0: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
8400: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
8410: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
8420: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
8430: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
8440: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
8450: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
8460: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
8470: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
8480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
8490: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
84a0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
84b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
84c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
84d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
84e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
84f0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
8500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8510: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8520: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
8530: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
8540: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
8550: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
8560: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
8570: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
8580: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
8590: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
85a0: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
85b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
85c0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
85d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
85e0: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
85f0: 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  micly..  */.#ifn
8600: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8610: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
8620: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
8630: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
8640: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
8650: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
8660: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
8670: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
8680: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8690: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
86a0: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
86b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
86c0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
86d0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
86e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
86f0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
8700: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  64 offset = 0;..
8710: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
8720: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8730: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
8740: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72  do {.      u32 r
8750: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c  andom;.      sql
8760: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
8770: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
8780: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
8790: 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e  of(random), &ran
87a0: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73  dom);.      zMas
87b0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
87c0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25  intf(db, "%s-mj%
87d0: 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c  08X", zMainFile,
87e0: 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66   random&0x7fffff
87f0: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ff);.      if( !
8800: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  zMaster ){.     
8810: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8820: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
8830: 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69      }while( sqli
8840: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
8850: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
8860: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
8870: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
8880: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8890: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  nal. */.    rc =
88a0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
88b0: 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
88c0: 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
88d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
88e0: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
88f0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
8900: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8910: 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
8920: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
8930: 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
8940: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
8950: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8960: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8970: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
8980: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
8990: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
89a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
89b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
89c0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
89d0: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
89e0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
89f0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
8a00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
8a10: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
8a20: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
8a30: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
8a40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
8a50: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
8a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
8a70: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
8a80: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
8a90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
8aa0: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
8ab0: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
8ac0: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
8ad0: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
8ae0: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
8af0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
8b00: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
8b10: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8b20: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
8b30: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20       if( i==1 ) 
8b40: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49  continue;   /* I
8b50: 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64  gnore the TEMP d
8b60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
8b70: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
8b80: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
8b90: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8ba0: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
8bb0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
8bc0: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
8bd0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
8be0: 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  e[0]==0 ) contin
8bf0: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a  ue;  /* Ignore :
8c00: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
8c10: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
8c20: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
8c30: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
8c40: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
8c50: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
8c60: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
8c70: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
8c80: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
8c90: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74  aster, zFile, st
8ca0: 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  rlen(zFile)+1, o
8cb0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
8cc0: 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e  offset += strlen
8cd0: 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
8ce0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8cf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8d00: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8d10: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
8d20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8d30: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
8d40: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
8d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8d60: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8d70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
8d80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8d90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
8da0: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
8db0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
8dc0: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
8dd0: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
8de0: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
8df0: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
8e00: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
8e10: 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73     zMainFile = s
8e20: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69  qlite3BtreeGetDi
8e30: 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  rname(db->aDb[0]
8e40: 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 28  .pBt);.    if( (
8e50: 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
8e60: 26 20 28 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  & (0==(sqlite3Os
8e70: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
8e80: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
8e90: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
8ea0: 45 4e 54 49 41 4c 29 29 0a 20 20 20 20 20 26 26  ENTIAL)).     &&
8eb0: 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79   (rc=sqlite3OsSy
8ec0: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
8ed0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
8ee0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  !=SQLITE_OK) ){.
8ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
8f00: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
8f10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8f20: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
8f30: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
8f40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8f50: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
8f60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8f70: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
8f80: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
8f90: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
8fa0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
8fb0: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
8fc0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
8fd0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
8fe0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
8ff0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
9000: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
9010: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
9020: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
9030: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9040: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
9050: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
9060: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
9070: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
9080: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
9090: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
90a0: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
90b0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
90c0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
90d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
90e0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
90f0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
9100: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
9110: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
9120: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9130: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
9140: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9150: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
9160: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
9170: 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f   occured..    */
9180: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
9190: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
91a0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
91b0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
91c0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
91d0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
91e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
91f0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
9200: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
9210: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
9220: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9230: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
9240: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (pMaster);.    i
9250: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9260: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9270: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
9280: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
9290: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
92a0: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
92b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
92c0: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
92d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
92e0: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
92f0: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
9300: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
9310: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
9320: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
9330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
9340: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
9350: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
9360: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
9370: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
9380: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
9390: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
93a0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
93b0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
93c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
93d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
93e0: 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
93f0: 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
9400: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
9410: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
9420: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
9430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
9440: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
9450: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
9460: 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
9470: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
9480: 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
9490: 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
94a0: 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
94b0: 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
94c0: 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
94d0: 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
94e0: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
94f0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
9500: 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
9510: 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
9520: 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
9530: 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
9540: 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
9550: 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
9560: 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
9570: 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
9580: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
9590: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
95a0: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
95b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
95c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
95d0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
95e0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
95f0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
9600: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9610: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9620: 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20  Two(pBt);.      
9630: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 61 62  }.    }.    enab
9640: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
9650: 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
9660: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
9670: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
9680: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
9690: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
96a0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
96b0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
96c0: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
96d0: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
96e0: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
96f0: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
9700: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
9710: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
9720: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
9730: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
9740: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
9750: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
9760: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
9770: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
9780: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
9790: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
97a0: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
97b0: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
97c0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
97d0: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
97e0: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
97f0: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
9800: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
9810: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
9820: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
9830: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
9840: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
9850: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
9860: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
9870: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
9880: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
9890: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
98a0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
98b0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
98c0: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
98d0: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
98e0: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
98f0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
9900: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
9910: 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74  or every Btree t
9920: 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  hat in database 
9930: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68  connection db wh
9940: 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e  ich .** has been
9950: 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70   modified, "trip
9960: 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  " or invalidate 
9970: 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a  each cursor in.*
9980: 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67  * that Btree mig
9990: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ht have been mod
99a0: 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68  ified so that th
99b0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
99c0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67  never be used ag
99d0: 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65  ain.  This happe
99e0: 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ns when a rollba
99f0: 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ck.*** occurs.  
9a00: 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20  We have to trip 
9a10: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75  all the other cu
9a20: 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63  rsors, even.** c
9a30: 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72  ursor from other
9a40: 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e   VMs in differen
9a50: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
9a60: 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68  ctions,.** so th
9a70: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20  at none of them 
9a80: 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64  try to use the d
9a90: 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65  ata at which the
9aa0: 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69  y.** were pointi
9ab0: 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77  ng and which now
9ac0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
9ad0: 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f  hanged due.** to
9ae0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
9af0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
9b00: 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61  at a rollback ca
9b10: 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20  n delete tables 
9b20: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20  complete and.** 
9b30: 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65  reorder rootpage
9b40: 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74  s.  So it is not
9b50: 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74   sufficient just
9b60: 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20   to save.** the 
9b70: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
9b80: 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  sor.  We have to
9b90: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
9ba0: 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61  cursor.** so tha
9bb0: 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73  t it is never us
9bc0: 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61  ed again..*/.sta
9bd0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
9be0: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
9bf0: 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74  fiedBtrees(sqlit
9c00: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
9c10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
9c20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
9c30: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
9c40: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9c50: 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65   if( p && sqlite
9c60: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
9c70: 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
9c80: 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
9c90: 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45  ursors(p, SQLITE
9ca0: 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20  _ABORT);.    }. 
9cb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
9cc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9cd0: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
9ce0: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
9cf0: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
9d00: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
9d10: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
9d20: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
9d30: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
9d40: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
9d50: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
9d60: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
9d70: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
9d80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9d90: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
9da0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
9db0: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
9dc0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
9dd0: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
9de0: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
9df0: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
9e00: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
9e10: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
9e20: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
9e30: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
9e40: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
9e50: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
9e60: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
9e70: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
9e80: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
9e90: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
9ea0: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
9eb0: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
9ec0: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
9ed0: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
9ee0: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
9ef0: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
9f00: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
9f10: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
9f20: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
9f30: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
9f40: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46  nt i;.  int (*xF
9f50: 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29  unc)(Btree *pBt)
9f60: 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69   = 0;  /* Functi
9f70: 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61  on to call on ea
9f80: 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64  ch btree backend
9f90: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63   */.  int isSpec
9fa0: 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
9fb0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
9fc0: 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f  rue if SQLITE_NO
9fd0: 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a  MEM or IOERR */.
9fe0: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
9ff0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
a000: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
a010: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
a020: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
a030: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
a040: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
a050: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
a060: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
a070: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
a080: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
a090: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
a0a0: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
a0b0: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
a0c0: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
a0d0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
a0e0: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
a0f0: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
a100: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
a110: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
a120: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
a130: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
a140: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
a150: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
a160: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
a170: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
a180: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
a190: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
a1a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
a1b0: 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
a1c0: 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
a1d0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
a1e0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
a1f0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
a200: 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
a210: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
a220: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
a230: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a240: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
a250: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
a260: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69  iveVtabs(p);.  i
a270: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
a280: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
a290: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a2a0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
a2b0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
a2c0: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
a2d0: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
a2e0: 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
a2f0: 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
a300: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
a310: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=0 ){.    int 
a320: 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
a330: 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
a340: 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20 20  m p->rc */..    
a350: 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
a360: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
a370: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
a380: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
a390: 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e  xArrayEnter(&p->
a3a0: 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  aMutex);..    /*
a3b0: 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
a3c0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
a3d0: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
a3e0: 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
a3f0: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
a400: 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
a410: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
a420: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
a450: 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
a460: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
a470: 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
a480: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
a490: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73  * This loop does
a4a0: 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73   static analysis
a4b0: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 74 6f   of the query to
a4c0: 20 73 65 65 20 77 68 69 63 68 20 6f 66 20 74 68   see which of th
a4d0: 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  e.      ** follo
a4e0: 77 69 6e 67 20 74 68 72 65 65 20 63 61 74 65 67  wing three categ
a4f0: 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69  ories it falls i
a500: 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  nto:.      **.  
a510: 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d      **     Read-
a520: 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20  only.      **   
a530: 20 20 51 75 65 72 79 20 77 69 74 68 20 73 74 61    Query with sta
a540: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  tement journal. 
a550: 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72       **     Quer
a560: 79 20 77 69 74 68 6f 75 74 20 73 74 61 74 65 6d  y without statem
a570: 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent journal.    
a580: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
a590: 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68   could do someth
a5a0: 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74  ing more elegant
a5b0: 20 74 68 61 6e 20 74 68 69 73 20 73 74 61 74 69   than this stati
a5c0: 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e  c analysis (i.e.
a5d0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  .      ** store 
a5e0: 74 68 65 20 74 79 70 65 20 6f 66 20 71 75 65 72  the type of quer
a5f0: 79 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  y as part of the
a600: 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61   compliation pha
a610: 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20 20  se), but .      
a620: 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c  ** handling mall
a630: 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
a640: 72 65 20 69 73 20 61 20 66 61 69 72 6c 79 20 6f  re is a fairly o
a650: 62 73 63 75 72 65 20 65 64 67 65 20 63 61 73 65  bscure edge case
a660: 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   so .      ** th
a670: 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20 65  is is probably e
a680: 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67  asier. Todo: Mig
a690: 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72 74 75  ht be an opportu
a6a0: 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65 20 0a  nity to reduce .
a6b0: 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 73 69        ** code si
a6c0: 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c 6c 20  ze a very small 
a6d0: 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e  amount though...
a6e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a6f0: 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20  int notReadOnly 
a700: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
a710: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  sStatement = 0;.
a720: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e        assert(p->
a730: 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30  aOp || p->nOp==0
a740: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
a750: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
a760: 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  { .        switc
a770: 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  h( p->aOp[i].opc
a780: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
a790: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
a7a0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  tion:.          
a7b0: 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 7c 3d    notReadOnly |=
a7c0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b 0a 20   p->aOp[i].p2;. 
a7d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a7e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
a7f0: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20   OP_Statement:. 
a800: 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74 61             isSta
a810: 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  tement = 1;.    
a820: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a840: 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  ..   .      /* I
a850: 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
a860: 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65  read-only, we ne
a870: 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63  ed do no rollbac
a880: 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77  k at all. Otherw
a890: 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72  ise,.      ** pr
a8a0: 6f 63 65 65 64 20 77 69 74 68 20 74 68 65 20 73  oceed with the s
a8b0: 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
a8c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a8d0: 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20  if( notReadOnly 
a8e0: 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
a8f0: 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
a900: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
a910: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
a920: 4b 45 44 20 26 26 20 69 73 53 74 61 74 65 6d 65  KED && isStateme
a930: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
a940: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
a950: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
a960: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
a970: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
a980: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
a990: 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
a9a0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
a9b0: 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 69  QLITE_FULL) && i
a9c0: 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  sStatement ){.  
a9d0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
a9e0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
a9f0: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
aa00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aa10: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
aa20: 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
aa30: 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
aa40: 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
aa50: 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
aa60: 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
aa70: 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
aa80: 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
aa90: 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
aaa0: 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
aab0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c  .          inval
aac0: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
aad0: 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
aae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
aaf0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
ab00: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
ab10: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
ab20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ab30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
ab40: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
ab50: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
ab60: 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
ab70: 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76  he only active v
ab80: 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  dbe, then.    **
ab90: 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
aba0: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
abb0: 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
abc0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
abd0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
abe0: 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
abf0: 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
ac00: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
ac10: 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
ac20: 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
ac30: 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f  occured. .    */
ac40: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74  .    if( db->aut
ac50: 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61  oCommit && db->a
ac60: 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20  ctiveVdbeCnt==1 
ac70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
ac80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
ac90: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
aca0: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
acb0: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
acc0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
acd0: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
ace0: 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68   is true, and th
acf0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
ad00: 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  as .        ** s
ad10: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74  uccessful or hit
ad20: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
ad30: 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d  nstraint. This m
ad40: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
ad50: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
ad60: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  uired..        *
ad70: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  /.        int rc
ad80: 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
ad90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ada0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
adb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
adc0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
add0: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
ade0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ex);.          r
adf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
ae00: 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
ae10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ae20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
ae30: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
ae40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
ae50: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
ae60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
ae80: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
ae90: 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
aea0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
aeb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
aec0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
aed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
aee0: 65 20 69 66 28 20 21 78 46 75 6e 63 20 29 7b 0a  e if( !xFunc ){.
aef0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
af00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
af10: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
af20: 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
af30: 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64 53 74   if( p->openedSt
af40: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
af50: 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c       xFunc = sql
af60: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
af70: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  tmt;.        } .
af80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
af90: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
afa0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
afb0: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
afc0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
afd0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Stmt;.      }els
afe0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  e{.        inval
aff0: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
b000: 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
b010: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b020: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b030: 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
b040: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
b050: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
b060: 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63 20 69     /* If xFunc i
b070: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
b080: 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 73 71   it is one of sq
b090: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b0a0: 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20 2a 2a  ckStmt or.    **
b0b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
b0c0: 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74  mitStmt. Call it
b0d0: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 62 61   once on each ba
b0e0: 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72  ckend. If an err
b0f0: 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20 2a 2a  or occurs.    **
b100: 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
b110: 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20 53 51  code is still SQ
b120: 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65  LITE_OK, set the
b130: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
b140: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 65  the new.    ** e
b150: 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20 20 20  rror value..    
b160: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 78  */.    assert(!x
b170: 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20 78 46  Func ||.      xF
b180: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
b190: 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a 20  eCommitStmt ||. 
b1a0: 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69       xFunc==sqli
b1b0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
b1c0: 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
b1d0: 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20 26  for(i=0; xFunc &
b1e0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
b1f0: 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ){ .      int rc
b200: 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
b210: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
b220: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
b230: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
b240: 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a 20   = xFunc(pBt);. 
b250: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26         if( rc &&
b260: 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
b270: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
b280: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20  ITE_CONSTRAINT) 
b290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
b2a0: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
b2b0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
b2c0: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
b2d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
b2e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
b2f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
b300: 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
b310: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
b320: 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  nd the statement
b330: 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
b340: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20  .    ** set the 
b350: 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
b360: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b370: 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26  p->changeCntOn &
b380: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
b390: 20 20 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c      if( !xFunc |
b3a0: 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33  | xFunc==sqlite3
b3b0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
b3c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b3d0: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
b3e0: 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
b3f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b410: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
b420: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
b430: 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
b440: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
b450: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
b460: 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
b470: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
b480: 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  curred. */.    i
b490: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
b4a0: 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73  _OK && db->flags
b4b0: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
b4c0: 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73  anges ){.      s
b4d0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
b4e0: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
b4f0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
b500: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
b510: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
b520: 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  anges);.    }.. 
b530: 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
b540: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
b550: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
b560: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
b570: 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Mutex);.  }..  /
b580: 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
b590: 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
b5a0: 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
b5b0: 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
b5c0: 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
b5d0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
b5e0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
b5f0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
b600: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
b610: 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
b620: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
b630: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
b640: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
b650: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
b660: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  MEM;.  }.  check
b670: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
b680: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
b690: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
b6a0: 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
b6b0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
b6c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
b6d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
b6e0: 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
b6f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
b700: 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
b710: 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
b720: 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
b730: 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
b740: 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
b750: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b760: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
b770: 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
b780: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
b790: 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
b7a0: 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
b7b0: 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
b7c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
b7d0: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
b7e0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
b7f0: 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
b800: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
b810: 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
b820: 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
b830: 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
b840: 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
b850: 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
b860: 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
b870: 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
b880: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
b890: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
b8a0: 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
b8b0: 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
b8c0: 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
b8d0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
b8e0: 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
b8f0: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
b900: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
b910: 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
b920: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
b930: 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
b940: 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
b950: 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
b960: 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
b970: 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
b980: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
b990: 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
b9a0: 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
b9b0: 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76  t now..  */.  (v
b9c0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
b9d0: 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  yOn(db);.  sqlit
b9e0: 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20  e3VdbeHalt(p);. 
b9f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
ba00: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20  fetyOff(db);..  
ba10: 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
ba20: 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
ba30: 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
ba40: 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
ba50: 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
ba60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
ba70: 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
ba80: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ba90: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
baa0: 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
bab0: 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
bac0: 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
bad0: 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
bae0: 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
baf0: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
bb00: 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
bb10: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
bb20: 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
bb30: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
bb40: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
bb50: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
bb60: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
bb70: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
bb80: 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e  (db->pErr,-1,p->
bb90: 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55  zErrMsg,SQLITE_U
bba0: 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72 65 65  TF8,sqlite3_free
bbb0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
bbc0: 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
bbd0: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
bbe0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
bbf0: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
bc00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
bc10: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
bc20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
bc30: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
bc40: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
bc50: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
bc60: 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
bc70: 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
bc80: 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
bc90: 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
bca0: 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
bcb0: 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
bcc0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
bcd0: 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
bce0: 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
bcf0: 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
bd00: 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
bd10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
bd20: 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
bd30: 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
bd40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bd50: 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
bd60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
bd70: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
bd80: 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
bd90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73  , SQLITE_UTF8, s
bda0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
bdb0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
bdc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
bdd0: 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
bde0: 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
bdf0: 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
be00: 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
be10: 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
be20: 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
be30: 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
be40: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
be50: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
be60: 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
be70: 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
be80: 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
be90: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
bea0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
beb0: 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
bec0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
bed0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
bee0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
bef0: 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
bf00: 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
bf10: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
bf20: 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
bf30: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bf40: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
bf50: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
bf60: 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
bf70: 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
bf80: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
bf90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
bfa0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
bfb0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
bfc0: 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
bfd0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
bfe0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
bff0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
c000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
c010: 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
c020: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
c030: 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
c040: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
c050: 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
c060: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
c070: 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64  IT;.  p->aborted
c080: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
c090: 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
c0a0: 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
c0b0: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
c0c0: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
c0d0: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
c0e0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
c0f0: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
c100: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
c110: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
c120: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
c130: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
c140: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
c150: 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
c160: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c170: 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
c180: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
c190: 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
c1a0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
c1b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c1c0: 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
c1d0: 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
c1e0: 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
c1f0: 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65  )==rc );.  }else
c200: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
c210: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
c220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c230: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
c240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
c250: 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
c260: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61   rc;.}../*.** Ca
c270: 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ll the destructo
c280: 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61  r for each auxda
c290: 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62  ta entry in pVdb
c2a0: 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a  eFunc for which.
c2b0: 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ** the correspon
c2c0: 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b  ding bit in mask
c2d0: 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64   is clear.  Auxd
c2e0: 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f  ata entries beyo
c2f0: 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77  nd 31.** are alw
c300: 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20  ays destroyed.  
c310: 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61  To destroy all a
c320: 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20  uxdata entries, 
c330: 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  call this.** rou
c340: 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d  tine with mask==
c350: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
c360: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
c370: 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56  ata(VdbeFunc *pV
c380: 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73  dbeFunc, int mas
c390: 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  k){.  int i;.  f
c3a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46  or(i=0; i<pVdbeF
c3b0: 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b  unc->nAux; i++){
c3c0: 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44  .    struct AuxD
c3d0: 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64  ata *pAux = &pVd
c3e0: 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d  beFunc->apAux[i]
c3f0: 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20  ;.    if( (i>31 
c400: 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29  || !(mask&(1<<i)
c410: 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78  )) && pAux->pAux
c420: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
c430: 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
c440: 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
c450: 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
c460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c470: 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a  pAux->pAux = 0;.
c480: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c490: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
c4a0: 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
c4b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
c4c0: 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
c4d0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
c4e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c  0 ) return;.  Cl
c4f0: 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20  eanup(p);.  if( 
c500: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
c510: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
c520: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
c530: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
c540: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70   p->db->pVdbe==p
c550: 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70   );.    p->db->p
c560: 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
c570: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
c580: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
c590: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
c5a0: 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28  pPrev;.  }.  if(
c5b0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 4f   p->aOp ){.    O
c5c0: 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *pOp = p->aOp;
c5d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c5e0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70  p->nOp; i++, pOp
c5f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  ++){.      freeP
c600: 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  4(pOp->p4type, p
c610: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
c620: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
c630: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c640: 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  e(pOp->zComment)
c650: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
c660: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
c670: 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  free(p->aOp);.  
c680: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
c690: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
c6a0: 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  nVar);.  sqlite3
c6b0: 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29  _free(p->aLabel)
c6c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
c6d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
c6e0: 72 65 65 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29  ree(&p->aMem[1])
c6f0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
c700: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
c710: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
c720: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
c730: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
c740: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
c750: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53  lite3_free(p->zS
c760: 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ql);.  p->magic 
c770: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
c780: 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  D;.  sqlite3_fre
c790: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(p);.}../*.** I
c7a0: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
c7b0: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
c7c0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
c7d0: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
c7e0: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
c7f0: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
c800: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
c810: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
c820: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
c830: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
c840: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
c850: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
c860: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
c870: 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b  veto(Cursor *p){
c880: 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
c890: 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
c8a0: 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
c8b0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
c8c0: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
c8d0: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
c8e0: 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
c8f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
c900: 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
c910: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
c920: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
c930: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
c940: 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
c950: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c960: 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63  rc;.    *p->pInc
c970: 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rKey = 0;.    p-
c980: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79  >lastRowid = key
c990: 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54  ToInt(p->movetoT
c9a0: 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72  arget);.    p->r
c9b0: 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65  owidIsValid = re
c9c0: 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65  s==0;.    if( re
c9d0: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  s<0 ){.      rc 
c9e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
c9f0: 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  xt(p->pCursor, &
ca00: 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
ca10: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ca20: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
ca30: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
ca40: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
ca50: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
ca60: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
ca70: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
ca80: 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
ca90: 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72  E_STALE;.  }.  r
caa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
cac0: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
cad0: 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
cae0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
caf0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
cb00: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
cb10: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
cb20: 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c  ialRead().** sql
cb30: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
cb40: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
cb50: 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a  beSerialWrite().
cb60: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
cb70: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
cb80: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
cb90: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
cba0: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
cbb0: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
cbc0: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
cbd0: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
cbe0: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
cbf0: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
cc00: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
cc10: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
cc20: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
cc30: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
cc40: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
cc50: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
cc60: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
cc70: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
cc80: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
cc90: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
cca0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
ccb0: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
ccc0: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
ccd0: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
cce0: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
ccf0: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
cd00: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
cd10: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
cd20: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
cd30: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
cd40: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
cd50: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
cd60: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
cd70: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
cd80: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
cd90: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
cda0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
cdb0: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
cdc0: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
cdd0: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
cde0: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
cdf0: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
ce00: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
ce10: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
ce40: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ce50: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
ce80: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
ceb0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
cec0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
ced0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
cee0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
cef0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
cf20: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
cf30: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
cf50: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
cf60: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
cf70: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
cf80: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
cf90: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
cfa0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
cfd0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
cfe0: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
d000: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
d010: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
d040: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
d050: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
d080: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
d090: 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
d0c0: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
d0d0: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
d0e0: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
d0f0: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
d100: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
d110: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
d120: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
d130: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
d140: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
d150: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
d160: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
d170: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
d180: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
d190: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
d1a0: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
d1b0: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
d1c0: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
d1d0: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
d1e0: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
d1f0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
d200: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
d210: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
d220: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
d230: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
d240: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
d250: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
d260: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
d270: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
d280: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
d290: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
d2a0: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
d2b0: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
d2c0: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
d2d0: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
d2e0: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
d2f0: 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  1000)<<32)-1).  
d300: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
d310: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
d320: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
d330: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
d340: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
d350: 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20  rn 8+i;.    }.  
d360: 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a    u = i<0 ? -i :
d370: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
d380: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
d390: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
d3a0: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
d3b0: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
d3c0: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
d3d0: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
d3e0: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
d3f0: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
d400: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
d410: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
d420: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
d430: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
d440: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
d450: 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53  rt( flags&(MEM_S
d460: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
d470: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
d480: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
d490: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
d4a0: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d  = pMem->u.i;.  }
d4b0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
d4c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
d4d0: 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
d4e0: 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
d4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d500: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
d510: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
d520: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
d530: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
d540: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d550: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
d560: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
d570: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
d580: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
d590: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
d5a0: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
d5b0: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
d5c0: 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
d5d0: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
d5e0: 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
d5f0: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
d600: 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
d610: 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
d620: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
d630: 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
d640: 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
d650: 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
d660: 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
d670: 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
d680: 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
d690: 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
d6a0: 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
d6b0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
d6c0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
d6d0: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
d6e0: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
d6f0: 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
d700: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
d710: 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
d720: 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
d730: 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
d740: 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
d750: 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
d760: 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
d770: 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
d780: 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
d790: 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
d7a0: 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
d7b0: 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
d7c0: 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
d7d0: 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
d7e0: 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
d7f0: 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
d800: 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
d810: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
d820: 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
d830: 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
d840: 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
d850: 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
d860: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
d870: 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
d880: 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
d890: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
d8a0: 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
d8b0: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
d8c0: 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
d8d0: 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
d8e0: 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
d8f0: 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
d900: 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
d910: 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
d920: 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
d930: 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
d940: 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
d950: 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
d960: 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
d970: 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
d980: 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
d990: 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
d9a0: 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
d9b0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
d9c0: 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
d9d0: 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
d9e0: 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
d9f0: 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
da00: 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
da10: 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
da20: 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
da30: 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
da40: 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
da50: 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
da60: 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
da70: 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
da80: 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
da90: 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
daa0: 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
dab0: 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
dac0: 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
dad0: 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
dae0: 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
daf0: 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
db00: 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
db10: 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
db20: 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
db30: 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
db40: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
db50: 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
db60: 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
db70: 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
db80: 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
db90: 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
dba0: 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
dbb0: 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
dbc0: 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
dbd0: 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
dbe0: 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
dbf0: 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
dc00: 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
dc10: 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
dc20: 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
dc30: 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
dc40: 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
dc50: 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
dc60: 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
dc70: 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
dc80: 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
dc90: 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
dca0: 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
dcb0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
dcc0: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
dcd0: 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
dce0: 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
dcf0: 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
dd00: 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
dd10: 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
dd20: 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
dd30: 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
dd40: 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
dd50: 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
dd60: 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
dd70: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
dd80: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
dd90: 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
dda0: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
ddb0: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
ddc0: 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
ddd0: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
dde0: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
ddf0: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
de00: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
de10: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
de20: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
de30: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
de40: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
de50: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
de60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
de70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
de80: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
de90: 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
dea0: 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
deb0: 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
dec0: 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
ded0: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
dee0: 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
def0: 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
df00: 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
df10: 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
df20: 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
df30: 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
df40: 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
df50: 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
df60: 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
df70: 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
df80: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
df90: 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
dfa0: 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
dfb0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
dfc0: 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
dfd0: 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
dfe0: 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
dff0: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
e000: 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
e010: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
e020: 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
e030: 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
e040: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
e050: 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
e060: 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
e070: 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
e080: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
e090: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
e0a0: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
e0b0: 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
e0c0: 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
e0d0: 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
e0e0: 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
e0f0: 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
e100: 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
e110: 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
e120: 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
e130: 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  []..*/ .int sqli
e140: 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
e150: 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
e160: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
e170: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
e180: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
e190: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
e1a0: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
e1b0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
e1c0: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
e1d0: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
e1e0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
e1f0: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
e200: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
e210: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
e220: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
e230: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
e240: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e250: 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
e260: 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
e270: 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
e280: 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
e290: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
e2a0: 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
e2b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e2c0: 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
e2d0: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
e2e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
e2f0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
e300: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
e310: 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20  sert( len<=nBuf 
e320: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
e330: 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
e340: 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20  ] = (v&0xFF);.  
e350: 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
e360: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
e370: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
e380: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
e390: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e3a0: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
e3b0: 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
e3c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
e3d0: 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
e3e0: 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  i:0).           
e3f0: 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65    == sqlite3Vdbe
e400: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
e410: 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
e420: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
e430: 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
e440: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
e450: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
e460: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
e470: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
e480: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
e490: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
e4a0: 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28  ->u.i;.      if(
e4b0: 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20   len>nBuf ){.   
e4c0: 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b       len = nBuf;
e4d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
e4e0: 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
e4f0: 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
e500: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
e510: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
e520: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
e530: 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
e540: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
e550: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
e560: 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
e570: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
e580: 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
e590: 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
e5a0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
e5b0: 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
e5c0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
e5d0: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
e5e0: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
e5f0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
e600: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
e610: 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
e620: 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
e630: 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
e640: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
e650: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e660: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
e670: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
e680: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
e6b0: 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
e6c0: 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
e6d0: 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
e6e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
e6f0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
e700: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
e710: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
e720: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
e730: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
e740: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
e750: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
e760: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
e770: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
e780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e790: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
e7a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e7b0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
e7c0: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
e7d0: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
e7e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e7f0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e800: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
e810: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
e820: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
e830: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
e840: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
e850: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
e860: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
e870: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e880: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e890: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
e8a0: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
e8b0: 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
e8c0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
e8d0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
e8e0: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
e8f0: 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
e900: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
e910: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e920: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e930: 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
e940: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
e950: 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
e960: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e970: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
e980: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
e990: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
e9a0: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
e9b0: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
e9c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e9d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
e9e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
e9f0: 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
ea00: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
ea10: 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
ea20: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
ea30: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
ea40: 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
ea50: 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
ea60: 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
ea70: 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
ea80: 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
ea90: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
eaa0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
eab0: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
eac0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ead0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
eae0: 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
eaf0: 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
eb00: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
eb10: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
eb20: 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
eb30: 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
eb40: 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
eb50: 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
eb60: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
eb70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
eb80: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
eb90: 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
eba0: 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
ebb0: 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
ebc0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
ebd0: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
ebe0: 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
ebf0: 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
ec00: 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
ec10: 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
ec20: 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
ec30: 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
ec40: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
ec50: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
ec60: 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
ec70: 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
ec80: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
ec90: 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
eca0: 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
ecb0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
ecc0: 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
ecd0: 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
ece0: 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
ecf0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
ed00: 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
ed10: 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
ed20: 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
ed30: 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
ed40: 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
ed50: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
ed60: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
ed70: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
ed80: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
ed90: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
eda0: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
edb0: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
edc0: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
edd0: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
ede0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
edf0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
ee00: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
ee10: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
ee20: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
ee30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
ee40: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
ee50: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
ee60: 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
ee70: 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
ee80: 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
ee90: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
eea0: 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
eeb0: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
eec0: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
eed0: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
eee0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65  ->flags = MEM_Re
eef0: 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
ef00: 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
ef10: 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
ef20: 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
ef30: 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
ef40: 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
ef50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
ef60: 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
ef70: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
ef80: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
ef90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
efa0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
efb0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e   {.      int len
efc0: 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
efd0: 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
efe0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
eff0: 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
f000: 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
f010: 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
f020: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
f030: 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20  type&0x01 ){.   
f040: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f050: 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d   = MEM_Str | MEM
f060: 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65  _Ephem;.      }e
f070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
f080: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
f090: 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  lob | MEM_Ephem;
f0a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f0b0: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
f0c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f0d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65  .}../*.** The he
f0e0: 61 64 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64  ader of a record
f0f0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
f100: 65 71 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65  equence variable
f110: 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73  -length integers
f120: 2e 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67  ..** These integ
f130: 65 72 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  ers are almost a
f140: 6c 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20  lways small and 
f150: 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61  are encoded as a
f160: 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a   single byte..**
f170: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
f180: 61 63 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e  acro takes advan
f190: 74 61 67 65 20 74 68 69 73 20 66 61 63 74 20 74  tage this fact t
f1a0: 6f 20 70 72 6f 76 69 64 65 20 61 20 66 61 73 74  o provide a fast
f1b0: 20 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68   decode.** of th
f1c0: 65 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20  e integers in a 
f1d0: 72 65 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20  record header.  
f1e0: 49 74 20 69 73 20 66 61 73 74 65 72 20 66 6f 72  It is faster for
f1f0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
f200: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e  .** where the in
f210: 74 65 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c  teger is a singl
f220: 65 20 62 79 74 65 2e 20 20 49 74 20 69 73 20 61  e byte.  It is a
f230: 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77   little slower w
f240: 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67  hen the.** integ
f250: 65 72 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72  er is two or mor
f260: 65 20 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76  e bytes.  But ov
f270: 65 72 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74  erall it is fast
f280: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  er..**.** The fo
f290: 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
f2a0: 6f 6e 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ons are equivale
f2b0: 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20  nt:.**.**     x 
f2c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
f2d0: 6e 74 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a  nt32( A, &B );.*
f2e0: 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74  *.**     x = Get
f2f0: 56 61 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a  Varint( A, B );.
f300: 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65  **.*/.#define Ge
f310: 74 56 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28  tVarint(A,B)  ((
f320: 42 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20  B = *(A))<=0x7f 
f330: 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74  ? 1 : sqlite3Get
f340: 56 61 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29  Varint32(A, &B))
f350: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f360: 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
f370: 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
f380: 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
f390: 64 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ds specified by 
f3a0: 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  .** {nKey1, pKey
f3b0: 31 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70  1} and {nKey2, p
f3c0: 4b 65 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67  Key2}, returning
f3d0: 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
f3e0: 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
f3f0: 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65   integer if {nKe
f400: 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65  y1, pKey1} is le
f410: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
f420: 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
f430: 20 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b   than {nKey2, pK
f440: 65 79 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31  ey2}.  Both Key1
f450: 20 61 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62   and Key2 must b
f460: 65 20 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a  e byte strings.*
f470: 2a 20 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68  * composed by th
f480: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
f490: 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
f4a0: 42 45 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  BE..**.** Key1 a
f4b0: 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
f4c0: 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
f4d0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
f4e0: 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 42 75 74  f fields..** But
f4f0: 20 69 66 20 74 68 65 20 6c 65 6e 67 74 68 73 20   if the lengths 
f500: 64 69 66 66 65 72 2c 20 4b 65 79 32 20 6d 75 73  differ, Key2 mus
f510: 74 20 62 65 20 74 68 65 20 73 68 6f 72 74 65 72  t be the shorter
f520: 20 6f 66 20 74 68 65 20 74 77 6f 2e 0a 2a 2f 0a   of the two..*/.
f530: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
f540: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
f550: 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a  void *userData,.
f560: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
f570: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
f580: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
f590: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
f5a0: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ){.  KeyInfo *pK
f5b0: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66  eyInfo = (KeyInf
f5c0: 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75  o*)userData;.  u
f5d0: 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20  32 d1, d2;      
f5e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
f5f0: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
f600: 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
f610: 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64  /.  u32 idx1, id
f620: 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  x2;      /* Offs
f630: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
f640: 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
f650: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
f660: 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20  zHdr1, szHdr2;  
f670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
f680: 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
f690: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
f6a0: 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
f6b0: 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
f6c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f6d0: 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
f6e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
f6f0: 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Key1;.  const un
f700: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
f710: 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y2 = (const unsi
f720: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
f730: 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  2;..  Mem mem1;.
f740: 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65    Mem mem2;.  me
f750: 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
f760: 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
f770: 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
f780: 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
f790: 20 30 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d   0;.  mem2.enc =
f7a0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
f7b0: 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70 4b 65 79    mem2.db = pKey
f7c0: 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32  Info->db;.  mem2
f7d0: 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 0a 20  .flags = 0;.  . 
f7e0: 20 69 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e   idx1 = GetVarin
f7f0: 74 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  t(aKey1, szHdr1)
f800: 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
f810: 0a 20 20 69 64 78 32 20 3d 20 47 65 74 56 61 72  .  idx2 = GetVar
f820: 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72  int(aKey2, szHdr
f830: 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72  2);.  d2 = szHdr
f840: 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b  2;.  nField = pK
f850: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
f860: 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
f870: 48 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48  Hdr1 && idx2<szH
f880: 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73  dr2 ){.    u32 s
f890: 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20  erial_type1;.   
f8a0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
f8b0: 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  2;..    /* Read 
f8c0: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
f8d0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
f8e0: 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
f8f0: 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
f900: 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65  = GetVarint( aKe
f910: 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
f920: 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
f930: 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
f940: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
f950: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
f960: 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
f970: 20 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56      idx2 += GetV
f980: 61 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78  arint( aKey2+idx
f990: 32 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20  2, serial_type2 
f9a0: 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e  );.    if( d2>=n
f9b0: 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56  Key2 && sqlite3V
f9c0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f9d0: 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30  (serial_type2)>0
f9e0: 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
f9f0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
fa00: 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
fa10: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
fa20: 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
fa30: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
fa40: 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
fa50: 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  pe1, &mem1);.   
fa60: 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d2 += sqlite3Vd
fa70: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
fa80: 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74  y2[d2], serial_t
fa90: 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20  ype2, &mem2);.. 
faa0: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
fab0: 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
fac0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
fad0: 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
fae0: 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64   &mem2, i<nField
faf0: 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
fb00: 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
fb10: 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 26 4d  if( mem1.flags&M
fb20: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
fb30: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
fb40: 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20 6d  mem1);.    if( m
fb50: 65 6d 32 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79  em2.flags&MEM_Dy
fb60: 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  n ) sqlite3VdbeM
fb70: 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29  emRelease(&mem2)
fb80: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
fb90: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
fba0: 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
fbb0: 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20   }..  /* One of 
fbc0: 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
fbd0: 20 6f 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20   of fields, but 
fbe0: 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
fbf0: 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a  p to that point.
fc00: 20 20 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e    ** were equal.
fc10: 20 49 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20   If the incrKey 
fc20: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
fc30: 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65  en the second ke
fc40: 79 20 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65  y is.  ** treate
fc50: 64 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a  d as larger..  *
fc60: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  /.  if( rc==0 ){
fc70: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66  .    if( pKeyInf
fc80: 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20  o->incrKey ){.  
fc90: 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
fca0: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 4b 65 79   }else if( !pKey
fcb0: 49 6e 66 6f 2d 3e 70 72 65 66 69 78 49 73 45 71  Info->prefixIsEq
fcc0: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ual ){.      if(
fcd0: 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20   d1<nKey1 ){.   
fce0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
fcf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c     }else if( d2<
fd00: 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20 20  nKey2 ){.       
fd10: 20 72 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 4f 6e   rc = -1;  /* On
fd20: 6c 79 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63  ly occurs on a c
fd30: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
fd40: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  file */.      }.
fd50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
fd60: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
fd70: 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
fd80: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20  Info->nField.   
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
fda0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
fdb0: 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
fdc0: 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
fdd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fde0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
fdf0: 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  is an index entr
fe00: 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67  y composed using
fe10: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
fe20: 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68  rd opcode..** Th
fe30: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
fe40: 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75  this record shou
fe50: 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
fe60: 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a   (specifically.*
fe70: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77  * an integer row
fe80: 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  id).  This routi
fe90: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
fea0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
feb0: 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65  n.** that intege
fec0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
fed0: 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
fee0: 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29  (const u8 *aKey)
fef0: 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  {.  u32 szHdr;  
ff00: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ff10: 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
ff20: 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
ff30: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
ff40: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
ff50: 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  /..  sqlite3GetV
ff60: 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 26 73  arint32(aKey, &s
ff70: 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  zHdr);.  sqlite3
ff80: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  GetVarint32(&aKe
ff90: 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70  y[szHdr-1], &typ
ffa0: 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  eRowid);.  retur
ffb0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  n sqlite3VdbeSer
ffc0: 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
ffd0: 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a  owid);.}.  ../*.
ffe0: 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
fff0: 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
10000 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
10010 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
10020 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
10030 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
10040 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
10050 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
10060 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
10070 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
10080 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
10090 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
100a0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
100b0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
100c0 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
100d0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
100e0 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
100f0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
10100 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
10110 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
10120 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10130 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
10140 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
10150 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
10160 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
10170 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
10180 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10190 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
101a0 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  , v;..  sqlite3B
101b0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
101c0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
101d0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
101e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
101f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
10200 54 3b 0a 20 20 7d 0a 20 20 6d 2e 66 6c 61 67 73  T;.  }.  m.flags
10210 20 3d 20 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30   = 0;.  m.db = 0
10220 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10230 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
10240 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
10250 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
10260 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
10270 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c  rn rc;.  }.  sql
10280 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
10290 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72  (u8*)m.z, &szHdr
102a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
102b0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
102c0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70  z[szHdr-1], &typ
102d0 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f  eRowid);.  lenRo
102e0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
102f0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
10300 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  ypeRowid);.  sql
10310 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
10320 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
10330 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
10340 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
10350 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
10360 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
10370 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
10380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10390 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
103a0 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
103b0 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
103c0 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
103d0 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  t to against.** 
103e0 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
103f0 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74  n pKey (of lengt
10400 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20  h nKey).  Write 
10410 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
10420 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
10430 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
10440 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
10450 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
10460 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
10470 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79  reater than pKey
10480 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
10490 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
104a0 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69  **.** pKey is ei
104b0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
104c0 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
104d0 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
104e0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
104f0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
10500 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
10510 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
10520 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
10530 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
10540 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   well..*/.int sq
10550 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
10560 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72  ompare(.  Cursor
10570 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
10580 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
10590 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
105a0 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20  gainst */.  int 
105b0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nKey, const u8 *
105c0 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b  pKey,   /* The k
105d0 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ey to compare */
105e0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10600 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
10610 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
10620 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
10630 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
10640 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
10650 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
10660 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e  ursor;.  int len
10670 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  Rowid;.  Mem m;.
10680 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
10690 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
106a0 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
106b0 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20  CellKey<=0 ){.  
106c0 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
106d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
106e0 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d 20 30  ;.  }.  m.db = 0
106f0 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b  ;.  m.flags = 0;
10700 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10710 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
10720 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
10730 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
10740 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
10750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10760 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
10770 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
10780 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a  dLen((u8*)m.z);.
10790 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
107a0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
107b0 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  e(pC->pKeyInfo, 
107c0 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e  m.n-lenRowid, m.
107d0 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  z, nKey, pKey);.
107e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
107f0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
10800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
10820 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
10830 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
10840 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
10850 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
10860 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
10870 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10880 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
10890 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
108a0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
108b0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
108c0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
108d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
108e0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
108f0 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
10900 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
10910 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
10920 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
10930 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
10940 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
10950 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
10960 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
10970 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
10980 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
10990 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
109a0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
109b0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
109c0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
109d0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
109e0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
109f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10a00 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
10a10 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
10a20 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
10a30 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
10a40 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
10a50 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
10a60 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
10a70 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
10a80 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
10a90 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
10aa0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
10ab0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
10ac0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
10ad0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
10ae0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
10af0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
10b00 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
10b10 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
10b20 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
10b30 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
10b40 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
10b50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
10b60 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
10b70 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
10b80 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
10b90 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
10ba0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
10bb0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
10bc0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
10bd0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
10be0 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
10bf0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
10c00 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
10c10 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
10c20 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
10c30 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
10c40 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
10c50 2d 3e 64 62 3b 0a 7d 0a                          ->db;.}.