/ Hex Artifact Content
Login

Artifact f31d1dbbbf98eadf0a616829d0d1456a96079316:


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 52 65 74 75 72  }.}../*.** Retur
1770: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1780: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1790: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
17a0: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
17b0: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
17c0: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
17d0: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
17e0: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
17f0: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
1800: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
1810: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
1820: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
1830: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
1840: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
1850: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
1860: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
1870: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1880: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1890: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
18a0: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
18b0: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
18c0: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
18d0: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
18e0: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
18f0: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
1900: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
1910: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
1920: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
1930: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
1940: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
1950: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
1960: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
1970: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1980: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1990: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
19a0: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
19b0: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
19c0: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
19d0: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
19e0: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
19f0: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
1a00: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
1a10: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
1a20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
1a30: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
1a40: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
1a50: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
1a60: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
1a70: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1a80: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1a90: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1aa0: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1ab0: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1ac0: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1ad0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
1ae0: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
1af0: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
1b00: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
1b10: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
1b20: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
1b30: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
1b40: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
1b50: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
1b60: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
1b70: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1b80: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1b90: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1ba0: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1bb0: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1bc0: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1bd0: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
1be0: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
1bf0: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
1c00: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 28 28 75  SH_MASK_0 + (((u
1c10: 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d  nsigned)NOPUSH_M
1c20: 41 53 4b 5f 31 29 3c 3c 31 36 29 2c 0a 20 20 20  ASK_1)<<16),.   
1c30: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20 2b   NOPUSH_MASK_2 +
1c40: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1c50: 55 53 48 5f 4d 41 53 4b 5f 33 29 3c 3c 31 36 29  USH_MASK_3)<<16)
1c60: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1c70: 4b 5f 34 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_4 + (((unsigne
1c80: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 29  d)NOPUSH_MASK_5)
1c90: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1ca0: 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 28 28 75 6e  H_MASK_6 + (((un
1cb0: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1cc0: 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_7)<<16),.    
1cd0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1ce0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1cf0: 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c 31 36 29 0a  SH_MASK_9)<<16).
1d00: 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f    };.  assert( o
1d10: 70 3c 33 32 2a 35 20 29 3b 0a 20 20 72 65 74 75  p<32*5 );.  retu
1d20: 72 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d  rn (masks[op>>5]
1d30: 20 26 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29   & (1<<(op&0x1F)
1d40: 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ));.}..#ifndef N
1d50: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1d60: 33 56 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73  3VdbeOpcodeNoPus
1d70: 68 28 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75  h(u8 op){.  retu
1d80: 72 6e 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28  rn opcodeNoPush(
1d90: 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  op);.}.#endif../
1da0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
1db0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
1dc0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
1dd0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
1de0: 61 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73  ative..** Each s
1df0: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1e00: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1e10: 68 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  he label by sett
1e20: 69 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61  ing the P2.** va
1e30: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
1e40: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
1e50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1e60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1e70: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
1e80: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
1e90: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
1ea0: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1eb0: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1ec0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1ed0: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1ee0: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1ef0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
1f00: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
1f10: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
1f20: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
1f30: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
1f40: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
1f50: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
1f60: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
1f70: 54 68 65 20 69 6e 74 65 67 65 72 20 2a 70 4d 61  The integer *pMa
1f80: 78 53 74 61 63 6b 20 69 73 20 73 65 74 20 74 6f  xStack is set to
1f90: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
1fa0: 62 65 72 20 6f 66 20 76 64 62 65 20 73 74 61 63  ber of vdbe stac
1fb0: 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  k.** entries tha
1fc0: 74 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  t static analysi
1fd0: 73 20 72 65 76 65 61 6c 73 20 74 68 69 73 20 70  s reveals this p
1fe0: 72 6f 67 72 61 6d 20 6d 69 67 68 74 20 6e 65 65  rogram might nee
1ff0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2000: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
2010: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  the following op
2020: 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20  timization:  It 
2030: 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73  scans for.** ins
2040: 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  tructions that m
2050: 69 67 68 74 20 63 61 75 73 65 20 61 20 73 74 61  ight cause a sta
2060: 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  tement rollback.
2070: 20 20 53 75 63 68 20 69 6e 73 74 72 75 63 74 69    Such instructi
2080: 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a  ons.** are:.**.*
2090: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77  *   *  OP_Halt w
20a0: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
20b0: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
20c0: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
20d0: 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20    OP_Destroy.** 
20e0: 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a    *  OP_VUpdate.
20f0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61  **   *  OP_VRena
2100: 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  me.**.** If no s
2110: 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  uch instruction 
2120: 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65  is found, then e
2130: 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74 20 69  very Statement i
2140: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69  nstruction .** i
2150: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e  s changed to a N
2160: 6f 6f 70 2e 20 20 49 6e 20 74 68 69 73 20 77 61  oop.  In this wa
2170: 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65 61  y, we avoid crea
2180: 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ting the stateme
2190: 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  nt .** journal f
21a0: 69 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c  ile unnecessaril
21b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
21c0: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
21d0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
21e0: 70 4d 61 78 46 75 6e 63 41 72 67 73 2c 20 69 6e  pMaxFuncArgs, in
21f0: 74 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20  t *pMaxStack){. 
2200: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d   int i;.  int nM
2210: 61 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e  axArgs = 0;.  in
2220: 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d  t nMaxStack = p-
2230: 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b  >nOp;.  Op *pOp;
2240: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
2250: 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e   p->aLabel;.  in
2260: 74 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52  t doesStatementR
2270: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69  ollback = 0;.  i
2280: 6e 74 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  nt hasStatementB
2290: 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  egin = 0;.  for(
22a0: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d  pOp=p->aOp, i=p-
22b0: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >nOp-1; i>=0; i-
22c0: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75  -, pOp++){.    u
22d0: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  8 opcode = pOp->
22e0: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28  opcode;..    if(
22f0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
2300: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
2310: 4f 50 5f 41 67 67 53 74 65 70 20 0a 23 69 66 6e  OP_AggStep .#ifn
2320: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2330: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2340: 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d       || opcode==
2350: 4f 50 5f 56 55 70 64 61 74 65 0a 23 65 6e 64 69  OP_VUpdate.#endi
2360: 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  f.    ){.      i
2370: 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41  f( pOp->p2>nMaxA
2380: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2390: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 0a   pOp->p2;.    }.
23a0: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
23b0: 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20 20  OP_Halt ){.     
23c0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51   if( pOp->p1==SQ
23d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23e0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
23f0: 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
2400: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
2410: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
2420: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2430: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74   opcode==OP_Stat
2440: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68  ement ){.      h
2450: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
2460: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
2470: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
2480: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
2490: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
24a0: 6c 62 61 63 6b 20 3d 20 31 3b 0a 23 69 66 6e 64  lback = 1;.#ifnd
24b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
24c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
24d0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
24e0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
24f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
2500: 6d 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73  me ){.      does
2510: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
2520: 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  k = 1;.    }else
2530: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2540: 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  VFilter ){.     
2550: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73   int n;.      as
2560: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
2570: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61   >= 3 );.      a
2580: 73 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e 6f  ssert( pOp[-2].o
2590: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65  pcode==OP_Intege
25a0: 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70  r );.      n = p
25b0: 4f 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-2].p1;.     
25c0: 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20   if( n>nMaxArgs 
25d0: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a  ) nMaxArgs = n;.
25e0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
25f0: 20 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73   if( opcodeNoPus
2600: 68 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20  h(opcode) ){.   
2610: 20 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a     nMaxStack--;.
2620: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2630: 4f 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74  Op->p2>=0 ) cont
2640: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2650: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
2660: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f  nLabel );.    pO
2670: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
2680: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a  1-pOp->p2];.  }.
2690: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26a0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
26b0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
26c0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
26d0: 4d 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78  MaxArgs;.  *pMax
26e0: 53 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63  Stack = nMaxStac
26f0: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e  k;..  /* If we n
2700: 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20  ever rollback a 
2710: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2720: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74  ction, then stat
2730: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
2740: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
2750: 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e  needed.  So chan
2760: 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74  ge every OP_Stat
2770: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64  ement.  ** opcod
2780: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  e into an OP_Noo
2790: 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61  p.  This avoid a
27a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
27b0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
27c0: 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e  ).  ** which can
27d0: 20 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e   be expensive on
27e0: 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e   some platforms.
27f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53  .  */.  if( hasS
2800: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26  tatementBegin &&
2810: 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52   !doesStatementR
2820: 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66  ollback ){.    f
2830: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
2840: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
2850: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
2860: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2870: 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e  ode==OP_Statemen
2880: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  t ){.        pOp
2890: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
28a0: 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
28b0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
28c0: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
28d0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
28e0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
28f0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
2900: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2910: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
2920: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
2930: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2940: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
2950: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
2960: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
2970: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
2980: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
2990: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
29a0: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
29b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
29c0: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
29d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
29e0: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
29f0: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
2a00: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
2a10: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
2a20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2a30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2a40: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
2a50: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
2a60: 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  nOpAlloc ){.    
2a70: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
2a80: 20 70 2d 3e 6e 4f 70 2a 32 20 2b 20 6e 4f 70 29   p->nOp*2 + nOp)
2a90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64  ;.  }.  if( p->d
2aa0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ab0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2ac0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
2ad0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e  >nOp;.  if( nOp>
2ae0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
2af0: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
2b00: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
2b10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b20: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
2b30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
2b40: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
2b50: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
2b60: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
2b70: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
2b80: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
2b90: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
2ba0: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
2bb0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c    pOut->p2 = p2<
2bc0: 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28  0 ? addr + ADDR(
2bd0: 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20  p2) : p2;.      
2be0: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
2bf0: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
2c00: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
2c10: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
2c20: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
2c30: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
2c40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c50: 55 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  UG.      if( sql
2c60: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
2c70: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  trace ){.       
2c80: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
2c90: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
2ca0: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
2cb0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2cc0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
2cd0: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
2ce0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2cf0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2d00: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
2d10: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
2d20: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
2d30: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
2d40: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
2d50: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
2d60: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
2d70: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
2d80: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
2d90: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
2da0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
2db0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
2dc0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
2dd0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
2de0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2df0: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69  ngeP1(Vdbe *p, i
2e00: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
2e10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
2e20: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2e30: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2e40: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64  ;.  if( p && add
2e50: 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61  r>=0 && p->nOp>a
2e60: 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ddr && p->aOp ){
2e70: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
2e80: 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p1 = val;.  }.
2e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2ea0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2eb0: 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P2 operand for 
2ec0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
2ed0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2ee0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2ef0: 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20  l for setting a 
2f00: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
2f10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f20: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
2f30: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2f40: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2f50: 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20  ert( val>=0 );. 
2f60: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2f70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2f80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2f90: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2fa0: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2fb0: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2fc0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
2fd0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2fe0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2ff0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
3000: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3010: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3020: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3030: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3040: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3050: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3060: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3070: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
3080: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3090: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
30a0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
30b0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
30c0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
30d0: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
30e0: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
30f0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
3100: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
3110: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3120: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
3130: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
3140: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
3150: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3160: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3170: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3180: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
3190: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
31a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
31b0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
31c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
31d0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
31e0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
31f0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
3200: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
3210: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
3220: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
3230: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
3240: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
3250: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
3260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3270: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3280: 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a  nction(FuncDef *
3290: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65  pDef){.  if( pDe
32a0: 66 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  f && (pDef->flag
32b0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
32c0: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
32d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
32e0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ef);.  }.}../*.*
32f0: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
3300: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
3310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3320: 20 66 72 65 65 50 34 28 69 6e 74 20 70 34 74 79   freeP4(int p4ty
3330: 70 65 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20  pe, void *p3){. 
3340: 20 69 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73   if( p3 ){.    s
3350: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
3360: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
3370: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
3380: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
3390: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
33a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
33b0: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
33c0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20  se P4_KEYINFO:. 
33d0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
33e0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a  INFO_HANDOFF: {.
33f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3400: 66 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20  free(p3);.      
3410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3420: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
3430: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
3440: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
3450: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
3460: 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20  nc *)p3;.       
3470: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3480: 6e 63 74 69 6f 6e 28 70 56 64 62 65 46 75 6e 63  nction(pVdbeFunc
3490: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  ->pFunc);.      
34a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
34b0: 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65  eteAuxData(pVdbe
34c0: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  Func, 0);.      
34d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34e0: 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20  VdbeFunc);.     
34f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3500: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3510: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
3520: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
3530: 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44 65  Function((FuncDe
3540: 66 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20  f*)p3);.        
3550: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3560: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d       case P4_MEM
3570: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
3580: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
3590: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29  lite3_value*)p3)
35a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   }.}.../*.** Cha
35d0: 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74  nge N opcodes st
35e0: 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74  arting at addr t
35f0: 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69  o No-ops..*/.voi
3600: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3610: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
3620: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3630: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
3640: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64  p->aOp ){.    Vd
3650: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
3660: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 77  aOp[addr];.    w
3670: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
3680: 20 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70     freeP4(pOp->p
3690: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
36a0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
36b0: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
36c0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70  Op[0]));.      p
36d0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
36e0: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b  Noop;.      pOp+
36f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
3700: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3710: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
3720: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
3730: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
3740: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
3750: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
3760: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
3770: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
3780: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
3790: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
37a0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
37b0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
37c0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
37d0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
37e0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
37f0: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
3800: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
3810: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
3820: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
3830: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
3840: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
3850: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
3860: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3870: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
3880: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
3890: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
38a0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
38b0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
38c0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
38d0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
38e0: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
38f0: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
3900: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
3910: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
3920: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
3930: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
3940: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
3950: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
3960: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
3970: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
3980: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
3990: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
39a0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
39b0: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
39c0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
39d0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
39e0: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
39f0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
3a00: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
3a10: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
3a20: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
3a30: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3a40: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
3a50: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
3a60: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
3a70: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
3a80: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
3a90: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
3aa0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
3ab0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
3ac0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
3ad0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
3ae0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
3af0: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
3b00: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
3b10: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
3b20: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
3b30: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
3b40: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
3b50: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
3b60: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
3b70: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
3b80: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
3b90: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
3ba0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3bb0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
3bc0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
3bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3be0: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
3bf0: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
3c00: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
3c10: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  .  Op *pOp;.  as
3c20: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
3c30: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3c40: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
3c50: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d   p==0 || p->aOp=
3c60: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
3c70: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
3c80: 20 69 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59   if (n != P4_KEY
3c90: 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72  INFO) {.      fr
3ca0: 65 65 50 34 28 6e 2c 20 28 76 6f 69 64 2a 29 2a  eeP4(n, (void*)*
3cb0: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
3cc0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b     }.    return;
3cd0: 0a 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c  .  }.  if( addr<
3ce0: 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f  0 || addr>=p->nO
3cf0: 70 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  p ){.    addr = 
3d00: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20  p->nOp - 1;.    
3d10: 69 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74  if( addr<0 ) ret
3d20: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  urn;.  }.  pOp =
3d30: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
3d40: 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34    freeP4(pOp->p4
3d50: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
3d60: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
3d70: 30 3b 0a 20 20 69 66 28 20 7a 50 34 3d 3d 30 20  0;.  if( zP4==0 
3d80: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
3d90: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
3da0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
3db0: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
3dc0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
3dd0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
3de0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
3df0: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
3e00: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
3e10: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
3e20: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
3e30: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
3e40: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
3e50: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
3e60: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
3e70: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
3e80: 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  fo = sqlite3_mal
3e90: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
3ea0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 63    pOp->p4.p = (c
3eb0: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 3b 0a 20  har*)pKeyInfo;. 
3ec0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
3ed0: 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  ){.      unsigne
3ee0: 64 20 63 68 61 72 20 2a 61 53 6f 72 74 4f 72 64  d char *aSortOrd
3ef0: 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  er;.      memcpy
3f00: 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20  (pKeyInfo, zP4, 
3f10: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 53  nByte);.      aS
3f20: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49  ortOrder = pKeyI
3f30: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b  nfo->aSortOrder;
3f40: 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74  .      if( aSort
3f50: 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Order ){.       
3f60: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
3f70: 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65  Order = (unsigne
3f80: 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66  d char*)&pKeyInf
3f90: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d  o->aColl[nField]
3fa0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
3fb0: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  (pKeyInfo->aSort
3fc0: 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65  Order, aSortOrde
3fd0: 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  r, nField);.    
3fe0: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70    }.      pOp->p
3ff0: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
4000: 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  FO;.    }else{. 
4010: 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c       p->db->mall
4020: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
4030: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
4040: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
4050: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
4060: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P4_KEYINFO_HA
4070: 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70  NDOFF ){.    pOp
4080: 2d 3e 70 34 2e 70 20 3d 20 28 63 68 61 72 2a 29  ->p4.p = (char*)
4090: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
40a0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
40b0: 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  O;.  }else if( n
40c0: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
40d0: 34 2e 70 20 3d 20 28 63 68 61 72 2a 29 7a 50 34  4.p = (char*)zP4
40e0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
40f0: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
4100: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
4110: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34 29 3b 0a   = strlen(zP4);.
4120: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
4130: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
4140: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
4150: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
4160: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
4170: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
4180: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  EBUG./*.** Chang
4190: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
41a0: 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65   the the most re
41b0: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
41c0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
41d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
41e0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
41f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4200: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
4210: 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28  st ap;.  assert(
4220: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
4230: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
4240: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
4250: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4260: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
4270: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
4280: 69 6c 65 64 20 29 3b 0a 20 20 76 61 5f 73 74 61  iled );.  va_sta
4290: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
42a0: 0a 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  .  p->aOp[p->nOp
42b0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
42c0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
42d0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
42e0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
42f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4300: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
4310: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
4320: 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65  address..*/.Vdbe
4330: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
4340: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
4350: 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72  t addr){.  asser
4360: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
4370: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
4380: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
4390: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
43a0: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
43b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
43c0: 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20  eturn ((addr>=0 
43d0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f  && addr<p->nOp)?
43e0: 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a  (&p->aOp[addr]):
43f0: 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  0);.}..#if !defi
4400: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4410: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
4420: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
4430: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
4440: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
4450: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
4460: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
4470: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
4480: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
4490: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
44a0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
44b0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
44c0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
44d0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
44e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
44f0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
4500: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
4510: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
4520: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
4530: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
4540: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
4550: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
4560: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
4570: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
4580: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
4590: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
45a0: 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f  o = (KeyInfo*)pO
45b0: 70 2d 3e 70 34 2e 70 3b 0a 20 20 20 20 20 20 73  p->p4.p;.      s
45c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
45d0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
45e0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
45f0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4600: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4610: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4620: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4630: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4640: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4650: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4660: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
4670: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
4680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4690: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
46a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
46b0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
46c0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
46d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
46e0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4700: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4710: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4720: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4730: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4740: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4750: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4760: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
4770: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4780: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
4790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
47a0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
47b0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
47c0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
47d0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
47e0: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
47f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4800: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4810: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4820: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4840: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4850: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4860: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
4870: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
4880: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
4890: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
48a0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
48b0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
48c0: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
48d0: 2a 29 70 4f 70 2d 3e 70 34 2e 70 3b 0a 20 20 20  *)pOp->p4.p;.   
48e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
48f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4900: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
4910: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
4920: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4930: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4940: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
4950: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
4960: 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70   = (FuncDef*)pOp
4970: 2d 3e 70 34 2e 70 3b 0a 20 20 20 20 20 20 73 71  ->p4.p;.      sq
4980: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4990: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
49a0: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
49b0: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
49c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
49e0: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
49f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4a00: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4a10: 6c 6c 64 22 2c 20 2a 28 73 71 6c 69 74 65 33 5f  lld", *(sqlite3_
4a20: 69 6e 74 36 34 2a 29 70 4f 70 2d 3e 70 34 2e 70  int64*)pOp->p4.p
4a30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4a50: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
4a60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4a70: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4a80: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
4a90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4aa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4ab0: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
4ac0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4ad0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4ae0: 2e 31 36 67 22 2c 20 2a 28 64 6f 75 62 6c 65 2a  .16g", *(double*
4af0: 29 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20  )pOp->p4.p);.   
4b00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4b10: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
4b20: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
4b30: 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 4f 70 2d 3e  em = (Mem*)pOp->
4b40: 70 34 2e 70 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.p;.      if( 
4b50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4b60: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
4b70: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
4b80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4b90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4ba0: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
4bb0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4bc0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4bd0: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
4be0: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
4bf0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4c00: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
4c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4c20: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4c30: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
4c40: 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65  em->r);.      }e
4c50: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
4c60: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
4c70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4c80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4c90: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
4ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
4cc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4cd0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4ce0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
4cf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4d00: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 73  vtab *pVtab = (s
4d10: 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 4f 70  qlite3_vtab*)pOp
4d20: 2d 3e 70 34 2e 70 3b 0a 20 20 20 20 20 20 73 71  ->p4.p;.      sq
4d30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4d40: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
4d50: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
4d60: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
4d70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4d80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4d90: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4da0: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
4db0: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  p;.      if( zP4
4dc0: 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  ==0 || pOp->opco
4dd0: 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  de==OP_Noop ){. 
4de0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
4df0: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
4e00: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
4e10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
4e20: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
4e30: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
4e40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
4e50: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
4e60: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
4e70: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
4e80: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
4e90: 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  *.*/.void sqlite
4ea0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
4eb0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
4ec0: 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73    int mask;.  as
4ed0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4ee0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p->db->nDb );.  
4ef0: 61 73 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66  assert( i<sizeof
4f00: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38  (p->btreeMask)*8
4f10: 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c   );.  mask = 1<<
4f20: 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72  i;.  if( (p->btr
4f30: 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  eeMask & mask)==
4f40: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65  0 ){.    p->btre
4f50: 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
4f60: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
4f70: 75 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 28  utexArrayInsert(
4f80: 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64  &p->aMutex, p->d
4f90: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
4fa0: 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69    }.}...#if defi
4fb0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
4fc0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4fd0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
4fe0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
4ff0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
5000: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
5010: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
5020: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5030: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
5040: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
5050: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
5060: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
5070: 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69  Ptr[50];.  stati
5080: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
5090: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
50a0: 31 33 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e  13s %4d %4d %s\n
50b0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
50c0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
50d0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
50e0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
50f0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
5100: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
5110: 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20 20 70 63  ormat1,.      pc
5120: 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  , sqlite3OpcodeN
5130: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
5140: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
5150: 70 32 2c 20 7a 50 34 29 3b 0a 20 20 66 66 6c 75  p2, zP4);.  fflu
5160: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
5170: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
5180: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
5190: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
51a0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
51b0: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
51c0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
51d0: 28 20 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ( p ){.    while
51e0: 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20  ( N-->0 ){.     
51f0: 20 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20   assert( N<2 || 
5200: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
5210: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5220: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
5230: 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p++);.    }.  }.
5240: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
5250: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
5260: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
5270: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
5280: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
5290: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
52a0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
52b0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
52c0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
52d0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
52e0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
52f0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
5300: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
5310: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
5320: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
5330: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
5340: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
5350: 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20  XPLAIN"..*/.int 
5360: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
5370: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5390: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
53a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
53b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
53c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
53d0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
53e0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
53f0: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
5400: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72  BE_MAGIC_RUN ) r
5410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
5420: 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64  USE;.  assert( d
5430: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
5440: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20  _MAGIC_BUSY );. 
5450: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
5460: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
5470: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
5480: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
5490: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
54a0: 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79   does not put dy
54b0: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e  namic strings on
54c0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
54d0: 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20  stack, they may 
54e0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
54f0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
5500: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
5510: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
5520: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
5530: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
5540: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
5550: 69 66 28 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  if( p->pResultSe
5560: 74 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  t ){.    release
5570: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 70 52 65 73  MemArray(p->pRes
5580: 75 6c 74 53 65 74 2c 20 35 29 3b 0a 20 20 20 20  ultSet, 5);.    
5590: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
55a0: 30 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  0;.  }..  do{.  
55b0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
55c0: 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f   }while( i<p->nO
55d0: 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  p && p->explain=
55e0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
55f0: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
5600: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  in );.  if( i>=p
5610: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->nOp ){.    p->
5620: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5630: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5640: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
5650: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
5660: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
5670: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
5680: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
5690: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
56a0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
56b0: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
56c0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
56d0: 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  ->rc), (char*)0)
56e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
56f0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
5700: 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  [i];.    Mem *pM
5710: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
5720: 65 74 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a  et = p->aStack;.
5730: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
5740: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
5750: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5760: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
5770: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5780: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
5790: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
57c0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
57d0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
57e0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
57f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
5800: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
5810: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
5820: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
5830: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
5840: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
5850: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
5860: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
5870: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
5880: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
5890: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
58a0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
58b0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
58c0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
58d0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
58e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ++;.    }..    p
58f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5900: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
5910: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
5940: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
5950: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5960: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5970: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5980: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
5990: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
59a0: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
59c0: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
59d0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
59e0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
59f0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
5a00: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
5a10: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5a20: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
5a30: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5a40: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a60: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
5a70: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5a80: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
5a90: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
5aa0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5ab0: 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74  MEM_Ephem|MEM_St
5ac0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 20 20  r|MEM_Term;     
5ad0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P4 */.    pMe
5ae0: 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 34  m->z = displayP4
5af0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f  (pOp, pMem->zSho
5b00: 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  rt, sizeof(pMem-
5b10: 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 61  >zShort));.    a
5b20: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5b30: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
5b40: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5b50: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
5b60: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5b70: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
5b80: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
5b90: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5ba0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
5bb0: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
5bc0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
5bd0: 7c 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 68  |MEM_Term|MEM_Sh
5be0: 6f 72 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ort;.      pMem-
5bf0: 3e 6e 20 3d 20 73 70 72 69 6e 74 66 28 70 4d 65  >n = sprintf(pMe
5c00: 6d 2d 3e 7a 53 68 6f 72 74 2c 20 22 25 2e 32 78  m->zShort, "%.2x
5c10: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
5c20: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P5 */.      pM
5c30: 65 6d 2d 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 53  em->z = pMem->zS
5c40: 68 6f 72 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  hort;.      pMem
5c50: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5c60: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
5c70: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
5c80: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
5c90: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
5ca0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
5cb0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
5cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
5cd0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  ment */.      if
5ce0: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
5cf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
5d00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
5d10: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
5d20: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
5d30: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
5d40: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
5d50: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
5d60: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
5d70: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
5d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
5d90: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
5da0: 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70   = 8 - 5*(p->exp
5db0: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
5dc0: 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  pTos = pMem;.   
5dd0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5de0: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
5df0: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
5e00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
5e10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5e20: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
5e30: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5e40: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
5e50: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
5e60: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
5e70: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
5e80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5e90: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
5ea0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
5eb0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
5ec0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
5ed0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
5ee0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
5ef0: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
5f00: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
5f10: 70 20 26 26 20 70 4f 70 2d 3e 70 34 2e 70 21 3d  p && pOp->p4.p!=
5f20: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
5f30: 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34  har *z = pOp->p4
5f40: 2e 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  .p;.    while( i
5f50: 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20  sspace(*(u8*)z) 
5f60: 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74  ) z++;.    print
5f70: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
5f80: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
5f90: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
5fa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
5fb0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
5fc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
5fd0: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
5fe0: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
5ff0: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
6000: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
6010: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
6020: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
6030: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
6040: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
6050: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
6060: 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29 20  3_io_trace==0 ) 
6070: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
6080: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
6090: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f  pOp = &p->aOp[nO
60a0: 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p-1];.  if( pOp-
60b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70  >opcode==OP_Noop
60c0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 70 21 3d 30   && pOp->p4.p!=0
60d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
60e0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
60f0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
6100: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
6110: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
6120: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 66 6f 72  ->p4.p);.    for
6130: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
6140: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
6150: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6160: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6170: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
6180: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
6190: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
61a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
61b0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
61c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
61d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
61e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61f0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
6200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6210: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
6220: 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 28  qlite3_io_trace(
6230: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
6240: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
6250: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
6260: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
6270: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
6280: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
6290: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
62a0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20   for execution. 
62b0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
62c0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
62d0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
62e0: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
62f0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
6300: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
6310: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
6320: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
6330: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
6340: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
6350: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
6360: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
6370: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73    .**.** This is
6380: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
6390: 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f   move a VDBE fro
63a0: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  m VDBE_MAGIC_INI
63b0: 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  T to.** VDBE_MAG
63c0: 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20  IC_RUN..*/.void 
63d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
63e0: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
6410: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  BE */.  int nVar
6420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6440: 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74   of '?' see in t
6450: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6460: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20   */.  int nMem, 
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6490: 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
64a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
64b0: 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20  int nCursor,    
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
64d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
64e0: 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ors to allocate 
64f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61  */.  int isExpla
6500: 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
6510: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6520: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
6530: 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a  rds is present *
6540: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
6550: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
6560: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
6570: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
6580: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
6590: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
65a0: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
65b0: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
65c0: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
65d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
65e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
65f0: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
6600: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
6610: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
6620: 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69  ter. This.   * i
6630: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
6640: 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72  ll to resizeOpAr
6650: 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20  ray() below may 
6660: 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20  shrink the.   * 
6670: 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74  p->aOp[] array t
6680: 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66  o save memory if
6690: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20   called when in 
66a0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a  VDBE_MAGIC_RUN .
66b0: 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a     * state..   *
66c0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
66d0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
66e0: 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74    /* No instruct
66f0: 69 6f 6e 20 65 76 65 72 20 70 75 73 68 65 73 20  ion ever pushes 
6700: 6d 6f 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67  more than a sing
6710: 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20  le element onto 
6720: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20  the.  ** stack. 
6730: 20 41 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e   And the stack n
6740: 65 76 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75  ever grows on su
6750: 63 63 65 73 73 69 76 65 20 65 78 65 63 75 74 69  ccessive executi
6760: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
6770: 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74  same loop.  So t
6780: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
6790: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
67a0: 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  is an upper boun
67b0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  d.  ** on the ma
67c0: 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74  ximum stack dept
67d0: 68 20 72 65 71 75 69 72 65 64 2e 20 20 28 41 64  h required.  (Ad
67e0: 64 65 64 20 6c 61 74 65 72 3a 29 20 20 54 68 65  ded later:)  The
67f0: 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56  .  ** resolveP2V
6800: 61 6c 75 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d  alues() call com
6810: 70 75 74 65 73 20 61 20 74 69 67 68 74 65 72 20  putes a tighter 
6820: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  upper bound on t
6830: 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 73 69  he.  ** stack si
6840: 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c  ze..  **.  ** Al
6850: 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65  location all the
6860: 20 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20   stack space we 
6870: 77 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a  will ever need..
6880: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53    */.  if( p->aS
6890: 74 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69  tack==0 ){.    i
68a0: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f  nt nArg;       /
68b0: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
68c0: 20 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20   of args passed 
68d0: 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69  to a user functi
68e0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
68f0: 53 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61  Stack;     /* Ma
6900: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
6910: 73 74 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65  stack entries re
6920: 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65  quired */.    re
6930: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
6940: 20 26 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29   &nArg, &nStack)
6950: 3b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  ;.    resizeOpAr
6960: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ray(p, p->nOp);.
6970: 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72      assert( nVar
6980: 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
6990: 74 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70  t( nStack<p->nOp
69a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78   );.    if( isEx
69b0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 6e  plain ){.      n
69c0: 53 74 61 63 6b 20 3d 20 31 30 3b 0a 20 20 20 20  Stack = 10;.    
69d0: 7d 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20  }.    p->aStack 
69e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
69f0: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
6a00: 20 20 6e 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28    nStack*sizeof(
6a10: 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20 20 20  p->aStack[0])   
6a20: 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20   /* aStack */.  
6a30: 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f      + nArg*sizeo
6a40: 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20  f(Mem*)         
6a50: 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f       /* apArg */
6a60: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
6a70: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
6a80: 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20          /* aVar 
6a90: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
6aa0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20  sizeof(char*)   
6ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56            /* azV
6ac0: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d  ar */.      + nM
6ad0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  em*sizeof(Mem)  
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6af0: 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aMem */.      + 
6b00: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43  nCursor*sizeof(C
6b10: 75 72 73 6f 72 2a 29 20 20 20 20 20 20 20 20 2f  ursor*)        /
6b20: 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29  * apCsr */.    )
6b30: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
6b40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6b50: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26       p->aMem = &
6b60: 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b  p->aStack[nStack
6b70: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  ];.      p->nMem
6b80: 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70   = nMem;.      p
6b90: 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65  ->aVar = &p->aMe
6ba0: 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70  m[nMem];.      p
6bb0: 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20  ->nVar = nVar;. 
6bc0: 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20       p->okVar = 
6bd0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  0;.      p->apAr
6be0: 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61  g = (Mem**)&p->a
6bf0: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
6c00: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61   p->azVar = (cha
6c10: 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41  r**)&p->apArg[nA
6c20: 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  rg];.      p->ap
6c30: 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29  Csr = (Cursor**)
6c40: 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b  &p->azVar[nVar];
6c50: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  .      p->nCurso
6c60: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20  r = nCursor;.   
6c70: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
6c80: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
6c90: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
6ca0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
6cb0: 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e         p->aVar[n
6cc0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
6cd0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30   }.      for(n=0
6ce0: 3b 20 6e 3c 6e 53 74 61 63 6b 3b 20 6e 2b 2b 29  ; n<nStack; n++)
6cf0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74  {.        p->aSt
6d00: 61 63 6b 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  ack[n].db = db;.
6d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6d20: 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70  }.  for(n=0; n<p
6d30: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
6d40: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
6d50: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
6d60: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
6d70: 20 3d 20 64 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d   = db;.  }..  p-
6d80: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
6d90: 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20  ck[-1];.  p->pc 
6da0: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
6db0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
6dc0: 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20  uniqueCnt = 0;. 
6dd0: 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20   p->returnDepth 
6de0: 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  = 0;.  p->errorA
6df0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
6e00: 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20  ;.  p->popStack 
6e10: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
6e20: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
6e30: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
6e40: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
6e50: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
6e60: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
6e70: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
6e80: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
6e90: 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61  ;.  p->openedSta
6ea0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64  tement = 0;.#ifd
6eb0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
6ec0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
6ed0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
6ee0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
6ef0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
6f00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
6f10: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
6f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6f30: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
6f40: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
6f50: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
6f60: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
6f70: 74 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73  t cursor happens
6f80: 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  .** to hold..*/.
6f90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6fa0: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
6fb0: 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29  *p, Cursor *pCx)
6fc0: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
6fd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
6fe0: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75  }.  if( pCx->pCu
6ff0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
7000: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
7010: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
7020: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  );.  }.  if( pCx
7030: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
7040: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
7050: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69  Cx->pBt);.  }.#i
7060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7070: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7080: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
7090: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
70a0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
70b0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
70c0: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
70d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
70e0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
70f0: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
7100: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
7110: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
7120: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
7130: 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d  f(p->db);.    pM
7140: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
7150: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
7160: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
7170: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69  p->db);.    p->i
7180: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
7190: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
71a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e  lite3_free(pCx->
71b0: 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  pData);.  sqlite
71c0: 33 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70  3_free(pCx->aTyp
71d0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
71e0: 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(pCx);.}../*.*
71f0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
7200: 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72 20 56  ors except for V
7210: 54 61 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  Tab cursors that
7220: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
7230: 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  * in use..*/.sta
7240: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
7250: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
7260: 74 69 76 65 56 74 61 62 73 28 56 64 62 65 20 2a  tiveVtabs(Vdbe *
7270: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
7280: 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29  f( p->apCsr==0 )
7290: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
72a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
72b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73  ; i++){.    Curs
72c0: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
72d0: 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  r[i];.    if( pC
72e0: 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d   && (!p->inVtabM
72f0: 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56  ethod || !pC->pV
7300: 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  tabCursor) ){.  
7310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
7320: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
7330: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
7340: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
7350: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
7360: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
7370: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
7380: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7390: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
73a0: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
73b0: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
73c0: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
73d0: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
73e0: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
73f0: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
7400: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
7410: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
7420: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
7430: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
7440: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7450: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29   if( p->aStack )
7460: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
7470: 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c  Array(p->aStack,
7480: 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20   1 + (p->pTos - 
7490: 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20  p->aStack));.   
74a0: 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61   p->pTos = &p->a
74b0: 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20  Stack[-1];.  }. 
74c0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
74d0: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
74e0: 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  s(p);.  releaseM
74f0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
7500: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c   p->nMem);.  sql
7510: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
7520: 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20  r(&p->sFifo);.  
7530: 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  if( p->contextSt
7540: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ack ){.    for(i
7550: 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74  =0; i<p->context
7560: 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a  StackTop; i++){.
7570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7580: 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63  eFifoClear(&p->c
7590: 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73  ontextStack[i].s
75a0: 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Fifo);.    }.   
75b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
75c0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a  >contextStack);.
75d0: 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74    }.  p->context
75e0: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  Stack = 0;.  p->
75f0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74  contextStackDept
7600: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  h = 0;.  p->cont
7610: 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b  extStackTop = 0;
7620: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7630: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
7640: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
7650: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
7660: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
7670: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
7680: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
7690: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
76a0: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
76b0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
76c0: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
76d0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
76e0: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
76f0: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
7700: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
7710: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
7720: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
7730: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
7740: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
7750: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
7760: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
7770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7780: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
7790: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
77a0: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
77b0: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
77c0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
77d0: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
77e0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
77f0: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
7800: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c  te3_free(p->aCol
7810: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
7820: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
7830: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
7840: 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b  mn = nResColumn;
7850: 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
7860: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
7870: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
7880: 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73 69 7a  cZero(p->db, siz
7890: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
78a0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
78b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
78c0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
78d0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
78e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
78f0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
7900: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
7910: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
7920: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7930: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
7940: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
7950: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
7960: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
7970: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
7980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
7990: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
79a0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
79b0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
79c0: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
79d0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
79e0: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
79f0: 2a 20 49 66 20 4e 3d 3d 50 34 5f 53 54 41 54 49  * If N==P4_STATI
7a00: 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  C  it means that
7a10: 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e   zName is a poin
7a20: 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e  ter to a constan
7a30: 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69  t static.** stri
7a40: 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75  ng and we can ju
7a50: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
7a60: 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50 34  ter. If it is P4
7a70: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a  _DYNAMIC, then .
7a80: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
7a90: 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
7aa0: 69 74 65 33 5f 66 72 65 65 28 29 20 77 68 65 6e  ite3_free() when
7ab0: 20 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e   the vdbe is fin
7ac0: 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74  ished with.** it
7ad0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62  . Otherwise, N b
7ae0: 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72  ytes of zName ar
7af0: 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74  e copied..*/.int
7b00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
7b10: 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20  olName(Vdbe *p, 
7b20: 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 76 61 72  int idx, int var
7b30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
7b40: 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ame, int N){.  i
7b50: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
7b60: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
7b70: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
7b80: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
7b90: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
7ba0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7bb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
7bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
7bd0: 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  M;.  assert( p->
7be0: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
7bf0: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
7c00: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
7c10: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
7c20: 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 34 5f 44  );.  if( N==P4_D
7c30: 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 34 5f  YNAMIC || N==P4_
7c40: 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63  STATIC ){.    rc
7c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
7c60: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
7c70: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
7c80: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
7c90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73  _STATIC);.  }els
7ca0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
7cb0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
7cc0: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
7cd0: 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , N, SQLITE_UTF8
7ce0: 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
7cf0: 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  T);.  }.  if( rc
7d00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e  ==SQLITE_OK && N
7d10: 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  ==P4_DYNAMIC ){.
7d20: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
7d30: 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d  ags = (pColName-
7d40: 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61  >flags&(~MEM_Sta
7d50: 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20  tic))|MEM_Dyn;. 
7d60: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65     pColName->xDe
7d70: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
7d80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7d90: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
7da0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
7db0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
7dc0: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
7dd0: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
7de0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
7df0: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
7e00: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
7e10: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
7e20: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
7e30: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
7e40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
7e50: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
7e60: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
7e70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7e80: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
7e90: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
7ea0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
7eb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
7ec0: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
7ed0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
7ee0: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
7ef0: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
7f00: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
7f10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7f20: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
7f30: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f   = 0;..  /* Befo
7f40: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
7f50: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
7f60: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
7f70: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
7f80: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
7f90: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
7fa0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
7fb0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
7fc0: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
7fd0: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
7fe0: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
7ff0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
8000: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
8010: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
8020: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
8030: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
8040: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
8050: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
8060: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
8070: 74 61 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b  tabSync(db, rc);
8080: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8090: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
80a0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
80b0: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
80c0: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
80d0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
80e0: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
80f0: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
8100: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
8110: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
8120: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
8130: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
8140: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
8150: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
8160: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
8170: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
8180: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
8190: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
81a0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
81b0: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
81c0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
81d0: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
81e0: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
81f0: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
8200: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
8210: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
8220: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
8230: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
8240: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
8250: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
8260: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
8270: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
8280: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
8290: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
82a0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
82b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
82c0: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
82d0: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
82e0: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
82f0: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
8300: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
8310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
8320: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
8330: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
8340: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
8350: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  mitArg);.    sql
8360: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
8370: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8380: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8390: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
83a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
83b0: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
83c0: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
83d0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
83e0: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
83f0: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
8400: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
8410: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
8420: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
8430: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
8440: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
8450: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
8460: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
8470: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
8480: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
8490: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
84a0: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
84b0: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
84c0: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
84d0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  .  In that case 
84e0: 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73  we do.  ** not s
84f0: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
8500: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
8510: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d  , so use the sim
8520: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20  ple case then.  
8530: 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ** too..  */.  i
8540: 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c  f( 0==strlen(sql
8550: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
8560: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
8570: 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c  pBt)) || nTrans<
8580: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =1 ){.    for(i=
8590: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
85a0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
85b0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
85c0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
85d0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
85e0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
85f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8600: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
8610: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
8620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
8630: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
8640: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
8650: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
8660: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
8670: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
8680: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
8690: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
86a0: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
86b0: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
86c0: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
86d0: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
86e0: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
86f0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
8700: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
8710: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
8720: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
8730: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
8740: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
8750: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
8760: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
8770: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8780: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8790: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
87a0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
87b0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
87c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
87d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
87e0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
87f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8800: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8810: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8820: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
8830: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
8840: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
8850: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
8860: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
8870: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
8880: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
8890: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
88a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
88b0: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
88c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
88d0: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
88e0: 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69  tomicly..  */.#i
88f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8900: 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
8910: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
8920: 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
8930: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  s;.    int needS
8940: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ync = 0;.    cha
8950: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
8960: 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
8970: 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
8980: 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
8990: 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
89a0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
89b0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
89c0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
89d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
89e0: 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
89f0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
8a00: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
8a10: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
8a20: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
8a30: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
8a40: 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73   random;.      s
8a50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
8a60: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
8a70: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
8a80: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
8a90: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
8aa0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
8ab0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
8ac0: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
8ad0: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
8ae0: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
8af0: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
8b00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8b10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8b20: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
8b30: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
8b40: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
8b50: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
8b60: 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  S) );..    /* Op
8b70: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
8b80: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63  urnal. */.    rc
8b90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
8ba0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
8bb0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
8bc0: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8bd0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
8be0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
8bf0: 45 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  E|.        SQLIT
8c00: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
8c10: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
8c20: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
8c30: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
8c40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8c50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8c60: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8c70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8c80: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
8c90: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
8ca0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
8cb0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
8cc0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
8cd0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
8ce0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
8cf0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8d00: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
8d10: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
8d20: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
8d40: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
8d50: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
8d60: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
8d70: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
8d80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
8d90: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
8da0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
8db0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
8dc0: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
8dd0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
8de0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8df0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
8e00: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8e10: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8e20: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
8e30: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
8e40: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
8e50: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
8e60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
8e70: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
8e80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8e90: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
8ea0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8eb0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
8ec0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
8ed0: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
8ee0: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
8ef0: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
8f00: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
8f10: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
8f20: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
8f30: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
8f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
8f50: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
8f60: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
8f70: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8f80: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
8f90: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c  strlen(zFile)+1,
8fa0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
8fb0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c    offset += strl
8fc0: 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  en(zFile)+1;.   
8fd0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8fe0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8ff0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9000: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
9010: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9020: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
9030: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
9040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9050: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
9060: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9070: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
9080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9090: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
90a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
90b0: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
90c0: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
90d0: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
90e0: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
90f0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9100: 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d  .    zMainFile =
9110: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
9120: 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  Dirname(db->aDb[
9130: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  0].pBt);.    if(
9140: 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20   (needSync .    
9150: 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74 65 33   && (0==(sqlite3
9160: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
9170: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
9180: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
9190: 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20 20 20  QUENTIAL)).     
91a0: 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73  && (rc=sqlite3Os
91b0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
91c0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
91d0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  ))!=SQLITE_OK) )
91e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
91f0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
9200: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
9210: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
9220: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
9230: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9240: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
9250: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9260: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
9270: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
9280: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
9290: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
92a0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
92b0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
92c0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
92d0: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
92e0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
92f0: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
9300: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
9310: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
9320: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9330: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
9340: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
9350: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
9360: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
9370: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
9380: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
9390: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
93a0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
93b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
93c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
93d0: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
93e0: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
93f0: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
9400: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
9410: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9420: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
9430: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
9440: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
9450: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
9460: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  re occured..    
9470: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9480: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
9490: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
94a0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
94b0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
94c0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
94d0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
94e0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
94f0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
9500: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
9510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9520: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
9530: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
9540: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9550: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
9560: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
9570: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9580: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
9590: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
95a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
95b0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
95c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
95d0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
95e0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
95f0: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
9600: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
9610: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
9620: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
9630: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
9640: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
9650: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
9660: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
9670: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
9680: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
9690: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
96a0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
96b0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
96c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
96d0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
96e0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
96f0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9700: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
9710: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
9720: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
9730: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
9740: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
9750: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
9760: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
9770: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
9780: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
9790: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
97a0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
97b0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
97c0: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
97d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
97e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
97f0: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
9800: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
9810: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
9820: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
9830: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
9840: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
9850: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
9860: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
9870: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
9880: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
9890: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
98a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
98b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
98c0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
98d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
98e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
98f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9900: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9910: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9920: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e    }.    }.    en
9930: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
9940: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
9950: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
9960: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
9970: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
9980: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
9990: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
99a0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
99b0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
99c0: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
99d0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
99e0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
99f0: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
9a00: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
9a10: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
9a20: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
9a30: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
9a40: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
9a50: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
9a60: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
9a70: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
9a80: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
9a90: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
9aa0: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
9ab0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
9ac0: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
9ad0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
9ae0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
9af0: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
9b00: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
9b10: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
9b20: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
9b30: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
9b40: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9b50: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
9b60: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
9b70: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
9b80: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
9b90: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
9ba0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
9bb0: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
9bc0: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  veVdbeCnt );.}.#
9bd0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
9be0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
9bf0: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
9c00: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
9c10: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
9c20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
9c30: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
9c40: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
9c50: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
9c60: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
9c70: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
9c80: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
9c90: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
9ca0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
9cb0: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
9cc0: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
9cd0: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
9ce0: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
9cf0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
9d00: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
9d10: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
9d20: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
9d30: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
9d40: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
9d50: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
9d60: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
9d70: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
9d80: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
9d90: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
9da0: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
9db0: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
9dc0: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
9dd0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
9de0: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
9df0: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
9e00: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
9e10: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
9e20: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
9e30: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
9e40: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
9e50: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
9e60: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
9e70: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
9e80: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
9e90: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
9ea0: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
9eb0: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
9ec0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
9ed0: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
9ee0: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
9ef0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
9f00: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
9f10: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9f20: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
9f30: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9f40: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
9f50: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
9f60: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
9f70: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
9f80: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
9f90: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
9fa0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9fb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9fc0: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
9fd0: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
9fe0: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
9ff0: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
a000: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
a010: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
a020: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
a030: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
a040: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
a050: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
a060: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
a070: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a080: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
a090: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
a0a0: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
a0b0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
a0c0: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
a0d0: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
a0e0: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
a0f0: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
a100: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
a110: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
a120: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
a130: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
a140: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
a150: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
a160: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
a170: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
a180: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
a190: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
a1a0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
a1b0: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
a1c0: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
a1d0: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
a1e0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
a1f0: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
a200: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
a210: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
a220: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
a230: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a   int i;.  int (*
a240: 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42  xFunc)(Btree *pB
a250: 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63  t) = 0;  /* Func
a260: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20  tion to call on 
a270: 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65  each btree backe
a280: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70  nd */.  int isSp
a290: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
a2a0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
a2b0: 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   true if SQLITE_
a2c0: 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a  NOMEM or IOERR *
a2d0: 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
a2e0: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
a2f0: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
a300: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
a310: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
a320: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
a330: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
a340: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
a350: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
a360: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
a370: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
a380: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
a390: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
a3a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
a3b0: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
a3c0: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
a3d0: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
a3e0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
a3f0: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
a400: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
a410: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
a420: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
a430: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
a440: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
a450: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
a460: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
a470: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
a480: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
a490: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
a4a0: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
a4b0: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
a4c0: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
a4d0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
a4e0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
a4f0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
a500: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
a510: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
a520: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
a530: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
a540: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
a550: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
a560: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
a570: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
a580: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a590: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
a5a0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
a5b0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
a5c0: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
a5d0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
a5e0: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
a5f0: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
a600: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
a610: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
a620: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
a630: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20  rom p->rc */..  
a640: 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
a650: 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
a660: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a670: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
a680: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70  texArrayEnter(&p
a690: 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->aMutex);..    
a6a0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
a6b0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
a6c0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
a6d0: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
a6e0: 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
a6f0: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
a700: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
a710: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
a740: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
a750: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
a760: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
a770: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
a780: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f   /* This loop do
a790: 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73  es static analys
a7a0: 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  is of the query 
a7b0: 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66 20  to see which of 
a7c0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  the.      ** fol
a7d0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61 74  lowing three cat
a7e0: 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73  egories it falls
a7f0: 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a   into:.      **.
a800: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61        **     Rea
a810: 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  d-only.      ** 
a820: 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20 73      Query with s
a830: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
a840: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75  .      **     Qu
a850: 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61 74  ery without stat
a860: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  ement journal.  
a870: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
a880: 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65  We could do some
a890: 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61  thing more elega
a8a0: 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61  nt than this sta
a8b0: 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e  tic analysis (i.
a8c0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  e..      ** stor
a8d0: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75  e the type of qu
a8e0: 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74  ery as part of t
a8f0: 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70  he compliation p
a900: 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20  hase), but .    
a910: 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61    ** handling ma
a920: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
a930: 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c 79  lure is a fairly
a940: 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63 61   obscure edge ca
a950: 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20  se so .      ** 
a960: 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79  this is probably
a970: 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d   easier. Todo: M
a980: 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72  ight be an oppor
a990: 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65  tunity to reduce
a9a0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20   .      ** code 
a9b0: 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c  size a very smal
a9c0: 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e  l amount though.
a9d0: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
a9e0: 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e 6c    int notReadOnl
a9f0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  y = 0;.      int
aa00: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30   isStatement = 0
aa10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
aa20: 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d  ->aOp || p->nOp=
aa30: 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  =0);.      for(i
aa40: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
aa50: 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69  +){ .        swi
aa60: 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  tch( p->aOp[i].o
aa70: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
aa80: 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73     case OP_Trans
aa90: 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  action:.        
aaa0: 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20      notReadOnly 
aab0: 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b  |= p->aOp[i].p2;
aac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
aad0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
aae0: 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a  se OP_Statement:
aaf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 53  .            isS
ab00: 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20  tatement = 1;.  
ab10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ab20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ab30: 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a   }..   .      /*
ab40: 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
ab50: 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20  s read-only, we 
ab60: 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62  need do no rollb
ab70: 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65  ack at all. Othe
ab80: 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
ab90: 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65  proceed with the
aba0: 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
abb0: 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
abc0: 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e 6c    if( notReadOnl
abd0: 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
abe0: 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
abf0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
ac00: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
ac10: 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61 74 65  OCKED && isState
ac20: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
ac30: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
ac40: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
ac50: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  mt;.          p-
ac60: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53  >rc = SQLITE_BUS
ac70: 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
ac80: 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49  e if( (mrc==SQLI
ac90: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
aca0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
acb0: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
acc0: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
acd0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
ace0: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
acf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad00: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
ad10: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
ad20: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
ad30: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
ad40: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
ad50: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
ad60: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
ad70: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
ad80: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
ad90: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
ada0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76  */.          inv
adb0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
adc0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
add0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
ade0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
adf0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
ae00: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
ae10: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ae20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
ae30: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
ae40: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
ae50: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
ae60: 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
ae70: 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20   vdbe, then.    
ae80: 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  ** we do either 
ae90: 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
aea0: 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
aeb0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
aec0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
aed0: 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
aee0: 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
aef0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
af00: 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
af10: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
af20: 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20  s occured. .    
af30: 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  */.    if( db->a
af40: 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
af50: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d  >activeVdbeCnt==
af60: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
af70: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
af80: 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
af90: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
afa0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
afb0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
afc0: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
afd0: 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20  ag is true, and 
afe0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
aff0: 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   was .        **
b000: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68   successful or h
b010: 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
b020: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73  constraint. This
b030: 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
b040: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72  .        ** is r
b050: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20  equired..       
b060: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b070: 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
b080: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  db);.        if(
b090: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
b0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b0b0: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
b0c0: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
b0d0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
b0e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b0f0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
b100: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
b110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b120: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
b130: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b140: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
b150: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b160: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b170: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
b180: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
b190: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
b1a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b1b0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
b1d0: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
b1e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
b1f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b200: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
b210: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
b220: 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64     if( p->opened
b230: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
b240: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
b250: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
b260: 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  tStmt;.        }
b270: 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66   .      }else if
b280: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
b290: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
b2a0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
b2b0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b2c0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65  ckStmt;.      }e
b2d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
b2e0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b2f0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
b300: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
b310: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b320: 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
b330: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
b340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b350: 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63  .    /* If xFunc
b360: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
b370: 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  en it is one of 
b380: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b390: 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20  backStmt or.    
b3a0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
b3b0: 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20  ommitStmt. Call 
b3c0: 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  it once on each 
b3d0: 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65  backend. If an e
b3e0: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20  rror occurs.    
b3f0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ** and the retur
b400: 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20  n code is still 
b410: 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74  SQLITE_OK, set t
b420: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
b430: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
b440: 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20   error value..  
b450: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b460: 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20  !xFunc ||.      
b470: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
b480: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c  reeCommitStmt ||
b490: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
b4a0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b4b0: 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20  ckStmt.    );.  
b4c0: 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63    for(i=0; xFunc
b4d0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
b4e0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
b4f0: 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  rc;.      Btree 
b500: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
b510: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
b520: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
b530: 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b  rc = xFunc(pBt);
b540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
b550: 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  && (p->rc==SQLIT
b560: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
b570: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b580: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
b590: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
b5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
b5b0: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
b5c0: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  g, 0);.        }
b5d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b5e0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
b5f0: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
b600: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
b610: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
b620: 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  nt was committed
b630: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
b640: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
b650: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
b660: 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
b670: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
b680: 20 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63        if( !xFunc
b690: 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74   || xFunc==sqlit
b6a0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
b6b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b6c0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
b6d0: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
b6e0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
b6f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b700: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
b710: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
b720: 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
b730: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
b740: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
b750: 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
b760: 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
b770: 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20  occurred. */.   
b780: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
b790: 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61  TE_OK && db->fla
b7a0: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
b7b0: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20  Changes ){.     
b7c0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
b7d0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
b7e0: 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  0);.      db->fl
b7f0: 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ags = (db->flags
b800: 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   | SQLITE_Intern
b810: 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a  Changes);.    }.
b820: 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
b830: 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
b840: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
b850: 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d  exArrayLeave(&p-
b860: 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20  >aMutex);.  }.. 
b870: 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
b880: 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
b890: 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
b8a0: 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
b8b0: 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
b8c0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
b8d0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b8e0: 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  --;.  }.  p->mag
b8f0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b900: 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
b910: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
b920: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
b930: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b940: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b950: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 68 65  NOMEM;.  }.  che
b960: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
b970: 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  db);..  return S
b980: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
b990: 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
b9a0: 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
b9b0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b9c0: 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
b9d0: 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
b9e0: 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
b9f0: 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
ba00: 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
ba10: 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
ba20: 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
ba30: 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
ba40: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
ba50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ba60: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
ba70: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
ba80: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
ba90: 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
baa0: 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
bab0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
bac0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
bad0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
bae0: 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
baf0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
bb00: 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
bb10: 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
bb20: 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
bb30: 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
bb40: 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
bb50: 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
bb60: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
bb70: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
bb80: 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
bb90: 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
bba0: 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
bbb0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
bbc0: 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
bbd0: 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
bbe0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
bbf0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
bc00: 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
bc10: 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
bc20: 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
bc30: 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
bc40: 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
bc50: 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
bc60: 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
bc70: 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
bc80: 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
bc90: 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
bca0: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
bcb0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
bcc0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  db);.  sqlite3Vd
bcd0: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73 71 6c  beHalt(p);.  sql
bce0: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
bcf0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
bd00: 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
bd10: 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
bd20: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
bd30: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
bd40: 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
bd50: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
bd60: 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
bd70: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
bd80: 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
bd90: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
bda0: 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
bdb0: 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
bdc0: 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
bdd0: 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
bde0: 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
bdf0: 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
be00: 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
be10: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
be20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
be30: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
be40: 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
be50: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
be60: 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
be70: 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51  -1,p->zErrMsg,SQ
be80: 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69 74 65  LITE_UTF8,sqlite
be90: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 64  3_free);.      d
bea0: 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
beb0: 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  rc;.      p->zEr
bec0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
bed0: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
bee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
bef0: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
bf00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bf10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bf20: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
bf30: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
bf40: 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
bf50: 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
bf60: 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
bf70: 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
bf80: 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
bf90: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
bfa0: 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
bfb0: 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
bfc0: 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
bfd0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
bfe0: 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
bff0: 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
c000: 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
c010: 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
c020: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
c030: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
c040: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
c050: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
c060: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
c070: 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
c080: 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  TF8, sqlite3_fre
c090: 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  e);.    p->zErrM
c0a0: 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
c0b0: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
c0c0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
c0d0: 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
c0e0: 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
c0f0: 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
c100: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
c110: 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
c120: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
c130: 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b  pTos<&p->aStack[
c140: 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d  p->pc<0?0:p->pc]
c150: 20 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20 29   || !p->aStack )
c160: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
c170: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
c180: 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
c190: 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
c1a0: 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
c1b0: 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
c1c0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
c1d0: 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
c1e0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
c1f0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
c200: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
c210: 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
c220: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
c230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c240: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
c250: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
c260: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
c270: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
c280: 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
c290: 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
c2a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
c2b0: 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
c2c0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
c2d0: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
c2e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
c2f0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
c300: 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
c310: 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
c320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c330: 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
c340: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
c350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
c360: 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
c370: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
c380: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
c390: 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62  IC_INIT;.  p->ab
c3a0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72 65 74  orted = 0;.  ret
c3b0: 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
c3c0: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
c3d0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
c3e0: 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
c3f0: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
c400: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
c410: 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
c420: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
c430: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
c440: 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
c450: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
c460: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
c470: 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
c480: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c490: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
c4a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
c4b0: 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
c4c0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
c4d0: 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
c4e0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
c4f0: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
c500: 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
c510: 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
c520: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67  }else if( p->mag
c530: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
c540: 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  NIT ){.    retur
c550: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
c560: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
c570: 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
c580: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c590: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74  ** Call the dest
c5a0: 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20  ructor for each 
c5b0: 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e  auxdata entry in
c5c0: 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77   pVdbeFunc for w
c5d0: 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72  hich.** the corr
c5e0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
c5f0: 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20   mask is clear. 
c600: 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   Auxdata entries
c610: 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72   beyond 31.** ar
c620: 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79  e always destroy
c630: 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20  ed.  To destroy 
c640: 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72  all auxdata entr
c650: 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a  ies, call this.*
c660: 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d  * routine with m
c670: 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20  ask==0..*/.void 
c680: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
c690: 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e  eAuxData(VdbeFun
c6a0: 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e  c *pVdbeFunc, in
c6b0: 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  t mask){.  int i
c6c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c6d0: 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20  VdbeFunc->nAux; 
c6e0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
c6f0: 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
c700: 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41   &pVdbeFunc->apA
c710: 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28  ux[i];.    if( (
c720: 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28  i>31 || !(mask&(
c730: 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d  1<<i))) && pAux-
c740: 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69  >pAux ){.      i
c750: 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
c760: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
c770: 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
c780: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
c790: 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20       pAux->pAux 
c7a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
c7b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
c7c0: 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
c7d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c7e0: 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
c7f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
c800: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
c810: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20  .  Cleanup(p);. 
c820: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
c830: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
c840: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
c850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
c860: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64  sert( p->db->pVd
c870: 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e  be==p );.    p->
c880: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
c890: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
c8a0: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
c8b0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
c8c0: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
c8d0: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
c8e0: 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d      Op *pOp = p-
c8f0: 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >aOp;.    for(i=
c900: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
c910: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
c920: 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79  freeP4(pOp->p4ty
c930: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
c940: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
c950: 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65  BUG.      sqlite
c960: 33 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d  3_free(pOp->zCom
c970: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
c980: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c    .    }.    sql
c990: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70  ite3_free(p->aOp
c9a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
c9b0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
c9c0: 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71  , p->nVar);.  sq
c9d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c  lite3_free(p->aL
c9e0: 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
c9f0: 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29  _free(p->aStack)
ca00: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
ca10: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
ca20: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
ca30: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
ca40: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f  ite3_free(p->aCo
ca50: 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
ca60: 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29 3b  3_free(p->zSql);
ca70: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
ca80: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
ca90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
caa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
cab0: 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
cac0: 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
cad0: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
cae0: 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
caf0: 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65   MoveTo now.  Re
cb00: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
cb10: 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54  de.  If no MoveT
cb20: 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68  o is pending, th
cb30: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f  is.** routine do
cb40: 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72  es nothing and r
cb50: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
cb60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cb70: 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
cb80: 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  (Cursor *p){.  i
cb90: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
cba0: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
cbb0: 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
cbc0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
cbd0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
cbe0: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
cbf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
cc00: 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
cc10: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
cc20: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
cc30: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
cc40: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
cc50: 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
cc60: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cc70: 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79      *p->pIncrKey
cc80: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73   = 0;.    p->las
cc90: 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e  tRowid = keyToIn
cca0: 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  t(p->movetoTarge
ccb0: 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  t);.    p->rowid
ccc0: 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30  IsValid = res==0
ccd0: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
cce0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
ccf0: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
cd00: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
cd10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
cd20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cd30: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
cd40: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
cd50: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
cd60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
cd70: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
cd80: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
cd90: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
cda0: 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ALE;.  }.  retur
cdb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cdc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
cdd0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
cde0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
cdf0: 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
ce00: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ce10: 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
ce20: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52  lite3VdbeSerialR
ce30: 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ead().** sqlite3
ce40: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
ce50: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
ce60: 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a  rialWrite().**.*
ce70: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
ce80: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
ce90: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
cea0: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
ceb0: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
cec0: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
ced0: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
cee0: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
cef0: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
cf00: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
cf10: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
cf20: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
cf30: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
cf40: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
cf50: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
cf60: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
cf70: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
cf80: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
cf90: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
cfa0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
cfb0: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
cfc0: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
cfd0: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
cfe0: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
cff0: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
d000: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
d010: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
d020: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
d030: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
d040: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
d050: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
d060: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
d070: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
d080: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
d090: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
d0a0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
d0b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
d0c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
d0d0: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
d0e0: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
d0f0: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
d100: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
d110: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
d120: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
d130: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
d140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
d150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
d160: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
d170: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
d180: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
d190: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
d1b0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
d1c0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
d1d0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d1e0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
d1f0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
d200: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
d230: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
d240: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
d250: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
d260: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
d270: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
d2a0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d2b0: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
d2d0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
d2e0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
d2f0: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
d300: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
d310: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
d320: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
d340: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
d350: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
d360: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
d370: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
d380: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
d390: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
d3a0: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
d3d0: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
d3e0: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
d3f0: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
d400: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
d410: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
d420: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
d430: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
d440: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
d450: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
d460: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
d470: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
d480: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
d490: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
d4a0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
d4b0: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
d4c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
d4d0: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
d4e0: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
d4f0: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
d500: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
d510: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
d520: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
d530: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
d540: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
d550: 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
d560: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
d570: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
d580: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
d590: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
d5a0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d5b0: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
d5c0: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
d5d0: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
d5e0: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
d5f0: 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30 30  ((i64)0x00001000
d600: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
d610: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
d620: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
d630: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
d640: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
d650: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
d660: 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  +i;.    }.    u 
d670: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
d680: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
d690: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
d6a0: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
d6b0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
d6c0: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
d6d0: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
d6e0: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
d6f0: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
d700: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
d710: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
d720: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
d730: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
d740: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
d750: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d760: 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
d770: 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
d780: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
d790: 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
d7a0: 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
d7b0: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61  em->u.i;.  }.  a
d7c0: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
d7d0: 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
d7e0: 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
d7f0: 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
d800: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d810: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
d820: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
d830: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
d840: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
d850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
d860: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
d870: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
d880: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
d890: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
d8a0: 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
d8b0: 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
d8c0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
d8d0: 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
d8e0: 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
d8f0: 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
d900: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
d910: 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
d920: 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
d930: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
d940: 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
d950: 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
d960: 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
d970: 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
d980: 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
d990: 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
d9a0: 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
d9b0: 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
d9c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
d9d0: 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
d9e0: 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
d9f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
da00: 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
da10: 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
da20: 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
da30: 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
da40: 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
da50: 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
da60: 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
da70: 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
da80: 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
da90: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
daa0: 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
dab0: 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
dac0: 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
dad0: 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
dae0: 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
daf0: 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
db00: 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
db10: 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
db20: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
db30: 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
db40: 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
db50: 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
db60: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
db70: 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
db80: 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
db90: 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
dba0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
dbb0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
dbc0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
dbd0: 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
dbe0: 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
dbf0: 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
dc00: 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
dc10: 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
dc20: 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
dc30: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
dc40: 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
dc50: 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
dc60: 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
dc70: 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
dc80: 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
dc90: 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
dca0: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
dcb0: 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
dcc0: 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
dcd0: 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
dce0: 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
dcf0: 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
dd00: 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
dd10: 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
dd20: 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
dd30: 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
dd40: 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
dd50: 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
dd60: 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
dd70: 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
dd80: 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
dd90: 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
dda0: 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
ddb0: 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
ddc0: 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
ddd0: 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
dde0: 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
ddf0: 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
de00: 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
de10: 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
de20: 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
de30: 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
de40: 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
de50: 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
de60: 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
de70: 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
de80: 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
de90: 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
dea0: 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
deb0: 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
dec0: 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
ded0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
dee0: 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
def0: 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
df00: 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
df10: 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
df20: 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
df30: 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
df40: 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
df50: 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
df60: 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
df70: 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
df80: 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
df90: 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
dfa0: 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
dfb0: 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
dfc0: 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
dfd0: 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
dfe0: 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
dff0: 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
e000: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
e010: 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
e020: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
e030: 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
e040: 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
e050: 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
e060: 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
e070: 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
e080: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
e090: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
e0a0: 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
e0b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
e0c0: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e0d0: 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
e0e0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
e0f0: 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
e100: 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
e110: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
e120: 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
e130: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
e140: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
e150: 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
e160: 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
e170: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
e180: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
e190: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
e1a0: 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
e1b0: 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
e1c0: 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20  f[].  nBuf must 
e1d0: 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72  always be.** lar
e1e0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
e1f0: 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
e200: 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ld.  Except, if 
e210: 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  the field is.** 
e220: 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65  a blob with a ze
e230: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20  ro-filled tail, 
e240: 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74  then buf[] might
e250: 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67   be just the rig
e260: 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f  ht.** size to ho
e270: 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78  ld everything ex
e280: 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72  cept for the zer
e290: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20  o-filled tail.  
e2a0: 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f  If buf[].** is o
e2b0: 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74  nly big enough t
e2c0: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a  o hold the non-z
e2d0: 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e  ero prefix, then
e2e0: 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74   only write that
e2f0: 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20  .** prefix into 
e300: 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62  buf[].  But if b
e310: 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e  uf[] is large en
e320: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74  ough to hold bot
e330: 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20  h the.** prefix 
e340: 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65  and the tail the
e350: 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66  n write the pref
e360: 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74  ix and set the t
e370: 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65  ail to all.** ze
e380: 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ros..**.** Retur
e390: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
e3a0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
e3b0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
e3c0: 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
e3d0: 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
e3e0: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
e3f0: 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
e400: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
e410: 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
e420: 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
e430: 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
e440: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
e450: 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
e460: 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20  *buf, int nBuf, 
e470: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
e480: 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75  ile_format){.  u
e490: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  32 serial_type =
e4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e4b0: 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c  alType(pMem, fil
e4c0: 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74  e_format);.  int
e4d0: 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
e4e0: 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
e4f0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
e500: 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
e510: 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
e520: 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   v;.    int i;. 
e530: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
e540: 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
e550: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
e560: 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
e570: 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
e580: 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
e590: 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
e5a0: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
e5b0: 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
e5c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
e5d0: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
e5e0: 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
e5f0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e600: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
e610: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
e620: 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  ( len<=nBuf );. 
e630: 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
e640: 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
e650: 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
e660: 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20  v >>= 8;.    }. 
e670: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
e680: 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
e690: 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
e6a0: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
e6b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e6c0: 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
e6d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
e6e0: 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29  ro)?pMem->u.i:0)
e6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
e700: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e710: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
e720: 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
e730: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
e740: 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
e750: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
e760: 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
e770: 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
e780: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
e790: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
e7a0: 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
e7b0: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  i;.      if( len
e7c0: 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  >nBuf ){.       
e7d0: 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20   len = nBuf;.   
e7e0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
e7f0: 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
e800: 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
e810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
e820: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
e830: 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
e840: 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
e850: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
e860: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
e870: 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
e880: 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
e890: 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
e8a0: 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
e8b0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
e8c0: 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
e8d0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
e8e0: 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
e8f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e900: 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
e910: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
e920: 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
e930: 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
e940: 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
e950: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
e960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e970: 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
e980: 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
e990: 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e9b0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
e9c0: 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
e9d0: 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
e9e0: 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
e9f0: 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
ea00: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
ea10: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
ea20: 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
ea30: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
ea40: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
ea50: 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
ea60: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
ea70: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
ea80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ea90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
eaa0: 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
eab0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
eac0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
ead0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
eae0: 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
eaf0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
eb00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
eb10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
eb20: 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
eb30: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
eb40: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
eb50: 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
eb60: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
eb70: 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
eb80: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
eb90: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
eba0: 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
ebb0: 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
ebc0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
ebd0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
ebe0: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
ebf0: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
ec00: 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
ec10: 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
ec20: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ec30: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
ec40: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
ec50: 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
ec60: 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
ec70: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
ec80: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
ec90: 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
eca0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
ecb0: 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
ecc0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
ecd0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
ece0: 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
ecf0: 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
ed00: 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
ed10: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
ed20: 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
ed30: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
ed40: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
ed50: 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
ed60: 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
ed70: 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
ed80: 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
ed90: 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
eda0: 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
edb0: 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
edc0: 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
edd0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ede0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
edf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ee00: 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
ee10: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
ee20: 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
ee30: 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
ee40: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
ee50: 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
ee60: 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
ee70: 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
ee80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ee90: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
eea0: 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
eeb0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
eec0: 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
eed0: 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
eee0: 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
eef0: 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
ef00: 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
ef10: 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
ef20: 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
ef30: 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
ef40: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
ef50: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
ef60: 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
ef70: 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
ef80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
ef90: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
efa0: 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
efb0: 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
efc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
efd0: 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
efe0: 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
eff0: 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
f000: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
f010: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f020: 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
f030: 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
f040: 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
f050: 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
f060: 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
f070: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
f080: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
f090: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
f0a0: 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
f0b0: 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
f0c0: 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
f0d0: 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
f0e0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
f0f0: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
f100: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
f110: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
f120: 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
f130: 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
f140: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f150: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
f160: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f170: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
f180: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
f190: 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
f1a0: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
f1b0: 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
f1c0: 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
f1d0: 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
f1e0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
f1f0: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
f200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
f210: 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
f220: 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
f230: 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
f240: 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
f250: 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
f260: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
f270: 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
f280: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f290: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f2a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
f2b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f2c0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28       int len = (
f2d0: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
f2e0: 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
f2f0: 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
f300: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
f310: 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
f320: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
f330: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
f340: 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
f350: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f360: 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
f370: 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
f380: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
f390: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
f3a0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
f3b0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
f3c0: 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
f3d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f3e0: 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65 72  /*.** The header
f3f0: 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f 6e   of a record con
f400: 73 69 73 74 73 20 6f 66 20 61 20 73 65 71 75 65  sists of a seque
f410: 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  nce variable-len
f420: 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a  gth integers..**
f430: 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73 20   These integers 
f440: 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
f450: 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20  s small and are 
f460: 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69 6e  encoded as a sin
f470: 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65  gle byte..** The
f480: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
f490: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
f4a0: 20 74 68 69 73 20 66 61 63 74 20 74 6f 20 70 72   this fact to pr
f4b0: 6f 76 69 64 65 20 61 20 66 61 73 74 20 64 65 63  ovide a fast dec
f4c0: 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  ode.** of the in
f4d0: 74 65 67 65 72 73 20 69 6e 20 61 20 72 65 63 6f  tegers in a reco
f4e0: 72 64 20 68 65 61 64 65 72 2e 20 20 49 74 20 69  rd header.  It i
f4f0: 73 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  s faster for the
f500: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20   common case.** 
f510: 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 67 65  where the intege
f520: 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62 79  r is a single by
f530: 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69 74  te.  It is a lit
f540: 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e 20  tle slower when 
f550: 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  the.** integer i
f560: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79  s two or more by
f570: 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61 6c  tes.  But overal
f580: 6c 20 69 74 20 69 73 20 66 61 73 74 65 72 2e 0a  l it is faster..
f590: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
f5a0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ing expressions 
f5b0: 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a  are equivalent:.
f5c0: 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73 71  **.**     x = sq
f5d0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
f5e0: 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a  ( A, &B );.**.**
f5f0: 20 20 20 20 20 78 20 3d 20 47 65 74 56 61 72 69       x = GetVari
f600: 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a  nt( A, B );.**.*
f610: 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56 61 72  /.#define GetVar
f620: 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20 3d 20  int(A,B)  ((B = 
f630: 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20 31 20  *(A))<=0x7f ? 1 
f640: 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  : sqlite3GetVari
f650: 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a  nt32(A, &B))../*
f660: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f670: 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
f680: 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
f690: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 73   index records s
f6a0: 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  pecified by .** 
f6b0: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
f6c0: 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32  nd {nKey2, pKey2
f6d0: 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e  }, returning a n
f6e0: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
f6f0: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
f700: 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20  eger if {nKey1, 
f710: 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74  pKey1} is less t
f720: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
f730: 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
f740: 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d  n {nKey2, pKey2}
f750: 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e 64  .  Both Key1 and
f760: 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62 79   Key2 must be by
f770: 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f  te strings.** co
f780: 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f 50  mposed by the OP
f790: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
f7a0: 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a  de of the VDBE..
f7b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f7c0: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
f7d0: 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74  .  void *userDat
f7e0: 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  a,.  int nKey1, 
f7f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
f800: 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  1, .  int nKey2,
f810: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
f820: 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  y2.){.  KeyInfo 
f830: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79  *pKeyInfo = (Key
f840: 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a  Info*)userData;.
f850: 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20 20    u32 d1, d2;   
f860: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f870: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
f880: 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
f890: 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 2c  t */.  u32 idx1,
f8a0: 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f   idx2;      /* O
f8b0: 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
f8c0: 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
f8d0: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
f8e0: 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72 32  2 szHdr1, szHdr2
f8f0: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
f900: 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
f910: 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
f920: 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
f930: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
f940: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f950: 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
f960: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f970: 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74  *)pKey1;.  const
f980: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f990: 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75  aKey2 = (const u
f9a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
f9b0: 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d  Key2;..  Mem mem
f9c0: 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20  1;.  Mem mem2;. 
f9d0: 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
f9e0: 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
f9f0: 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
fa00: 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20  >db;.  mem2.enc 
fa10: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
fa20: 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70 4b 65  .  mem2.db = pKe
fa30: 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a 20 20  yInfo->db;.  .  
fa40: 69 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e 74  idx1 = GetVarint
fa50: 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
fa60: 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
fa70: 20 20 69 64 78 32 20 3d 20 47 65 74 56 61 72 69    idx2 = GetVari
fa80: 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72 32  nt(aKey2, szHdr2
fa90: 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72 32  );.  d2 = szHdr2
faa0: 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65  ;.  nField = pKe
fab0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20  yInfo->nField;. 
fac0: 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
fad0: 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48 64  dr1 && idx2<szHd
fae0: 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  r2 ){.    u32 se
faf0: 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20  rial_type1;.    
fb00: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 32  u32 serial_type2
fb10: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
fb20: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
fb30: 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
fb40: 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
fb50: 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
fb60: 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79   GetVarint( aKey
fb70: 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
fb80: 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
fb90: 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
fba0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
fbb0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
fbc0: 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  e1)>0 ) break;. 
fbd0: 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56 61     idx2 += GetVa
fbe0: 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78 32  rint( aKey2+idx2
fbf0: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29  , serial_type2 )
fc00: 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b  ;.    if( d2>=nK
fc10: 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey2 && sqlite3Vd
fc20: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
fc30: 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20  serial_type2)>0 
fc40: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
fc50: 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
fc60: 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
fc70: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
fc80: 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
fc90: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
fca0: 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
fcb0: 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  e1, &mem1);.    
fcc0: 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d2 += sqlite3Vdb
fcd0: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
fce0: 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79  2[d2], serial_ty
fcf0: 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20  pe2, &mem2);..  
fd00: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
fd10: 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
fd20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
fd30: 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
fd40: 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20  &mem2, i<nField 
fd50: 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
fd60: 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
fd70: 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20  f( mem1.flags & 
fd80: 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65  MEM_Dyn ) sqlite
fd90: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
fda0: 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20  &mem1);.    if( 
fdb0: 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45 4d  mem2.flags & MEM
fdc0: 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64  _Dyn ) sqlite3Vd
fdd0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
fde0: 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  m2);.    if( rc!
fdf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
fe00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
fe10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20  ;.  }..  /* One 
fe20: 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
fe30: 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62  out of fields, b
fe40: 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ut all the field
fe50: 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
fe60: 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75  nt.  ** were equ
fe70: 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b  al. If the incrK
fe80: 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ey flag is true,
fe90: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
fea0: 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65   key is.  ** tre
feb0: 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a  ated as larger..
fec0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30    */.  if( rc==0
fed0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   ){.    if( pKey
fee0: 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b  Info->incrKey ){
fef0: 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
ff00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
ff10: 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69 78 49  KeyInfo->prefixI
ff20: 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  sEqual ){.      
ff30: 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a  if( d1<nKey1 ){.
ff40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
ff50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ff60: 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20  d2<nKey2 ){.    
ff70: 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
ff80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
ff90: 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
ffa0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69  >aSortOrder && i
ffb0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
ffc0: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
ffd0: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
ffe0: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
fff0: 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d     rc = -rc;.  }
10000 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
10010 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
10020 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78  ment is an index
10030 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20   entry composed 
10040 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
10050 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
10060 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72  ** The last entr
10070 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64  y in this record
10080 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
10090 74 65 67 65 72 20 28 73 70 65 63 69 66 69 63 61  teger (specifica
100a0 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65  lly.** an intege
100b0 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20  r rowid).  This 
100c0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
100d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
100e0 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69  tes in.** that i
100f0 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
10100 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
10110 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a  idLen(const u8 *
10120 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48  aKey){.  u32 szH
10130 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
10140 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
10150 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
10160 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
10170 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
10180 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  wid */..  sqlite
10190 33 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65  3GetVarint32(aKe
101a0 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71  y, &szHdr);.  sq
101b0 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
101c0 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c  (&aKey[szHdr-1],
101d0 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20   &typeRowid);.  
101e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
101f0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
10200 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20  typeRowid);.}.  
10210 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
10220 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
10230 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
10240 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
10250 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
10260 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
10270 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
10280 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
10290 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
102a0 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
102b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
102c0 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
102d0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
102e0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
102f0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
10300 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  xRowid(BtCursor 
10310 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
10320 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
10330 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
10340 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
10350 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10360 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
10370 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
10380 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
10390 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
103a0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
103b0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
103c0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
103d0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c  Mem m, v;..  sql
103e0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
103f0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
10400 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
10410 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y<=0 ){.    retu
10420 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10430 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
10440 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
10450 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
10460 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
10470 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
10480 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10490 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65  .  }.  sqlite3Ge
104a0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
104b0 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  .z, &szHdr);.  s
104c0 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
104d0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
104e0 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
104f0 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
10500 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10510 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
10520 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
10530 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
10540 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
10550 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
10560 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
10570 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
10580 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
10590 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
105a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
105b0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
105c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
105d0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
105e0 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
105f0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
10600 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
10610 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
10620 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
10630 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
10640 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
10650 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
10660 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
10670 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
10680 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
10690 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
106a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
106b0 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
106c0 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
106d0 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
106e0 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
106f0 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
10700 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
10710 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
10720 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
10730 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
10740 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
10750 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
10760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10770 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
10780 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20  (.  Cursor *pC, 
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
107b0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
107c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
107d0 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20  const u8 *pKey, 
107e0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20    /* The key to 
107f0 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74  compare */.  int
10800 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
10810 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
10820 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
10830 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
10840 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
10850 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
10860 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
10870 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
10880 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b  .  int lenRowid;
10890 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c  .  Mem m;..  sql
108a0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
108b0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
108c0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
108d0 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73  y<=0 ){.    *res
108e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
108f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10910 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
10920 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e  C->pCursor, 0, n
10930 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
10940 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
10950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10960 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
10970 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
10980 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20  Len((u8*)m.z);. 
10990 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
109a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
109b0 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d  (pC->pKeyInfo, m
109c0 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a  .n-lenRowid, m.z
109d0 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
109e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
109f0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
10a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10a10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
10a20 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
10a30 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
10a40 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
10a50 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
10a60 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
10a70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
10a80 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
10a90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
10aa0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
10ab0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
10ac0 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
10ad0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10ae0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
10af0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
10b00 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
10b10 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
10b20 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
10b30 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
10b40 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
10b50 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
10b60 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
10b70 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
10b80 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
10b90 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
10ba0 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
10bb0 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
10bc0 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
10bd0 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
10be0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
10bf0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10c00 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
10c10 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
10c20 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
10c30 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
10c40 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
10c50 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
10c60 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
10c70 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
10c80 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
10c90 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
10ca0 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
10cb0 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
10cc0 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
10cd0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
10ce0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
10cf0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
10d00 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
10d10 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
10d20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
10d30 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
10d40 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
10d50 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10d60 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
10d70 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
10d80 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
10d90 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
10da0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
10db0 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
10dc0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
10dd0 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
10de0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
10df0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
10e00 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
10e10 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
10e20 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
10e30 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
10e40 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
10e50 3e 64 62 3b 0a 7d 0a                             >db;.}.