/ Hex Artifact Content
Login

Artifact 5bc14ff3da6c6b3b7f643cbc3d50a344e9b599f8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0660: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65  mt *pStmt){.  re
0670: 74 75 72 6e 20 28 28 56 64 62 65 20 2a 29 70 53  turn ((Vdbe *)pS
0680: 74 6d 74 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f  tmt)->zSql;.}../
0690: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06a0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06b0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06d0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06e0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06f0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0710: 0a 20 20 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74  .  int nTmp;.  t
0720: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0730: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0740: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0750: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0760: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0770: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0780: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0790: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07a0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07b0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07c0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07d0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07e0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07f0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0800: 70 3b 0a 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e  p;.  nTmp = pA->
0810: 6e 53 71 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c  nSql;.  pA->nSql
0820: 20 3d 20 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pB->nSql;.  p
0830: 42 2d 3e 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a  B->nSql = nTmp;.
0840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0850: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0860: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0870: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0880: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0890: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
08a0: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
08b0: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
08c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
08d0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
08e0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  y so that it con
08f0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 4e  tains at least N
0900: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  .** elements..**
0910: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0920: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0930: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0940: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a  ing the array,.*
0950: 2a 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  * Vdbe.aOp and V
0960: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0970: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74  ain unchanged (t
0980: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a  his is so that.*
0990: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  * any opcodes al
09a0: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
09b0: 63 61 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79  can be correctly
09c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20   deallocated.** 
09d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
09e0: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
09f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a00: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56   resizeOpArray(V
0a10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
0a20: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0a30: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0a40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70  p->nOpAlloc;.  p
0a50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a60: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a70: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0a80: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0a90: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0aa0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ab0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  Op = pNew;.    i
0ac0: 66 28 20 4e 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a  f( N>oldSize ){.
0ad0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
0ae0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
0af0: 2c 20 28 4e 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  , (N-oldSize)*si
0b00: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 7d  zeof(Op));.    }
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0b20: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b30: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b40: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b50: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b60: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0b80: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0b90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0ba0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bd0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0bf0: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c10: 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20 20 20  *    p1, p2     
0c20: 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20 6f       First two o
0c30: 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73 73  f the three poss
0c40: 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a 2a  ible operands..*
0c50: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
0c60: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
0c70: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
0c80: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
0c90: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
0ca0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
0cb0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
0cc0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
0cd0: 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70 65  of the P3.** ope
0ce0: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
0cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56 64  ite3VdbeAddOp(Vd
0d00: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0d10: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a  nt p1, int p2){.
0d20: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0d30: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0d40: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0d50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0d60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0d70: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0d80: 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  =i ){.    resize
0d90: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
0da0: 70 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 30 29 3b  pAlloc*2 + 100);
0db0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
0dc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
0dd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0de0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0df0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0e00: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0e10: 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20 20  >opcode = op;.  
0e20: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
0e30: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
0e40: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 70  pOp->p3 = 0;.  p
0e50: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
0e60: 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78  NOTUSED;.  p->ex
0e70: 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  pired = 0;.#ifde
0e80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
0e90: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62   if( sqlite3_vdb
0ea0: 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 20  e_addop_trace ) 
0eb0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
0ec0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
0ed0: 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  [i]);.#endif.  r
0ee0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
0ef0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
0f00: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
0f10: 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69  e p3 value..*/.i
0f20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  nt sqlite3VdbeOp
0f30: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
0f40: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0f50: 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  2, const char *z
0f60: 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29 7b 0a  P3,int p3type){.
0f70: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
0f80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 2c  ite3VdbeAddOp(p,
0f90: 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20   op, p1, p2);.  
0fa0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
0fb0: 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a 50 33  eP3(p, addr, zP3
0fc0: 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72 65 74  , p3type);.  ret
0fd0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
0fe0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
0ff0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
1000: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
1010: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
1020: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
1030: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
1040: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
1050: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
1060: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
1070: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
1080: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
1090: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
10a0: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
10b0: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
10c0: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
10d0: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
10e0: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
10f0: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
1100: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
1110: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
1120: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
1130: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
1140: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
1150: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
1160: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
1170: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
1180: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
1190: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
11a0: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
11b0: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
11c0: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
11d0: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
11e0: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
11f0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
1200: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
1210: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
1220: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
1230: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
1240: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
1250: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
1260: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1270: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
1280: 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62  i;.  i = p->nLab
1290: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
12a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
12b0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
12c0: 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41  f( i>=p->nLabelA
12d0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
12e0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e  LabelAlloc = p->
12f0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
1300: 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65  10;.    p->aLabe
1310: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1320: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1330: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
1370: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
1380: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
1390: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
13a0: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
13b0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
13c0: 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n -1-i;.}../*.**
13d0: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
13e0: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
13f0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
1400: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
1410: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
1420: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
1430: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
1440: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
1450: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
1460: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
1470: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
1480: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1490: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
14a0: 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e  *p, int x){.  in
14b0: 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73  t j = -1-x;.  as
14c0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
14d0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
14e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
14f0: 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  0 && j<p->nLabel
1500: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61   );.  if( p->aLa
1510: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1520: 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70  abel[j] = p->nOp
1530: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1540: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
1550: 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69 73  f opcode 'op' is
1560: 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 20   guarenteed not 
1570: 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61 6c  to push more val
1580: 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ues.** onto the 
1590: 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e 20  VDBE stack than 
15a0: 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a  it pops off..*/.
15b0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f 64  static int opcod
15c0: 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a  eNoPush(u8 op){.
15d0: 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50 55    /* The 10 NOPU
15e0: 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74 61  SH_MASK_n consta
15f0: 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64 20  nts are defined 
1600: 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  in the automatic
1610: 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72 61  ally.  ** genera
1620: 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65 20  ted header file 
1630: 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68 20  opcodes.h. Each 
1640: 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74 6d  is a 16-bit bitm
1650: 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62 69  ask, one.  ** bi
1660: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
1670: 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  to each opcode i
1680: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
1690: 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 6d  e virtual.  ** m
16a0: 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e 63  achine in vdbe.c
16b0: 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72 75  . The bit is tru
16c0: 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22 6e  e if the word "n
16d0: 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73 0a  o-push" appears.
16e0: 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65 6e    ** in a commen
16f0: 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c 69  t on the same li
1700: 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65 20  ne as the "case 
1710: 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20 2a  OP_XXX:" in .  *
1720: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  * sqlite3VdbeExe
1730: 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a 20  c() in vdbe.c.. 
1740: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
1750: 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  bit is true, the
1760: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1770: 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67 75  ing opcode is gu
1780: 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20 2a  arenteed not.  *
1790: 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73 74  * to grow the st
17a0: 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20 65  ack when it is e
17b0: 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77 69  xecuted. Otherwi
17c0: 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77 20  se, it may grow 
17d0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 62  the.  ** stack b
17e0: 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 6e  y at most one en
17f0: 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  try..  **.  ** N
1800: 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f 72  OPUSH_MASK_0 cor
1810: 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63 6f  responds to opco
1820: 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f 50  des 0 to 15. NOP
1830: 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74 61  USH_MASK_1 conta
1840: 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69 74  ins.  ** one bit
1850: 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36 20   for opcodes 16 
1860: 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f 6e  to 31, and so on
1870: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62  ..  **.  ** 16-b
1880: 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61 74  it bitmasks (rat
1890: 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74 29  her than 32-bit)
18a0: 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20 69   are specified i
18b0: 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20 2a  n opcodes.h .  *
18c0: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
18d0: 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  le is generated 
18e0: 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72 61  by an awk progra
18f0: 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61 74  m. Awk manipulat
1900: 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62  es.  ** all numb
1910: 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67 2d  ers as floating-
1920: 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f 6e  point and we don
1930: 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b 20  't want to risk 
1940: 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20  a rounding.  ** 
1950: 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e 65  error if someone
1960: 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e 20   builds with an 
1970: 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28 66  awk that uses (f
1980: 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d 62  or example) 32-b
1990: 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66 6c  it .  ** IEEE fl
19a0: 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73 74  oats..  */ .  st
19b0: 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20 6d  atic const u32 m
19c0: 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20 20  asks[5] = {.    
19d0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b 20  NOPUSH_MASK_0 + 
19e0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
19f0: 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29 2c  SH_MASK_1)<<16),
1a00: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1a10: 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _2 + (((unsigned
1a20: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29 3c  )NOPUSH_MASK_3)<
1a30: 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48  <16),.    NOPUSH
1a40: 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e 73  _MASK_4 + (((uns
1a50: 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53  igned)NOPUSH_MAS
1a60: 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e  K_5)<<16),.    N
1a70: 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20 28  OPUSH_MASK_6 + (
1a80: 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53  ((unsigned)NOPUS
1a90: 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a  H_MASK_7)<<16),.
1aa0: 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f      NOPUSH_MASK_
1ab0: 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29  8 + (((unsigned)
1ac0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c  NOPUSH_MASK_9)<<
1ad0: 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72  16).  };.  asser
1ae0: 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20 20  t( op<32*5 );.  
1af0: 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f 70  return (masks[op
1b00: 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26 30  >>5] & (1<<(op&0
1b10: 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64  x1F)));.}..#ifnd
1b20: 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
1b30: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 4e  lite3VdbeOpcodeN
1b40: 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20  oPush(u8 op){.  
1b50: 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f 50  return opcodeNoP
1b60: 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69  ush(op);.}.#endi
1b70: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68  f../*.** Loop th
1b80: 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61  rough the progra
1b90: 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32  m looking for P2
1ba0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
1bb0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45 61   negative..** Ea
1bc0: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
1bd0: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
1be0: 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79 20  ve the label by 
1bf0: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a 2a  setting the P2.*
1c00: 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  * value to its c
1c10: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
1c20: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
1c30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1c40: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
1c50: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
1c60: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
1c70: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
1c80: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
1c90: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1ca0: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
1cb0: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
1cc0: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
1cd0: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
1ce0: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
1cf0: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
1d00: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
1d10: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
1d20: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
1d30: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
1d40: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20  .** The integer 
1d50: 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73 65  *pMaxStack is se
1d60: 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  t to the maximum
1d70: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 20   number of vdbe 
1d80: 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65 73  stack.** entries
1d90: 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e 61   that static ana
1da0: 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74 68  lysis reveals th
1db0: 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68 74  is program might
1dc0: 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   need..**.** Thi
1dd0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
1de0: 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  oes the followin
1df0: 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20  g optimization: 
1e00: 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a   It scans for.**
1e10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
1e20: 61 74 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  at might cause a
1e30: 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
1e40: 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74 72  ack.  Such instr
1e50: 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a  uctions.** are:.
1e60: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
1e70: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
1e80: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
1e90: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
1ea0: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79     *  OP_Destroy
1eb0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64  .**   *  OP_VUpd
1ec0: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  ate.**   *  OP_V
1ed0: 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20  Rename.**.** If 
1ee0: 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74  no such instruct
1ef0: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ion is found, th
1f00: 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65  en every Stateme
1f10: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  nt instruction .
1f20: 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ** is changed to
1f30: 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68 69   a Noop.  In thi
1f40: 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20  s way, we avoid 
1f50: 63 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61  creating the sta
1f60: 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e  tement .** journ
1f70: 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73  al file unnecess
1f80: 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  arily..*/.static
1f90: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
1fa0: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
1fb0: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
1fc0: 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b  , int *pMaxStack
1fd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
1fe0: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a  t nMaxArgs = 0;.
1ff0: 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20    int nMaxStack 
2000: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a  = p->nOp;.  Op *
2010: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
2020: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
2030: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
2040: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
2050: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
2060: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
2070: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
2080: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
2090: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
20a0: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
20b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
20c0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
20d0: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
20e0: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a  de==OP_AggStep .
20f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2100: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2110: 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f  .        || opco
2120: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23  de==OP_VUpdate.#
2130: 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2140: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
2150: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2160: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
2170: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
2180: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20  de==OP_Halt ){. 
2190: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
21a0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
21b0: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
21c0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
21d0: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
21e0: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
21f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2200: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2210: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
2220: 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42     hasStatementB
2230: 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65  egin = 1;.    }e
2240: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
2250: 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  OP_Destroy ){.  
2260: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
2270: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 23  tRollback = 1;.#
2280: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2290: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
22a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
22b0: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
22c0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
22d0: 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  Rename ){.      
22e0: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
22f0: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 7d  lback = 1;.    }
2300: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2310: 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20  =OP_VFilter ){. 
2320: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
2330: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
2340: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
2350: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
2360: 32 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  2].opcode==OP_In
2370: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e  teger );.      n
2380: 20 3d 20 70 4f 70 5b 2d 32 5d 2e 70 31 3b 0a 20   = pOp[-2].p1;. 
2390: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
23a0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
23b0: 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   n;.#endif.    }
23c0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 4e  .    if( opcodeN
23d0: 6f 50 75 73 68 28 6f 70 63 6f 64 65 29 20 29 7b  oPush(opcode) ){
23e0: 0a 20 20 20 20 20 20 6e 4d 61 78 53 74 61 63 6b  .      nMaxStack
23f0: 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  --;.    }..    i
2400: 66 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 20  f( pOp->p2>=0 ) 
2410: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
2420: 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32  sert( -1-pOp->p2
2430: 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  <p->nLabel );.  
2440: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
2450: 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a  el[-1-pOp->p2];.
2460: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2470: 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  ee(p->aLabel);. 
2480: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a   p->aLabel = 0;.
2490: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
24a0: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 2a   = nMaxArgs;.  *
24b0: 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d 61 78  pMaxStack = nMax
24c0: 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  Stack;..  /* If 
24d0: 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61 63  we never rollbac
24e0: 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  k a statement tr
24f0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
2500: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
2510: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
2520: 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f 20  not needed.  So 
2530: 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50 5f  change every OP_
2540: 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f  Statement.  ** o
2550: 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f 50  pcode into an OP
2560: 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76 6f  _Noop.  This avo
2570: 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  id a call to sql
2580: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
2590: 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69 63 68  ive().  ** which
25a0: 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76   can be expensiv
25b0: 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66 6f  e on some platfo
25c0: 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rms..  */.  if( 
25d0: 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69  hasStatementBegi
25e0: 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74 65 6d  n && !doesStatem
25f0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  entRollback ){. 
2600: 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f     for(pOp=p->aO
2610: 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69  p, i=p->nOp-1; i
2620: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29  >=0; i--, pOp++)
2630: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2640: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74  >opcode==OP_Stat
2650: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ement ){.       
2660: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2670: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  P_Noop;.      }.
2680: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
26a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
26b0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
26c0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
26d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
26e0: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
26f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
2700: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2710: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
2720: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
2730: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
2740: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
2750: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
2760: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
2770: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64  eturn the.** add
2780: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73  ress of the firs
2790: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65  t operation adde
27a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
27b0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56  3VdbeAddOpList(V
27c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c  dbe *p, int nOp,
27d0: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
27e0: 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61  t *aOp){.  int a
27f0: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
2800: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2810: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2820: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
2830: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a   p->nOpAlloc ){.
2840: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
2850: 79 28 70 2c 20 70 2d 3e 6e 4f 70 2a 32 20 2b 20  y(p, p->nOp*2 + 
2860: 6e 4f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nOp);.  }.  if( 
2870: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
2880: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
2890: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
28a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
28b0: 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  nOp>0 ){.    int
28c0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
28d0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
28e0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
28f0: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
2900: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
2910: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
2920: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
2930: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
2940: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
2950: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
2960: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
2970: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
2980: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
2990: 20 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41   p2<0 ? addr + A
29a0: 44 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20  DDR(p2) : p2;.  
29b0: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
29c0: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
29d0: 75 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e  ut->p3type = pIn
29e0: 2d 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43  ->p3 ? P3_STATIC
29f0: 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23   : P3_NOTUSED;.#
2a00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2a10: 55 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  UG.      if( sql
2a20: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
2a30: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  trace ){.       
2a40: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
2a50: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
2a60: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
2a70: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2a80: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
2a90: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
2aa0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2ab0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2ac0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
2ad0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
2ae0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
2af0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
2b00: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
2b10: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
2b20: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
2b30: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
2b40: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
2b50: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
2b60: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
2b70: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
2b80: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
2b90: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
2ba0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2bb0: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69  ngeP1(Vdbe *p, i
2bc0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
2bd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
2be0: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2bf0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2c00: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64  ;.  if( p && add
2c10: 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61  r>=0 && p->nOp>a
2c20: 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ddr && p->aOp ){
2c30: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
2c40: 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p1 = val;.  }.
2c50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2c60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2c70: 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P2 operand for 
2c80: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
2c90: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2ca0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2cb0: 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20  l for setting a 
2cc0: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
2cd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2ce0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
2cf0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2d00: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2d10: 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20  ert( val>=0 );. 
2d20: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2d30: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2d40: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2d50: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2d60: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2d70: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2d80: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
2d90: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2da0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2db0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
2dc0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
2dd0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2de0: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
2df0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
2e00: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
2e10: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
2e20: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e30: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
2e40: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
2e50: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
2e60: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
2e70: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
2e80: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
2e90: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
2ea0: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
2eb0: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
2ec0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
2ed0: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
2ee0: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
2ef0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
2f00: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46  emeralFunction(F
2f10: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
2f20: 20 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44   if( pDef && (pD
2f30: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
2f40: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
2f50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2f60: 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d  _free(pDef);.  }
2f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2f80: 20 61 20 50 33 20 76 61 6c 75 65 20 69 66 20 6e   a P3 value if n
2f90: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
2fa0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 33 28  tic void freeP3(
2fb0: 69 6e 74 20 70 33 74 79 70 65 2c 20 76 6f 69 64  int p3type, void
2fc0: 20 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20   *p3){.  if( p3 
2fd0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
2fe0: 33 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  3type ){.      c
2ff0: 61 73 65 20 50 33 5f 52 45 41 4c 3a 0a 20 20 20  ase P3_REAL:.   
3000: 20 20 20 63 61 73 65 20 50 33 5f 49 4e 54 36 34     case P3_INT64
3010: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  :.      case P3_
3020: 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63  MPRINTF:.      c
3030: 61 73 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a  ase P3_DYNAMIC:.
3040: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45        case P3_KE
3050: 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73  YINFO:.      cas
3060: 65 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  e P3_KEYINFO_HAN
3070: 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  DOFF: {.        
3080: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29  sqlite3_free(p3)
3090: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
30a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
30b0: 61 73 65 20 50 33 5f 56 44 42 45 46 55 4e 43 3a  ase P3_VDBEFUNC:
30c0: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46   {.        VdbeF
30d0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d  unc *pVdbeFunc =
30e0: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b   (VdbeFunc *)p3;
30f0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3100: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70  emeralFunction(p
3110: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
3120: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3130: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
3140: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
3150: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3160: 33 5f 66 72 65 65 28 70 56 64 62 65 46 75 6e 63  3_free(pVdbeFunc
3170: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3190: 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a  case P3_FUNCDEF:
31a0: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
31b0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
31c0: 28 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a  ((FuncDef*)p3);.
31d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
31f0: 65 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P3_MEM: {.    
3200: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
3210: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
3220: 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20  lue*)p3);.      
3230: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
3250: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
3260: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
3270: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
3280: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3290: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
32a0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
32b0: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
32c0: 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29  f( p && p->aOp )
32d0: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
32e0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
32f0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  ];.    while( N-
3300: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
3310: 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70  3(pOp->p3type, p
3320: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 6d  Op->p3);.      m
3330: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
3340: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
3350: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
3360: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
3370: 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pOp++;.    }. 
3380: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3390: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
33a0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
33b0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
33c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
33d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
33e0: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
33f0: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3400: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3410: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3420: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3430: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3440: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3450: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3460: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3470: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
3480: 68 65 6e 20 74 68 65 20 50 33 20 6f 70 65 72 61  hen the P3 opera
3490: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
34a0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
34b0: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
34c0: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
34d0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
34e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
34f0: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
3500: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
3510: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
3520: 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P3 up to and inc
3530: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
3540: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
3550: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
3560: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
3570: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50  3..**.** If n==P
3580: 33 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61  3_KEYINFO it mea
3590: 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73 20 61  ns that zP3 is a
35a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
35b0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  yInfo structure.
35c0: 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61  .** A copy is ma
35d0: 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66  de of the KeyInf
35e0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f  o structure into
35f0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
3600: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
3610: 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66  _malloc, to be f
3620: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
3630: 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e  be is finalized.
3640: 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  .** n==P3_KEYINF
3650: 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61  O_HANDOFF indica
3660: 74 65 73 20 74 68 61 74 20 7a 50 33 20 70 6f 69  tes that zP3 poi
3670: 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
3680: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74   structure.** st
3690: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74  ored in memory t
36a0: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
36b0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
36c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e   sqlite3_malloc.
36d0: 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   The .** caller 
36e0: 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20  should not free 
36f0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
3700: 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
3710: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
3720: 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a  s.** finalized..
3730: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
3740: 75 65 73 20 6f 66 20 6e 20 28 50 33 5f 53 54 41  ues of n (P3_STA
3750: 54 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 20  TIC, P3_COLLSEQ 
3760: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
3770: 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a 2a  hat zP3 points.*
3780: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
3790: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
37a0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
37b0: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
37c0: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
37d0: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
37e0: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
37f0: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
3800: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
3810: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
3820: 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P3 on the most 
3830: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
3840: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
3850: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3860: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
3870: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
3880: 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69  nst char *zP3, i
3890: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
38a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  ;.  assert( p==0
38b0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
38c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
38d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
38e0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 64  ->aOp==0 || p->d
38f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3900: 29 7b 0a 20 20 20 20 69 66 20 28 6e 20 21 3d 20  ){.    if (n != 
3910: 50 33 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20  P3_KEYINFO) {.  
3920: 20 20 20 20 66 72 65 65 50 33 28 6e 2c 20 28 76      freeP3(n, (v
3930: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
3940: 50 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P3);.    }.    r
3950: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
3960: 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e   addr<0 || addr>
3970: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61  =p->nOp ){.    a
3980: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
3990: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30  ;.    if( addr<0
39a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
39b0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
39c0: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 33 28 70  ddr];.  freeP3(p
39d0: 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d  Op->p3type, pOp-
39e0: 3e 70 33 29 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  >p3);.  pOp->p3 
39f0: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 33 3d 3d  = 0;.  if( zP3==
3a00: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  0 ){.    pOp->p3
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
3a20: 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53  3type = P3_NOTUS
3a30: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
3a40: 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P3_KEYINFO ){
3a50: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
3a60: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
3a70: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
3a80: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
3a90: 65 79 49 6e 66 6f 2a 29 7a 50 33 29 2d 3e 6e 46  eyInfo*)zP3)->nF
3aa0: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
3ab0: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
3ac0: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
3ad0: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
3ae0: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
3af0: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
3b00: 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  fo = sqlite3_mal
3b10: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
3b20: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61    pOp->p3 = (cha
3b30: 72 2a 29 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  r*)pKeyInfo;.   
3b40: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
3b50: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
3b60: 63 68 61 72 20 2a 61 53 6f 72 74 4f 72 64 65 72  char *aSortOrder
3b70: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
3b80: 4b 65 79 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42  KeyInfo, zP3, nB
3b90: 79 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  yte);.      aSor
3ba0: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
3bb0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
3bc0: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
3bd0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
3be0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3bf0: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
3c00: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
3c10: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
3c20: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
3c30: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3c40: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
3c50: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
3c60: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  }.      pOp->p3t
3c70: 79 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f  ype = P3_KEYINFO
3c80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3c90: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
3ca0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
3cb0: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3cc0: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P3_NOTUSED;.    
3cd0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
3ce0: 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P3_KEYINFO_HAND
3cf0: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
3d00: 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b  p3 = (char*)zP3;
3d10: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
3d20: 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P3_KEYINFO;. 
3d30: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29   }else if( n<0 )
3d40: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  {.    pOp->p3 = 
3d50: 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20  (char*)zP3;.    
3d60: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b  pOp->p3type = n;
3d70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3d80: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72  ( n==0 ) n = str
3d90: 6c 65 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f  len(zP3);.    pO
3da0: 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 33 44  p->p3 = sqlite3D
3db0: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
3dc0: 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP3, n);.    pOp
3dd0: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
3de0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
3df0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3e00: 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 50  ** Replace the P
3e10: 33 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  3 field of the m
3e20: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
3e30: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  ed instruction w
3e40: 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74  ith.** comment t
3e50: 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ext..*/.void sql
3e60: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
3e70: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
3e80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
3e90: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
3eb0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
3ec0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3ed0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
3ee0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d  Op[p->nOp-1].p3=
3ef0: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
3f00: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 76  locFailed );.  v
3f10: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
3f20: 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mat);.  sqlite3V
3f30: 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 2d  dbeChangeP3(p, -
3f40: 31 2c 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e  1, sqlite3VMPrin
3f50: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
3f60: 74 2c 20 61 70 29 2c 20 50 33 5f 44 59 4e 41 4d  t, ap), P3_DYNAM
3f70: 49 43 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  IC);.  va_end(ap
3f80: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
3f90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
3fa0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
3fb0: 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62   address..*/.Vdb
3fc0: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
3fd0: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
3fe0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
3ff0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4000: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4010: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
4020: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
4030: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
4040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
4050: 72 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30  return ((addr>=0
4060: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
4070: 3f 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29  ?(&p->aOp[addr])
4080: 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  :0);.}..#if !def
4090: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
40a0: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
40b0: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
40c0: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
40d0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
40e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
40f0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
4100: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
4110: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
4120: 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P3 parameter fo
4130: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
4140: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
4150: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
4160: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
4170: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
4180: 72 20 2a 64 69 73 70 6c 61 79 50 33 28 4f 70 20  r *displayP3(Op 
4190: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
41a0: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
41b0: 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73   char *zP3;.  as
41c0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
41d0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
41e0: 2d 3e 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p3type ){.    
41f0: 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a  case P3_KEYINFO:
4200: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
4210: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
4220: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65   *pKeyInfo = (Ke
4230: 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a  yInfo*)pOp->p3;.
4240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4250: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4260: 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64  emp, "keyinfo(%d
4270: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
4280: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
4290: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20  strlen(zTemp);. 
42a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
42b0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
42c0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
42d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
42e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
42f0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
4300: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
4310: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
4320: 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  en(pColl->zName)
4330: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4340: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
4350: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
4360: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
4370: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
4380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
43a0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
43b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
43c0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
43d0: 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f  rder && pKeyInfo
43e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
43f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
4400: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
4410: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4420: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
4430: 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e  Temp[i], pColl->
4440: 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20  zName,n+1);.    
4450: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
4460: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4470: 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+4<nTemp-6 ){. 
4480: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
4490: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22  &zTemp[i],",nil"
44a0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,4);.          i
44b0: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
44c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
44d0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
44e0: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
44f0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
4500: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
4510: 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b      zP3 = zTemp;
4520: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4530: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33 5f    }.    case P3_
4540: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
4550: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
4560: 3d 20 28 43 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d  = (CollSeq*)pOp-
4570: 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >p3;.      sqlit
4580: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4590: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
45a0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
45b0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
45c0: 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP3 = zTemp;.  
45d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
45e0: 0a 20 20 20 20 63 61 73 65 20 50 33 5f 46 55 4e  .    case P3_FUN
45f0: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75  CDEF: {.      Fu
4600: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 28 46  ncDef *pDef = (F
4610: 75 6e 63 44 65 66 2a 29 70 4f 70 2d 3e 70 33 3b  uncDef*)pOp->p3;
4620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4630: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4640: 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20  Temp, "%s(%d)", 
4650: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
4660: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
4670: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
4680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4690: 20 20 20 20 63 61 73 65 20 50 33 5f 49 4e 54 36      case P3_INT6
46a0: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
46b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
46c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
46d0: 2c 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  , *(sqlite3_int6
46e0: 34 2a 29 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  4*)pOp->p3);.   
46f0: 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a     zP3 = zTemp;.
4700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4710: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33 5f 52   }.    case P3_R
4720: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
4730: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4740: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
4750: 36 67 22 2c 20 2a 28 64 6f 75 62 6c 65 2a 29 70  6g", *(double*)p
4760: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 7a  Op->p3);.      z
4770: 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P3 = zTemp;.    
4780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4790: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
47a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
47b0: 20 20 20 20 63 61 73 65 20 50 33 5f 56 54 41 42      case P3_VTAB
47c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
47d0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
47e0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70  (sqlite3_vtab*)p
47f0: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71  Op->p3;.      sq
4800: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4810: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
4820: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
4830: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
4840: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
4850: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4860: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4870: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4880: 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e       zP3 = pOp->
4890: 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  p3;.      if( zP
48a0: 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  3==0 || pOp->opc
48b0: 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  ode==OP_Noop ){.
48c0: 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22          zP3 = ""
48d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
48e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
48f0: 33 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  3!=0 );.  return
4900: 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP3;.}.#endif..
4910: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
4920: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
4930: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
4940: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
4950: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69   used..**.*/.voi
4960: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
4970: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
4980: 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61  int i){.  int ma
4990: 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  sk;.  assert( i>
49a0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
49b0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
49c0: 69 3c 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  i<sizeof(p->btre
49d0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61  eMask)*8 );.  ma
49e0: 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20 69 66 28  sk = 1<<i;.  if(
49f0: 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
4a00: 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
4a10: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d   p->btreeMask |=
4a20: 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74   mask;.    sqlit
4a30: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
4a40: 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74  yInsert(&p->aMut
4a50: 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ex, p->db->aDb[i
4a60: 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ].pBt);.  }.}...
4a70: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
4a80: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
4a90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4aa0: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
4ab0: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
4ac0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4ad0: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
4ae0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
4af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
4b00: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
4b10: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
4b20: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a  ){.  char *zP3;.
4b30: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
4b40: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
4b50: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
4b60: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
4b70: 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  %4d %s\n";.  if(
4b80: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
4b90: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20  = stdout;.  zP3 
4ba0: 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c  = displayP3(pOp,
4bb0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
4bc0: 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  tr));.  fprintf(
4bd0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a  pOut, zFormat1,.
4be0: 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65        pc, sqlite
4bf0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
4c00: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
4c10: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29  1, pOp->p2, zP3)
4c20: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
4c30: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4c40: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
4c50: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
4c60: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
4c70: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
4c80: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
4c90: 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  N){.  if( p ){. 
4ca0: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20     while( N-->0 
4cb0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4cc0: 20 4e 3c 32 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d   N<2 || p[0].db=
4cd0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
4ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4cf0: 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20  Release(p++);.  
4d00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
4d10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
4d20: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
4d30: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
4d40: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
4d50: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
4d60: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
4d70: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
4d80: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
4d90: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
4da0: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
4db0: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
4dc0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
4dd0: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
4de0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
4df0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
4e00: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
4e10: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
4e20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4e30: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
4e40: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
4e50: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
4e60: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4e70: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
4e80: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
4e90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
4ea0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
4eb0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  in );.  if( p->m
4ec0: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
4ed0: 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51  _RUN ) return SQ
4ee0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61  LITE_MISUSE;.  a
4ef0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63  ssert( db->magic
4f00: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  ==SQLITE_MAGIC_B
4f10: 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  USY );.  assert(
4f20: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
4f30: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
4f40: 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a  TE_BUSY );..  /*
4f50: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
4f60: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
4f70: 74 20 70 75 74 20 64 79 6e 61 6d 69 63 20 73 74  t put dynamic st
4f80: 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20  rings onto the. 
4f90: 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c 20 74   ** the stack, t
4fa0: 68 65 79 20 6d 61 79 20 62 65 63 6f 6d 65 20 64  hey may become d
4fb0: 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73  ynamic if the us
4fc0: 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71  er calls.  ** sq
4fd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4fe0: 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61  t16(), causing a
4ff0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20   translation to 
5000: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e  UTF-16 encoding.
5010: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5020: 54 6f 73 3d 3d 26 70 2d 3e 61 53 74 61 63 6b 5b  Tos==&p->aStack[
5030: 34 5d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  4] ){.    releas
5040: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74  eMemArray(p->aSt
5050: 61 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 70  ack, 5);.  }.  p
5060: 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30  ->resOnStack = 0
5070: 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  ;..  do{.    i =
5080: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
5090: 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20  le( i<p->nOp && 
50a0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
50b0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
50c0: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
50d0: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70  .  if( i>=p->nOp
50e0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
50f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
5100: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
5110: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
5120: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
5130: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
5140: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
5150: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
5160: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
5170: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
5180: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  p->zErrMsg, sqli
5190: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
51a0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d  , (char*)0);.  }
51b0: 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  else{.    Op *pO
51c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
51d0: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
51e0: 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20 70  p->aStack;.    p
51f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5200: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
5210: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5220: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d  TEGER;.    pMem-
5230: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
5260: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
5270: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5280: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5290: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
52a0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70  |MEM_Term;.    p
52b0: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
52c0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
52d0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
52e0: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
52f0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
5300: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d  z!=0 );.    pMem
5310: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
5320: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  m->z);.    pMem-
5330: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5340: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  EXT;.    pMem->e
5350: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
5360: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5370: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5380: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
5390: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
53a0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
53c0: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  1 */.    pMem->t
53d0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
53e0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
53f0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
5400: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
5410: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
5420: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
5450: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5460: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
5470: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
5480: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68  >flags = MEM_Eph
5490: 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  em|MEM_Str|MEM_T
54a0: 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a  erm;   /* P3 */.
54b0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69      pMem->z = di
54c0: 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d 65  splayP3(pOp, pMe
54d0: 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f  m->zShort, sizeo
54e0: 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29  f(pMem->zShort))
54f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
5500: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
5510: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e  pMem->n = strlen
5520: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70  (pMem->z);.    p
5530: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5540: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
5550: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
5560: 55 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52  UTF8;..    p->nR
5570: 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32  esColumn = 5 - 2
5580: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
5590: 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70  .    p->pTos = p
55a0: 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  Mem;.    p->rc =
55b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
55c0: 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20  p->resOnStack = 
55d0: 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
55e0: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
55f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
5600: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5610: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
5620: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5630: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
5640: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
5650: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
5660: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
5670: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5680: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
5690: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
56a0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
56b0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
56c0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
56d0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f  pOp = &p->aOp[nO
56e0: 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p-1];.  if( pOp-
56f0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70  >opcode==OP_Noop
5700: 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29   && pOp->p3!=0 )
5710: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
5720: 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20   *z = pOp->p3;. 
5730: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
5740: 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b  e(*(u8*)z) ) z++
5750: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51  ;.    printf("SQ
5760: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
5770: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
5780: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5790: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
57a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
57b0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a  ENABLE_IOTRACE).
57c0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49  /*.** Print an I
57d0: 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73  OTRACE message s
57e0: 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65  howing SQL conte
57f0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
5800: 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71  te3VdbeIOTraceSq
5810: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
5820: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
5830: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
5840: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f   if( sqlite3_io_
5850: 74 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  trace==0 ) retur
5860: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
5870: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
5880: 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b   &p->aOp[nOp-1];
5890: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
58a0: 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70  de==OP_Noop && p
58b0: 4f 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20  Op->p3!=0 ){.   
58c0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
58d0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
58e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
58f0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
5900: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a  "%s", pOp->p3);.
5910: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73      for(i=0; iss
5920: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
5930: 68 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  har)z[i]); i++){
5940: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
5950: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
5960: 20 69 66 28 20 69 73 73 70 61 63 65 28 28 75 6e   if( isspace((un
5970: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d  signed char)z[i]
5980: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
5990: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
59a0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
59b0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
59c0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
59d0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
59e0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
59f0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
5a00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f  ;.    sqlite3_io
5a10: 5f 74 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  _trace("SQL %s\n
5a20: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
5a30: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
5a40: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
5a50: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
5a60: 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72  CE */.../*.** Pr
5a70: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
5a80: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
5a90: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
5aa0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
5ab0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
5ac0: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
5ad0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
5ae0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
5af0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
5b00: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
5b10: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
5b20: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
5b30: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
5b40: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
5b50: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
5b60: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
5b70: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
5b80: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
5b90: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
5ba0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
5bb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5bc0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
5bd0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5bf0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
5c00: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5c20: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
5c30: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
5c40: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
5c50: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5c70: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
5c80: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
5c90: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
5ca0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
5cb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5cc0: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
5cd0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
5ce0: 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20  isExplain       
5cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
5d00: 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49  ue if the EXPLAI
5d10: 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72  N keywords is pr
5d20: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  esent */.){.  in
5d30: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
5d40: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61  db = p->db;..  a
5d50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
5d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5d70: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5d80: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
5d90: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
5da0: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
5db0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
5dc0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
5dd0: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
5de0: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
5df0: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
5e00: 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73  than later. This
5e10: 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73 65  .   * is because
5e20: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73   the call to res
5e30: 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c  izeOpArray() bel
5e40: 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68  ow may shrink th
5e50: 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20  e.   * p->aOp[] 
5e60: 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65  array to save me
5e70: 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77  mory if called w
5e80: 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49  hen in VDBE_MAGI
5e90: 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74  C_RUN .   * stat
5ea0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61  e..   */.  p->ma
5eb0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
5ec0: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69  _RUN;..  /* No i
5ed0: 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20  nstruction ever 
5ee0: 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e  pushes more than
5ef0: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
5f00: 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  t onto the.  ** 
5f10: 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20  stack.  And the 
5f20: 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77  stack never grow
5f30: 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20  s on successive 
5f40: 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68  executions of th
5f50: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70  e.  ** same loop
5f60: 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20  .  So the total 
5f70: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75  number of instru
5f80: 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70  ctions is an upp
5f90: 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e  er bound.  ** on
5fa0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61   the maximum sta
5fb0: 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72 65  ck depth require
5fc0: 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65 72  d.  (Added later
5fd0: 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73  :)  The.  ** res
5fe0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20 63  olveP2Values() c
5ff0: 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74  all computes a t
6000: 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f 75  ighter upper bou
6010: 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73  nd on the.  ** s
6020: 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a  tack size..  **.
6030: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20    ** Allocation 
6040: 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70  all the stack sp
6050: 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72  ace we will ever
6060: 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   need..  */.  if
6070: 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29  ( p->aStack==0 )
6080: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20  {.    int nArg; 
6090: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
60a0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
60b0: 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72  passed to a user
60c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
60d0: 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20    int nStack;   
60e0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
60f0: 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74  ber of stack ent
6100: 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f  ries required */
6110: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
6120: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26  lues(p, &nArg, &
6130: 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73  nStack);.    res
6140: 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d  izeOpArray(p, p-
6150: 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72  >nOp);.    asser
6160: 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20  t( nVar>=0 );.  
6170: 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b    assert( nStack
6180: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69  <p->nOp );.    i
6190: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a  f( isExplain ){.
61a0: 20 20 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 31        nStack = 1
61b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
61c0: 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  aStack = sqlite3
61d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
61e0: 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b 2a  .        nStack*
61f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b  sizeof(p->aStack
6200: 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61 63  [0])    /* aStac
6210: 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72  k */.      + nAr
6220: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20  g*sizeof(Mem*)  
6230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6240: 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20  pArg */.      + 
6250: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6270: 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20  * aVar */.      
6280: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  + nVar*sizeof(ch
6290: 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  ar*)            
62a0: 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20   /* azVar */.   
62b0: 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66     + nMem*sizeof
62c0: 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20  (Mem)           
62d0: 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20      /* aMem */. 
62e0: 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73       + nCursor*s
62f0: 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 20  izeof(Cursor*)  
6300: 20 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a        /* apCsr *
6310: 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  /.    );.    if(
6320: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
6330: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
6340: 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Mem = &p->aStack
6350: 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20  [nStack];.      
6360: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a  p->nMem = nMem;.
6370: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
6380: 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a  &p->aMem[nMem];.
6390: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
63a0: 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  nVar;.      p->o
63b0: 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  kVar = 0;.      
63c0: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a  p->apArg = (Mem*
63d0: 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d  *)&p->aVar[nVar]
63e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
63f0: 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61   = (char**)&p->a
6400: 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20  pArg[nArg];.    
6410: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75    p->apCsr = (Cu
6420: 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72  rsor**)&p->azVar
6430: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
6440: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
6450: 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  or;.      for(n=
6460: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
6470: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
6480: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
6490: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
64a0: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
64b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
64c0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 53 74 61 63  for(n=0; n<nStac
64d0: 6b 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; n++){.       
64e0: 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 5d 2e 64 62   p->aStack[n].db
64f0: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
6500: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e     }.  }.  for(n
6510: 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e  =0; n<p->nMem; n
6520: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  ++){.    p->aMem
6530: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
6540: 4e 75 6c 6c 3b 0a 20 20 20 20 70 2d 3e 61 4d 65  Null;.    p->aMe
6550: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
6560: 7d 0a 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26  }..  p->pTos = &
6570: 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20  p->aStack[-1];. 
6580: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
6590: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
65a0: 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74  ;.  p->uniqueCnt
65b0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72   = 0;.  p->retur
65c0: 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  nDepth = 0;.  p-
65d0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
65e0: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f  E_Abort;.  p->po
65f0: 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70  pStack =  0;.  p
6600: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
6610: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
6620: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
6630: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
6640: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
6650: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
6660: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
6670: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70  t = 255;.  p->op
6680: 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20  enedStatement = 
6690: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
66a0: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69  ROFILE.  {.    i
66b0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
66c0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
66d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  ){.      p->aOp[
66e0: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
66f0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
6700: 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  es = 0;.    }.  
6710: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
6720: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
6730: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
6740: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
6750: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
6760: 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f  happens.** to ho
6770: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
6780: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
6790: 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73 6f  r(Vdbe *p, Curso
67a0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
67b0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
67c0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
67d0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
67e0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
67f0: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
6800: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
6810: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
6820: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6830: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
6840: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
6850: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6860: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
6870: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
6880: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
6890: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
68a0: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
68b0: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
68c0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
68d0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
68e0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
68f0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
6900: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   1;.    sqlite3S
6910: 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b  afetyOff(p->db);
6920: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
6930: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
6940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  );.    sqlite3Sa
6950: 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20  fetyOn(p->db);. 
6960: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
6970: 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  od = 0;.  }.#end
6980: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
6990: 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pCx->pData);. 
69a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
69b0: 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c  x->aType);.  sql
69c0: 69 74 65 33 5f 66 72 65 65 28 70 43 78 29 3b 0a  ite3_free(pCx);.
69d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
69e0: 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70  ll cursors excep
69f0: 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73 6f  t for VTab curso
6a00: 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  rs that are curr
6a10: 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e  ently.** in use.
6a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6a30: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
6a40: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
6a50: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6a60: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
6a70: 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  sr==0 ) return;.
6a80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6a90: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
6aa0: 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20     Cursor *pC = 
6ab0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
6ac0: 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d 3e   if( pC && (!p->
6ad0: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20  inVtabMethod || 
6ae0: 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  !pC->pVtabCursor
6af0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
6b00: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
6b10: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70  (p, pC);.      p
6b20: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
6b30: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
6b40: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
6b50: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
6b60: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
6b70: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
6b80: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
6b90: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
6ba0: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
6bb0: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
6bc0: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
6bd0: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
6be0: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
6bf0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
6c00: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
6c10: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
6c20: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  up(Vdbe *p){.  i
6c30: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
6c40: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c  Stack ){.    rel
6c50: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
6c60: 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e  aStack, 1 + (p->
6c70: 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b  pTos - p->aStack
6c80: 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20  ));.    p->pTos 
6c90: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d  = &p->aStack[-1]
6ca0: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
6cb0: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
6cc0: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 72  iveVtabs(p);.  r
6cd0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
6ce0: 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
6cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46  ;.  sqlite3VdbeF
6d00: 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69  ifoClear(&p->sFi
6d10: 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f  fo);.  if( p->co
6d20: 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20  ntextStack ){.  
6d30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6d40: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b  contextStackTop;
6d50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6d60: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
6d70: 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  r(&p->contextSta
6d80: 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20  ck[i].sFifo);.  
6d90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
6da0: 66 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53  free(p->contextS
6db0: 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  tack);.  }.  p->
6dc0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30  contextStack = 0
6dd0: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
6de0: 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  ackDepth = 0;.  
6df0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54  p->contextStackT
6e00: 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  op = 0;.  sqlite
6e10: 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  3_free(p->zErrMs
6e20: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
6e30: 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 73 4f 6e   = 0;.  p->resOn
6e40: 53 74 61 63 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Stack = 0;.}../*
6e50: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
6e60: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
6e70: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
6e80: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
6e90: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
6ea0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
6eb0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
6ec0: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
6ed0: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
6ee0: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
6ef0: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
6f00: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
6f10: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
6f20: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
6f30: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
6f40: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
6f50: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
6f60: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
6f70: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
6f80: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
6f90: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
6fa0: 69 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73  int n;..  releas
6fb0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
6fc0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
6fd0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
6fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6ff0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
7000: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
7010: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
7020: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73  ResColumn = nRes
7030: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
7040: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
7050: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
7060: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e  DbMallocZero(p->
7070: 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
7080: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
7090: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
70a0: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
70b0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c   > 0 ){.    pCol
70c0: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  Name->flags = ME
70d0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c  M_Null;.    pCol
70e0: 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  Name->db = p->db
70f0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b  ;.    pColName++
7100: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
7110: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  et the name of t
7120: 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e  he idx'th column
7130: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
7140: 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  by the SQL state
7150: 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d  ment..** zName m
7160: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
7170: 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e   to a nul termin
7180: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  ated string..**.
7190: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73  ** This call mus
71a0: 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20  t be made after 
71b0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
71c0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
71d0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50  )..**.** If N==P
71e0: 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65 61  3_STATIC  it mea
71f0: 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73  ns that zName is
7200: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7210: 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a  constant static.
7220: 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65  ** string and we
7230: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
7240: 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69  he pointer. If i
7250: 74 20 69 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c  t is P3_DYNAMIC,
7260: 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74   then .** the st
7270: 72 69 6e 67 20 69 73 20 66 72 65 65 64 20 75 73  ring is freed us
7280: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
7290: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
72a0: 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74   is finished wit
72b0: 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69  h.** it. Otherwi
72c0: 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a  se, N bytes of z
72d0: 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e  Name are copied.
72e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
72f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64  dbeSetColName(Vd
7300: 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  be *p, int idx, 
7310: 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63  int var, const c
7320: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
7330: 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  N){.  int rc;.  
7340: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
7350: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
7360: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
7370: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
7380: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
7390: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
73a0: 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
73b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65  TE_NOMEM;.  asse
73c0: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
73d0: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
73e0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
73f0: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
7400: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20  Column]);.  if( 
7410: 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c  N==P3_DYNAMIC ||
7420: 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b   N==P3_STATIC ){
7430: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7440: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
7450: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
7460: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
7470: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
7480: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
7490: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
74a0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
74b0: 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49  , zName, N, SQLI
74c0: 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
74d0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20  RANSIENT);.  }. 
74e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
74f0: 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41  OK && N==P3_DYNA
7500: 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  MIC ){.    pColN
7510: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43  ame->flags = (pC
7520: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e  olName->flags&(~
7530: 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d  MEM_Static))|MEM
7540: 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  _Dyn;.    pColNa
7550: 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  me->xDel = 0;.  
7560: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7570: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
7580: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
7590: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
75a0: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
75b0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
75c0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
75d0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
75e0: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
75f0: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
7600: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
7610: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
7620: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
7630: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
7640: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
7650: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
7660: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
7670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7680: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
7690: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
76a0: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
76b0: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
76c0: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
76d0: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
76e0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
76f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7700: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
7710: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  Xcommit = 0;..  
7720: 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
7730: 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
7740: 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
7750: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
7760: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
7770: 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
7780: 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
7790: 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
77a0: 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
77b0: 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
77c0: 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
77d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
77e0: 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
77f0: 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
7800: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
7810: 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
7820: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
7830: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
7840: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
7850: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
7860: 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20 72 63  b, rc);.  if( rc
7870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7880: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7890: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  }..  /* This loo
78a0: 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
78b0: 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
78c0: 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
78d0: 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
78e0: 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
78f0: 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
7900: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
7910: 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
7920: 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
7930: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
7940: 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
7950: 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
7960: 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
7970: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
7980: 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
7990: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
79a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
79b0: 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
79c0: 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
79d0: 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
79e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
79f0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
7a00: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
7a10: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7a20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
7a30: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
7a40: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
7a50: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
7a60: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
7a70: 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ns++;.    }.  }.
7a80: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
7a90: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
7aa0: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
7ab0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
7ac0: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
7ad0: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
7ae0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
7af0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
7b00: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
7b10: 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  ;.    rc = db->x
7b20: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
7b30: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
7b40: 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74      sqlite3Safet
7b50: 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28  yOn(db);.    if(
7b60: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
7b70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
7b80: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  RAINT;.    }.  }
7b90: 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
7ba0: 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
7bb0: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
7bc0: 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
7bd0: 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
7be0: 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
7bf0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
7c00: 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
7c10: 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
7c20: 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
7c30: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
7c40: 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
7c50: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
7c60: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
7c70: 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
7c80: 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
7c90: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
7ca0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
7cb0: 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61  memory:.  In tha
7cc0: 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a  t case we do.  *
7cd0: 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  * not support at
7ce0: 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
7cf0: 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
7d00: 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  the simple case 
7d10: 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20  then.  ** too.. 
7d20: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72   */.  if( 0==str
7d30: 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  len(sqlite3Btree
7d40: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
7d50: 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20  aDb[0].pBt)) || 
7d60: 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20  nTrans<=1 ){.   
7d70: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
7d80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
7d90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
7da0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
7db0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
7dc0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
7dd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7de0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
7df0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
7e00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7e10: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
7e20: 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
7e30: 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
7e40: 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
7e50: 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
7e60: 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
7e70: 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
7e80: 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
7e90: 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
7ea0: 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
7eb0: 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
7ec0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
7ed0: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
7ee0: 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
7ef0: 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
7f00: 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
7f10: 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
7f20: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
7f30: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
7f40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
7f50: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
7f60: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
7f70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
7f80: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
7f90: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
7fa0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
7fb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7fc0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
7fd0: 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20  Two(pBt);.      
7fe0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7ff0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
8010: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
8020: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
8030: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
8040: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
8050: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
8060: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
8070: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
8080: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
8090: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
80a0: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
80b0: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
80c0: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
80d0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
80e0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
80f0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
8100: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
8110: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
8120: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
8130: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
8140: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
8150: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
8160: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
8170: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
8180: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
8190: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
81a0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
81b0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
81c0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
81d0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
81e0: 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  et = 0;..    /* 
81f0: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
8200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
8210: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
8220: 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a      u32 random;.
8230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8240: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8250: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
8260: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64  ness(sizeof(rand
8270: 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20  om), &random);. 
8280: 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73       zMaster = s
8290: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
82a0: 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a  , "%s-mj%08X", z
82b0: 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d  MainFile, random
82c0: 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20  &0x7fffffff);.  
82d0: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
82e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
82f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
8310: 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 41 63  ile( sqlite3OsAc
8320: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
8330: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
8340: 53 5f 45 58 49 53 54 53 29 20 29 3b 0a 0a 20 20  S_EXISTS) );..  
8350: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
8360: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
8370: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8380: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
8390: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
83a0: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
83b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
83c0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
83d0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
83e0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
83f0: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
8400: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
8410: 41 4c 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20  AL, 0.    );.   
8420: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8430: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
8440: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8450: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8460: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
8470: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
8480: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
8490: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
84a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
84b0: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
84c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
84d0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
84e0: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
84f0: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
8500: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
8510: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8520: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
8530: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
8540: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
8550: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
8560: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
8570: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
8580: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
8590: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
85a0: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
85b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
85c0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
85d0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
85e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
85f0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8600: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8610: 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  ( i==1 ) continu
8620: 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  e;   /* Ignore t
8630: 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
8640: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
8650: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
8660: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
8670: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
8680: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
8690: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
86a0: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
86b0: 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30   if( zFile[0]==0
86c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
86d0: 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a   Ignore :memory:
86e0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
86f0: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
8700: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
8710: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
8720: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
8730: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
8740: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8750: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8760: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
8770: 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46  zFile, strlen(zF
8780: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
8790: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
87a0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  += strlen(zFile)
87b0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
87c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
87d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
87e0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
87f0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
8800: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
8810: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
8820: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
8830: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
8840: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
8850: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
8860: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8870: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
8880: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8890: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
88a0: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
88b0: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
88c0: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
88d0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
88e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69  .    */.    zMai
88f0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
8900: 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64  treeGetDirname(d
8910: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
8920: 20 20 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e      if( (needSyn
8930: 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28  c .     && (0==(
8940: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
8950: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
8960: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
8970: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
8980: 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73 71  ).     && (rc=sq
8990: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
89a0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
89b0: 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54  _NORMAL))!=SQLIT
89c0: 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73  E_OK) ){.      s
89d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
89e0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
89f0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
8a00: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
8a10: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8a20: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
8a30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8a40: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
8a50: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
8a60: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
8a70: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
8a80: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
8a90: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
8aa0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8ab0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
8ac0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
8ad0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
8ae0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
8af0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
8b00: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8b10: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
8b20: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
8b30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
8b40: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
8b50: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
8b60: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
8b70: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
8b80: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
8b90: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
8ba0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
8bb0: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
8bc0: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
8bd0: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
8be0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
8bf0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8c00: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
8c10: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
8c20: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
8c30: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
8c40: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  e failure occure
8c50: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8c60: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
8c70: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
8c80: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
8c90: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8ca0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8cb0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
8cc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8cd0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8ce0: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
8cf0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
8d00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
8d10: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
8d20: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
8d30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8d40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8d50: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
8d60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
8d70: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
8d80: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8d90: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
8da0: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
8db0: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
8dc0: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
8dd0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
8de0: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
8df0: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
8e00: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
8e10: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
8e20: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
8e30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8e40: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
8e50: 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
8e60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
8e70: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
8e80: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
8e90: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
8ea0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
8eb0: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
8ec0: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
8ed0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
8ee0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
8ef0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
8f00: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
8f10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
8f20: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
8f30: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
8f40: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
8f50: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
8f60: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
8f70: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
8f80: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
8f90: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
8fa0: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
8fb0: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
8fc0: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
8fd0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
8fe0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
8ff0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
9000: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
9010: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
9020: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
9030: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
9040: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
9050: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
9060: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
9070: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
9080: 6f 72 73 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  ors();.    for(i
9090: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
90a0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
90b0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
90c0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
90d0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
90e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
90f0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
9100: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9110: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
9120: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
9130: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
9140: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
9150: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
9160: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
9170: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9180: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
9190: 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62  qlite3.activeVdb
91a0: 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61  eCnt count varia
91b0: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
91c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
91d0: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
91e0: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
91f0: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
9200: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
9210: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
9220: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
9230: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
9240: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
9250: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
9260: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
9270: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
9280: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
9290: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
92a0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
92b0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
92c0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
92d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
92e0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
92f0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
9300: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
9310: 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  nt = 0;.  p = db
9320: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
9330: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
9340: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9350: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
9360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
9370: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
9380: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
9390: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
93a0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
93b0: 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
93c0: 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
93d0: 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
93e0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  ../*.** For ever
93f0: 79 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20  y Btree that in 
9400: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9410: 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a  ion db which .**
9420: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
9430: 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e  ed, "trip" or in
9440: 76 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75  validate each cu
9450: 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20  rsor in.** that 
9460: 42 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65  Btree might have
9470: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73   been modified s
9480: 6f 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  o that the curso
9490: 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62  r.** can never b
94a0: 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54  e used again.  T
94b0: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
94c0: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20   a rollback.*** 
94d0: 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65  occurs.  We have
94e0: 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65   to trip all the
94f0: 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20   other cursors, 
9500: 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66  even.** cursor f
9510: 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e  rom other VMs in
9520: 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62   different datab
9530: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c  ase connections,
9540: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65  .** so that none
9550: 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20   of them try to 
9560: 75 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20  use the data at 
9570: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65  which they.** we
9580: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20  re pointing and 
9590: 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61  which now may ha
95a0: 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  ve been changed 
95b0: 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f  due.** to the ro
95c0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65  llback..**.** Re
95d0: 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f  member that a ro
95e0: 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74  llback can delet
95f0: 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74  e tables complet
9600: 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72  e and.** reorder
9610: 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20   rootpages.  So 
9620: 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
9630: 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76  ient just to sav
9640: 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f  e.** the state o
9650: 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57  f the cursor.  W
9660: 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69  e have to invali
9670: 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a  date the cursor.
9680: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  ** so that it is
9690: 20 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69   never used agai
96a0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
96b0: 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73  d invalidateCurs
96c0: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
96d0: 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ees(sqlite3 *db)
96e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
96f0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
9700: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
9710: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
9720: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
9730: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
9740: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
9750: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
9760: 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
9770: 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29  p, SQLITE_ABORT)
9780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
97a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
97b0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
97c0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
97d0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
97e0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
97f0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
9800: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
9810: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
9820: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
9830: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
9840: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
9850: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
9860: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
9870: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
9880: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
9890: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
98a0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
98b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
98c0: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
98d0: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
98e0: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
98f0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
9900: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
9910: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
9920: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
9930: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
9940: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
9950: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
9960: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
9970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
9980: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
9990: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
99a0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
99b0: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
99c0: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
99d0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
99e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
99f0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
9a00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9a10: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
9a20: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74   int (*xFunc)(Bt
9a30: 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20  ree *pBt) = 0;  
9a40: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
9a50: 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65  all on each btre
9a60: 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69  e backend */.  i
9a70: 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
9a80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
9a90: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
9aa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
9ab0: 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54  IOERR */..  /* T
9ac0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
9ad0: 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
9ae0: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
9af0: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
9b00: 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
9b10: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
9b20: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
9b30: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
9b40: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
9b50: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
9b60: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
9b70: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
9b80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
9b90: 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
9ba0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
9bb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
9bc0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
9bd0: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
9be0: 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
9bf0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
9c00: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
9c10: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
9c20: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
9c30: 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
9c40: 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
9c50: 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
9c60: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
9c70: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
9c80: 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
9c90: 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
9ca0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
9cb0: 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
9cc0: 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
9cd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
9ce0: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
9cf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9d00: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
9d10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9d20: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
9d30: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
9d40: 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
9d50: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
9d60: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
9d70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9d80: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
9d90: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
9da0: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
9db0: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
9dc0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
9dd0: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
9de0: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
9df0: 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
9e00: 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
9e10: 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
9e20: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
9e30: 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
9e40: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
9e50: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
9e60: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45  BtreeMutexArrayE
9e70: 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29  nter(&p->aMutex)
9e80: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
9e90: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
9ea0: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
9eb0: 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
9ec0: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
9ed0: 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
9ee0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9ef0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
9f00: 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
9f10: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
9f20: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
9f30: 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
9f40: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
9f50: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
9f60: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
9f70: 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63  loop does static
9f80: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65   analysis of the
9f90: 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77 68   query to see wh
9fa0: 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ich of the.     
9fb0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
9fc0: 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20 69  ree categories i
9fd0: 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20  t falls into:.  
9fe0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9ff0: 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20      Read-only.  
a000: 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79      **     Query
a010: 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20   with statement 
a020: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
a030: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 6f       Query witho
a040: 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ut statement jou
a050: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rnal.      **.  
a060: 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20      ** We could 
a070: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72  do something mor
a080: 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74  e elegant than t
a090: 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  his static analy
a0a0: 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20  sis (i.e..      
a0b0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79 70  ** store the typ
a0c0: 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70 61  e of query as pa
a0d0: 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69  rt of the compli
a0e0: 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75  ation phase), bu
a0f0: 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  t .      ** hand
a100: 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  ling malloc() or
a110: 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61   IO failure is a
a120: 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
a130: 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20  edge case so .  
a140: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70      ** this is p
a150: 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20  robably easier. 
a160: 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61  Todo: Might be a
a170: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
a180: 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a   reduce .      *
a190: 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65  * code size a ve
a1a0: 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20  ry small amount 
a1b0: 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20  though....      
a1c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74  */.      int not
a1d0: 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  ReadOnly = 0;.  
a1e0: 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d      int isStatem
a1f0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ent = 0;.      a
a200: 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20  ssert(p->aOp || 
a210: 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20  p->nOp==0);.    
a220: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a230: 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nOp; i++){ .    
a240: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61      switch( p->a
a250: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a  Op[i].opcode ){.
a260: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
a270: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  P_Transaction:. 
a280: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65             notRe
a290: 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70  adOnly |= p->aOp
a2a0: 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20  [i].p2;.        
a2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a2c0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
a2d0: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
a2e0: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
a2f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
a300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a310: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20  }.      }..   . 
a320: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
a330: 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
a340: 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e  ly, we need do n
a350: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c  o rollback at al
a360: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
a370: 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77      ** proceed w
a380: 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
a390: 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20  handling..      
a3a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74  */.      if( not
a3b0: 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  ReadOnly || mrc!
a3c0: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
a3d0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
a3e0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49   p->rc==SQLITE_I
a3f0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20  OERR_BLOCKED && 
a400: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
a410: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
a420: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a430: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
a440: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
a450: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
a460: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72    } else if( (mr
a470: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a480: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
a490: 55 4c 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d  ULL) && isStatem
a4a0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a4b0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a4c0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a4d0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
a4e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
a4f0: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
a500: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
a510: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
a520: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
a530: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
a540: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
a550: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
a560: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
a570: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
a580: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a590: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
a5a0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
a5b0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
a5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
a5d0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
a5e0: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
a5f0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
a600: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a610: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
a620: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
a630: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
a640: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
a650: 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74 68   active vdbe, th
a660: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  en.    ** we do 
a670: 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
a680: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
a690: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
a6a0: 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
a6b0: 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
a6c0: 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
a6d0: 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
a6e0: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
a6f0: 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
a700: 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65 64  bove has occured
a710: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
a720: 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
a730: 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64   && db->activeVd
a740: 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  beCnt==1 ){.    
a750: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a760: 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
a770: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
a780: 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
a790: 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
a7a0: 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
a7b0: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
a7c0: 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20  e, and the vdbe 
a7d0: 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20  program was .   
a7e0: 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66       ** successf
a7f0: 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ul or hit an 'OR
a800: 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
a810: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  t. This means a 
a820: 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
a830: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ** is required..
a840: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a850: 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65     int rc = vdbe
a860: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
a870: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a880: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
a890: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
a8a0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
a8b0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
a8c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a8d0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a8e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
a8f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a900: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
a910: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
a920: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
a930: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
a940: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a950: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
a960: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
a970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a990: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
a9a0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
a9b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
a9c0: 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  xFunc ){.      i
a9d0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
a9e0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
a9f0: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
aa00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
aa10: 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
aa20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
aa30: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
aa40: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20  eeCommitStmt;.  
aa50: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
aa60: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
aa70: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
aa80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75  t ){.        xFu
aa90: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
aaa0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
aab0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aac0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
aad0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
aae0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
aaf0: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
ab00: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
ab10: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
ab20: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
ab30: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
ab40: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
ab50: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
ab60: 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  one of sqlite3Bt
ab70: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20  reeRollbackStmt 
ab80: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
ab90: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
aba0: 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f  . Call it once o
abb0: 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20  n each backend. 
abc0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
abd0: 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  rs.    ** and th
abe0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
abf0: 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b   still SQLITE_OK
ac00: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
ac10: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
ac20: 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61  .    ** error va
ac30: 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
ac40: 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c  assert(!xFunc ||
ac50: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
ac60: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ac70: 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46  Stmt ||.      xF
ac80: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
ac90: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20  eRollbackStmt.  
aca0: 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30    );.    for(i=0
acb0: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
acc0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
acd0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
ace0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
acf0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ad00: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ad10: 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e         rc = xFun
ad20: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  c(pBt);.        
ad30: 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63  if( rc && (p->rc
ad40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
ad50: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->rc==SQLITE_CON
ad60: 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20  STRAINT) ){.    
ad70: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
ad80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ad90: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
ada0: 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20  >zErrMsg, 0);.  
adb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
adc0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
add0: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
ade0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
adf0: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
ae00: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f  statement was co
ae10: 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a  mmitted, .    **
ae20: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
ae30: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
ae40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
ae50: 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63  geCntOn && p->pc
ae60: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
ae70: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
ae80: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
ae90: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
aea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
aeb0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
aec0: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
aed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aee0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
aef0: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
af00: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
af10: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
af20: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
af30: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
af40: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
af50: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
af60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
af70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
af80: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
af90: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
afa0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
afb0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
afc0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
afd0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
afe0: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
aff0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
b000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
b010: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
b020: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
b030: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
b040: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
b050: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
b060: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
b070: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
b080: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
b090: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
b0a0: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
b0b0: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
b0c0: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20  VdbeCnt--;.  }. 
b0d0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b0e0: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
b0f0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b100: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
b110: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b120: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b130: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b140: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
b150: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72  dbeCnt(db);..  r
b160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b170: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
b180: 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
b190: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
b1a0: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
b1b0: 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
b1c0: 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
b1d0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
b1e0: 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
b1f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
b200: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
b210: 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
b220: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
b230: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
b240: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
b250: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
b260: 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
b270: 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
b280: 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
b290: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
b2a0: 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
b2b0: 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
b2c0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
b2d0: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
b2e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
b2f0: 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
b300: 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
b310: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
b320: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
b330: 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
b340: 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
b350: 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
b360: 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
b370: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
b380: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
b390: 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
b3a0: 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
b3b0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
b3c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
b3d0: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
b3e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
b3f0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
b400: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
b410: 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
b420: 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
b430: 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
b440: 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
b450: 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
b460: 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
b470: 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
b480: 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
b490: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 61    */.  sqlite3Sa
b4a0: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71  fetyOn(db);.  sq
b4b0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
b4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  ;.  sqlite3Safet
b4d0: 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  yOff(db);..  /* 
b4e0: 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
b4f0: 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
b500: 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
b510: 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
b520: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
b530: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
b540: 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
b550: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
b560: 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
b570: 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
b580: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
b590: 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
b5a0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
b5b0: 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
b5c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
b5d0: 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
b5e0: 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
b5f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
b600: 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
b610: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
b620: 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73     if( p->zErrMs
b630: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
b640: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
b650: 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
b660: 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
b670: 2c 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a  ,sqlite3_free);.
b680: 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
b690: 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
b6a0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
b6b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b6c0: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
b6d0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
b6e0: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
b6f0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b700: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b710: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
b720: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
b730: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
b740: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
b750: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
b760: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
b770: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b780: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
b790: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
b7a0: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
b7b0: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
b7c0: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
b7d0: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
b7e0: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
b7f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
b800: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
b810: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
b820: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
b830: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
b840: 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
b850: 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
b860: 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69  QLITE_UTF8, sqli
b870: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 70  te3_free);.    p
b880: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
b890: 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
b8a0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
b8b0: 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
b8c0: 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
b8d0: 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
b8e0: 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
b8f0: 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
b900: 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  run..  */.  asse
b910: 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e  rt( p->pTos<&p->
b920: 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30  aStack[p->pc<0?0
b930: 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61  :p->pc] || !p->a
b940: 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20  Stack );.#ifdef 
b950: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
b960: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
b970: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
b980: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
b990: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
b9a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
b9b0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
b9c0: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
b9d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
b9e0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
b9f0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
ba00: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
ba10: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
ba20: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
ba30: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
ba40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ba50: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
ba60: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
ba70: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
ba80: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
ba90: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
baa0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
bab0: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
bac0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
bad0: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
bae0: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
baf0: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
bb00: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
bb10: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
bb20: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
bb30: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
bb40: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
bb50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bb60: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
bb70: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
bb80: 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30    p->aborted = 0
bb90: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
bba0: 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
bbb0: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
bbc0: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
bbd0: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
bbe0: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
bbf0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bc00: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
bc10: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
bc20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
bc30: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
bc40: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
bc50: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
bc60: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
bc70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bc80: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
bc90: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
bca0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
bcb0: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
bcc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
bcd0: 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
bce0: 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
bcf0: 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
bd00: 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c );.  }else if(
bd10: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
bd20: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
bd30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bd40: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
bd50: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
bd60: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
bd70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
bd80: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
bd90: 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
bda0: 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
bdb0: 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
bdc0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
bdd0: 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
bde0: 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
bdf0: 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
be00: 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
be10: 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
be20: 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
be30: 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
be40: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
be50: 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
be60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
be70: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
be80: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
be90: 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
bea0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
beb0: 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
bec0: 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
bed0: 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
bee0: 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
bef0: 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
bf00: 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
bf10: 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26  (mask&(1<<i))) &
bf20: 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
bf30: 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
bf40: 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
bf50: 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
bf60: 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
bf70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
bf80: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
bf90: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
bfa0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
bfb0: 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
bfc0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
bfd0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
bfe0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
bff0: 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75  return;.  Cleanu
c000: 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  p(p);.  if( p->p
c010: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
c020: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
c030: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
c040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c050: 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
c060: 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65      p->db->pVdbe
c070: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
c080: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
c090: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
c0a0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
c0b0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  v;.  }.  if( p->
c0c0: 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  aOp ){.    for(i
c0d0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
c0e0: 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f  +){.      Op *pO
c0f0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
c100: 20 20 20 20 20 20 66 72 65 65 50 33 28 70 4f 70        freeP3(pOp
c110: 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p3type, pOp->p
c120: 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  3);.    }.    sq
c130: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f  lite3_free(p->aO
c140: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  p);.  }.  releas
c150: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
c160: 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73  r, p->nVar);.  s
c170: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c180: 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
c190: 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b  3_free(p->aStack
c1a0: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
c1b0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
c1c0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
c1d0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
c1e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43  lite3_free(p->aC
c1f0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
c200: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29  e3_free(p->zSql)
c210: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
c220: 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
c230: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  );.}../*.** If a
c250: 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
c260: 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
c270: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
c280: 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
c290: 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52  * MoveTo now.  R
c2a0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
c2b0: 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65  ode.  If no Move
c2c0: 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74  To is pending, t
c2d0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
c2e0: 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20  oes nothing and 
c2f0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
c300: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
c310: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
c320: 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  o(Cursor *p){.  
c330: 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
c340: 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
c350: 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
c360: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
c370: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
c380: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
c390: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
c3a0: 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
c3b0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c3c0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
c3d0: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
c3e0: 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
c3f0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
c400: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
c410: 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65  .    *p->pIncrKe
c420: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61  y = 0;.    p->la
c430: 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49  stRowid = keyToI
c440: 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  nt(p->movetoTarg
c450: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  et);.    p->rowi
c460: 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  dIsValid = res==
c470: 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  0;.    if( res<0
c480: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
c490: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
c4a0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  p->pCursor, &res
c4b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
c4c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c4d0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
c4e0: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
c4f0: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
c500: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e  ;.#endif.    p->
c510: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
c520: 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
c530: 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
c540: 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  TALE;.  }.  retu
c550: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c560: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
c570: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
c580: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
c590: 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
c5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c5b0: 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
c5c0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
c5d0: 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Read().** sqlite
c5e0: 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
c5f0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c600: 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a  erialWrite().**.
c610: 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
c620: 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
c630: 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
c640: 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
c650: 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
c660: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
c670: 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
c680: 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
c690: 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
c6a0: 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
c6b0: 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
c6c0: 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
c6d0: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
c6e0: 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
c6f0: 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
c700: 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
c710: 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
c720: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
c730: 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
c740: 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
c750: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
c760: 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
c770: 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
c780: 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
c790: 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
c7a0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
c7b0: 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
c7c0: 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
c7d0: 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
c7e0: 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
c7f0: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
c800: 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
c810: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
c820: 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
c830: 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72   data blob seper
c840: 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
c850: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
c860: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
c870: 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
c880: 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
c890: 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
c8a0: 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
c8b0: 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
c8c0: 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
c8d0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
c900: 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
c920: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
c930: 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
c950: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
c960: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
c970: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
c980: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
c990: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c9a0: 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
c9d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
c9e0: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
c9f0: 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
ca00: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
ca10: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
ca40: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
ca50: 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
ca80: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
ca90: 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
caa0: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
cab0: 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
cac0: 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
caf0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
cb00: 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
cb20: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
cb30: 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
cb40: 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
cb70: 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
cb80: 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
cb90: 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
cba0: 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
cbb0: 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
cbc0: 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
cbd0: 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
cbe0: 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
cbf0: 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
cc00: 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
cc10: 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
cc20: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
cc30: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
cc40: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
cc50: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
cc60: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
cc70: 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
cc80: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
cc90: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
cca0: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
ccb0: 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
ccc0: 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
ccd0: 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
cce0: 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
ccf0: 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
cd00: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
cd10: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
cd20: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
cd30: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
cd40: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
cd50: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
cd60: 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
cd70: 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
cd80: 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
cd90: 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30  (((i64)0x0000100
cda0: 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
cdb0: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
cdc0: 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
cdd0: 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
cde0: 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
cdf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ce00: 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  8+i;.    }.    u
ce10: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
ce20: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
ce30: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
ce40: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
ce50: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
ce60: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
ce70: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
ce80: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
ce90: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
cea0: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
ceb0: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
cec0: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
ced0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
cee0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
cef0: 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
cf00: 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
cf10: 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
cf20: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
cf30: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
cf40: 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
cf50: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20  Mem->u.i;.  }.  
cf60: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
cf70: 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
cf80: 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
cf90: 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
cfa0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
cfb0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
cfc0: 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
cfd0: 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
cfe0: 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
cff0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
d000: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
d010: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
d020: 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
d030: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
d040: 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
d050: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
d060: 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
d070: 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
d080: 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
d090: 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
d0a0: 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
d0b0: 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
d0c0: 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
d0d0: 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
d0e0: 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
d0f0: 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
d100: 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
d110: 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
d120: 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
d130: 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
d140: 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
d150: 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
d160: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
d170: 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
d180: 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
d190: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
d1a0: 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
d1b0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
d1c0: 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
d1d0: 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
d1e0: 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
d1f0: 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
d200: 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
d210: 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
d220: 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
d230: 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
d240: 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
d250: 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
d260: 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
d270: 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
d280: 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
d290: 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
d2a0: 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
d2b0: 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
d2c0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
d2d0: 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
d2e0: 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
d2f0: 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
d300: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
d310: 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
d320: 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
d330: 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
d340: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
d350: 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
d360: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
d370: 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
d380: 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
d390: 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
d3a0: 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
d3b0: 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
d3c0: 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
d3d0: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
d3e0: 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
d3f0: 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
d400: 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
d410: 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
d420: 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
d430: 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
d440: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
d450: 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
d460: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
d470: 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
d480: 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
d490: 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
d4a0: 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
d4b0: 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
d4c0: 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
d4d0: 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
d4e0: 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
d4f0: 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
d500: 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
d510: 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
d520: 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
d530: 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
d540: 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
d550: 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
d560: 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
d570: 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
d580: 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
d590: 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
d5a0: 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
d5b0: 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
d5c0: 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
d5d0: 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
d5e0: 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
d5f0: 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
d600: 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
d610: 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
d620: 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
d630: 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
d640: 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
d650: 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
d660: 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
d670: 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
d680: 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
d690: 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
d6a0: 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
d6b0: 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
d6c0: 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
d6d0: 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
d6e0: 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
d6f0: 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
d700: 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
d710: 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
d720: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
d730: 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
d740: 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
d750: 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
d760: 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
d770: 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
d780: 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
d790: 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
d7a0: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
d7b0: 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
d7c0: 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
d7d0: 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
d7e0: 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
d7f0: 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
d800: 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
d810: 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
d820: 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
d830: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
d840: 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
d850: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
d860: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
d870: 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
d880: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
d890: 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
d8a0: 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
d8b0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
d8c0: 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
d8d0: 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
d8e0: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
d8f0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
d900: 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
d910: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d920: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
d930: 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
d940: 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
d950: 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
d960: 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74  uf[].  nBuf must
d970: 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61   always be.** la
d980: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
d990: 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
d9a0: 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  eld.  Except, if
d9b0: 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a   the field is.**
d9c0: 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a   a blob with a z
d9d0: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c  ero-filled tail,
d9e0: 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68   then buf[] migh
d9f0: 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69  t be just the ri
da00: 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68  ght.** size to h
da10: 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  old everything e
da20: 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65  xcept for the ze
da30: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20  ro-filled tail. 
da40: 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20   If buf[].** is 
da50: 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20  only big enough 
da60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d  to hold the non-
da70: 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65  zero prefix, the
da80: 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61  n only write tha
da90: 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f  t.** prefix into
daa0: 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20   buf[].  But if 
dab0: 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65  buf[] is large e
dac0: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f  nough to hold bo
dad0: 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  th the.** prefix
dae0: 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68   and the tail th
daf0: 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65  en write the pre
db00: 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20  fix and set the 
db10: 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a  tail to all.** z
db20: 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eros..**.** Retu
db30: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
db40: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
db50: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
db60: 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
db70: 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
db80: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
db90: 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
dba0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
dbb0: 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
dbc0: 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
dbd0: 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
dbe0: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
dbf0: 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
dc00: 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c   *buf, int nBuf,
dc10: 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
dc20: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
dc30: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
dc40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
dc50: 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
dc60: 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e  le_format);.  in
dc70: 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  t len;..  /* Int
dc80: 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
dc90: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
dca0: 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
dcb0: 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
dcc0: 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  4 v;.    int i;.
dcd0: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
dce0: 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
dcf0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
dd00: 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
dd10: 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
dd20: 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
dd30: 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
dd40: 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
dd50: 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
dd60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
dd70: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
dd80: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
dd90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
dda0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
ddb0: 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
ddc0: 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a  t( len<=nBuf );.
ddd0: 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
dde0: 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
ddf0: 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20   (v&0xFF);.     
de00: 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
de10: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
de20: 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
de30: 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
de40: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
de50: 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
de60: 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
de70: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
de80: 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30  ero)?pMem->u.i:0
de90: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
dea0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
deb0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
dec0: 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
ded0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
dee0: 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
def0: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
df00: 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
df10: 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
df20: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
df30: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
df40: 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
df50: 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  .i;.      if( le
df60: 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  n>nBuf ){.      
df70: 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20    len = nBuf;.  
df80: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
df90: 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
dfa0: 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
dfb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
dfc0: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
dfd0: 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
dfe0: 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
dff0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e000: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
e010: 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
e020: 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
e030: 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
e040: 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
e050: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
e060: 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
e070: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
e080: 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
e090: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
e0a0: 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
e0b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
e0c0: 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
e0d0: 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
e0e0: 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
e0f0: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e110: 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
e120: 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
e130: 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e150: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
e160: 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
e170: 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
e180: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
e190: 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
e1a0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
e1b0: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
e1c0: 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
e1d0: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
e1e0: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
e1f0: 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
e200: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
e210: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
e220: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e230: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
e240: 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
e250: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
e260: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e270: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
e280: 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
e290: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e2a0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
e2b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
e2c0: 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
e2d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
e2e0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
e2f0: 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
e300: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
e310: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
e320: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e330: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
e340: 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
e350: 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
e360: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
e370: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
e380: 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
e390: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
e3a0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
e3b0: 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
e3c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e3d0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e3e0: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
e3f0: 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
e400: 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
e410: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
e420: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
e430: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
e440: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
e450: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
e460: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e470: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e480: 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
e490: 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
e4a0: 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
e4b0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e4c0: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
e4d0: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
e4e0: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
e4f0: 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
e500: 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
e510: 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
e520: 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
e530: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
e540: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
e550: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
e560: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
e570: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e580: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
e590: 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
e5a0: 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
e5b0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
e5c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
e5d0: 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
e5e0: 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
e5f0: 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
e600: 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
e610: 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
e620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e630: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
e640: 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
e650: 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
e660: 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
e670: 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
e680: 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
e690: 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
e6a0: 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
e6b0: 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
e6c0: 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
e6d0: 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
e6e0: 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
e6f0: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
e700: 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
e710: 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
e720: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e730: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
e740: 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
e750: 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
e760: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e770: 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
e780: 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
e790: 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
e7a0: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
e7b0: 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
e7c0: 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
e7d0: 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
e7e0: 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
e7f0: 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
e800: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
e810: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
e820: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
e830: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
e840: 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
e850: 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
e860: 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
e870: 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
e880: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
e890: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
e8a0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
e8b0: 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
e8c0: 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
e8d0: 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
e8e0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e8f0: 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
e900: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e910: 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
e920: 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
e930: 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
e940: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e950: 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
e960: 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
e970: 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
e980: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
e990: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
e9a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e9b0: 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
e9c0: 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
e9d0: 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
e9e0: 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
e9f0: 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
ea00: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
ea10: 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
ea20: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ea30: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
ea40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
ea50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
ea60: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
ea70: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
ea80: 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
ea90: 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
eaa0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
eab0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
eac0: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
ead0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
eae0: 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
eaf0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
eb00: 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
eb10: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
eb20: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
eb30: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
eb40: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
eb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
eb60: 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
eb70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
eb80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
eb90: 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f  r of a record co
eba0: 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 71 75  nsists of a sequ
ebb0: 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65  ence variable-le
ebc0: 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a  ngth integers..*
ebd0: 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73  * These integers
ebe0: 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
ebf0: 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65  ys small and are
ec00: 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69   encoded as a si
ec10: 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68  ngle byte..** Th
ec20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
ec30: 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  o takes advantag
ec40: 65 20 74 68 69 73 20 66 61 63 74 20 74 6f 20 70  e this fact to p
ec50: 72 6f 76 69 64 65 20 61 20 66 61 73 74 20 64 65  rovide a fast de
ec60: 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69  code.** of the i
ec70: 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72 65 63  ntegers in a rec
ec80: 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49 74 20  ord header.  It 
ec90: 69 73 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  is faster for th
eca0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a  e common case.**
ecb0: 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 67   where the integ
ecc0: 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62  er is a single b
ecd0: 79 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69  yte.  It is a li
ece0: 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e  ttle slower when
ecf0: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
ed00: 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62  is two or more b
ed10: 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61  ytes.  But overa
ed20: 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65 72 2e  ll it is faster.
ed30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
ed40: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  wing expressions
ed50: 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a   are equivalent:
ed60: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73  .**.**     x = s
ed70: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
ed80: 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a  2( A, &B );.**.*
ed90: 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56 61 72  *     x = GetVar
eda0: 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a  int( A, B );.**.
edb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56 61  */.#define GetVa
edc0: 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20 3d  rint(A,B)  ((B =
edd0: 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20 31   *(A))<=0x7f ? 1
ede0: 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61 72   : sqlite3GetVar
edf0: 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f  int32(A, &B))../
ee00: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ee10: 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
ee20: 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
ee30: 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20  r index records 
ee40: 73 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a  specified by .**
ee50: 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
ee60: 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79  and {nKey2, pKey
ee70: 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20  2}, returning a 
ee80: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
ee90: 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
eea0: 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c  teger if {nKey1,
eeb0: 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20   pKey1} is less 
eec0: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
eed0: 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
eee0: 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32  an {nKey2, pKey2
eef0: 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e  }.  Both Key1 an
ef00: 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62  d Key2 must be b
ef10: 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63  yte strings.** c
ef20: 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f  omposed by the O
ef30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
ef40: 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
ef50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
ef60: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
ef70: 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61  (.  void *userDa
ef80: 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ta,.  int nKey1,
ef90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
efa0: 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32  y1, .  int nKey2
efb0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
efc0: 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  ey2.){.  KeyInfo
efd0: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65   *pKeyInfo = (Ke
efe0: 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b  yInfo*)userData;
eff0: 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20  .  u32 d1, d2;  
f000: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f010: 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
f020: 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
f030: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
f040: 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20  , idx2;      /* 
f050: 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
f060: 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
f070: 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
f080: 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72  32 szHdr1, szHdr
f090: 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  2;  /* Number of
f0a0: 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
f0b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
f0c0: 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
f0d0: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
f0e0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f0f0: 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
f100: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f110: 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73   *)pKey1;.  cons
f120: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f130: 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20  *aKey2 = (const 
f140: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
f150: 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65  pKey2;..  Mem me
f160: 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a  m1;.  Mem mem2;.
f170: 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
f180: 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
f190: 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
f1a0: 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63  ->db;.  mem2.enc
f1b0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
f1c0: 3b 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70 4b  ;.  mem2.db = pK
f1d0: 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a 20  eyInfo->db;.  . 
f1e0: 20 69 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e   idx1 = GetVarin
f1f0: 74 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  t(aKey1, szHdr1)
f200: 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
f210: 0a 20 20 69 64 78 32 20 3d 20 47 65 74 56 61 72  .  idx2 = GetVar
f220: 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72  int(aKey2, szHdr
f230: 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72  2);.  d2 = szHdr
f240: 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b  2;.  nField = pK
f250: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
f260: 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
f270: 48 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48  Hdr1 && idx2<szH
f280: 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73  dr2 ){.    u32 s
f290: 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20  erial_type1;.   
f2a0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
f2b0: 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  2;..    /* Read 
f2c0: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
f2d0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
f2e0: 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
f2f0: 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
f300: 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65  = GetVarint( aKe
f310: 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
f320: 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
f330: 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
f340: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
f350: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
f360: 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
f370: 20 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56      idx2 += GetV
f380: 61 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78  arint( aKey2+idx
f390: 32 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20  2, serial_type2 
f3a0: 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e  );.    if( d2>=n
f3b0: 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56  Key2 && sqlite3V
f3c0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f3d0: 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30  (serial_type2)>0
f3e0: 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
f3f0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
f400: 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
f410: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f420: 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
f430: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
f440: 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
f450: 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  pe1, &mem1);.   
f460: 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d2 += sqlite3Vd
f470: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
f480: 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74  y2[d2], serial_t
f490: 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20  ype2, &mem2);.. 
f4a0: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
f4b0: 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
f4c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
f4d0: 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
f4e0: 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64   &mem2, i<nField
f4f0: 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
f500: 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
f510: 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  if( mem1.flags &
f520: 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74   MEM_Dyn ) sqlit
f530: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
f540: 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28  (&mem1);.    if(
f550: 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45   mem2.flags & ME
f560: 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56  M_Dyn ) sqlite3V
f570: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
f580: 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63  em2);.    if( rc
f590: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  !=0 ){.      bre
f5a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  ak;.    }.    i+
f5b0: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65  +;.  }..  /* One
f5c0: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
f5d0: 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20   out of fields, 
f5e0: 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c  but all the fiel
f5f0: 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
f600: 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71  int.  ** were eq
f610: 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72  ual. If the incr
f620: 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  Key flag is true
f630: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
f640: 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72  d key is.  ** tr
f650: 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e  eated as larger.
f660: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
f670: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65  0 ){.    if( pKe
f680: 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29  yInfo->incrKey )
f690: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
f6a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
f6b0: 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69 78  pKeyInfo->prefix
f6c0: 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20 20  IsEqual ){.     
f6d0: 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b   if( d1<nKey1 ){
f6e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
f6f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f700: 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20   d2<nKey2 ){.   
f710: 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
f720: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
f730: 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
f740: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
f750: 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  i<pKeyInfo->nFie
f760: 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ld.             
f770: 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61    && pKeyInfo->a
f780: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
f790: 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
f7a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
f7c0: 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64 65  ument is an inde
f7d0: 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64  x entry composed
f7e0: 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
f7f0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
f800: 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e 74  .** The last ent
f810: 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f 72  ry in this recor
f820: 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  d should be an i
f830: 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69 63  nteger (specific
f840: 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  ally.** an integ
f850: 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69 73  er rowid).  This
f860: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
f870: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
f880: 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ytes in.** that 
f890: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
f8a0: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
f8b0: 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20  widLen(const u8 
f8c0: 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a  *aKey){.  u32 sz
f8d0: 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
f8e0: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
f8f0: 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
f900: 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
f910: 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
f920: 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  owid */..  sqlit
f930: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b  e3GetVarint32(aK
f940: 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  ey, &szHdr);.  s
f950: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
f960: 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d  2(&aKey[szHdr-1]
f970: 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  , &typeRowid);. 
f980: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
f990: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f9a0: 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20  (typeRowid);.}. 
f9b0: 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
f9c0: 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
f9d0: 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
f9e0: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
f9f0: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
fa00: 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
fa10: 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
fa20: 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
fa30: 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
fa40: 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
fa50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
fa60: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
fa70: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
fa80: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
fa90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
faa0: 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  dxRowid(BtCursor
fab0: 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
fac0: 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
fad0: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
fae0: 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
faf0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
fb00: 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
fb10: 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
fb20: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
fb30: 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
fb40: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
fb50: 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
fb60: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
fb70: 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71   Mem m, v;..  sq
fb80: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
fb90: 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
fba0: 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
fbb0: 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey<=0 ){.    ret
fbc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fbd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
fbe0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
fbf0: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
fc00: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
fc10: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
fc20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fc30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47  ;.  }.  sqlite3G
fc40: 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
fc50: 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  m.z, &szHdr);.  
fc60: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
fc70: 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
fc80: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69  dr-1], &typeRowi
fc90: 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d  d);.  lenRowid =
fca0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
fcb0: 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
fcc0: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
fcd0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
fce0: 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
fcf0: 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
fd00: 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
fd10: 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
fd20: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
fd30: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
fd40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fd50: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
fd60: 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
fd70: 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
fd80: 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20   pC is point to 
fd90: 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
fda0: 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65  ey string in pKe
fdb0: 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65  y (of length nKe
fdc0: 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  y).  Write into 
fdd0: 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
fde0: 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
fdf0: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
fe00: 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
fe10: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
fe20: 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
fe30: 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65  r than pKey.  Re
fe40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
fe50: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
fe60: 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20   pKey is either 
fe70: 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
fe80: 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
fe90: 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
fea0: 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
feb0: 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
fec0: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
fed0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
fee0: 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
fef0: 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
ff00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ff10: 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
ff20: 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c  e(.  Cursor *pC,
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
ff50: 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
ff60: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
ff70: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c   const u8 *pKey,
ff80: 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f     /* The key to
ff90: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e   compare */.  in
ffa0: 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
ffb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
ffc0: 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
ffd0: 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
ffe0: 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
fff0: 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
10000 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
10010 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
10020 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64  ;.  int lenRowid
10030 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71  ;.  Mem m;..  sq
10040 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
10050 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
10060 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
10070 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65  ey<=0 ){.    *re
10080 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
10090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
100a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
100b0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
100c0 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
100d0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
100e0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
100f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10100 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
10110 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
10120 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a  dLen((u8*)m.z);.
10130 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
10140 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
10150 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  e(pC->pKeyInfo, 
10160 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e  m.n-lenRowid, m.
10170 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  z, nKey, pKey);.
10180 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
10190 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
101a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
101b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
101c0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
101d0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
101e0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
101f0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
10200 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
10210 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10220 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
10230 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
10240 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
10250 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
10260 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
10270 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10280 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
10290 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
102a0 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
102b0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
102c0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
102d0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
102e0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
102f0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
10300 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
10310 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
10320 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
10330 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
10340 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
10350 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
10360 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
10370 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
10380 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10390 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
103a0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
103b0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
103c0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
103d0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
103e0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
103f0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
10400 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
10410 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
10420 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
10430 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
10440 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
10450 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
10460 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
10470 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
10480 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
10490 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
104a0 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
104b0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
104c0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
104d0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
104e0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
104f0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
10500 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
10510 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
10520 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
10530 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
10540 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
10550 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
10560 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
10570 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
10580 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
10590 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
105a0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
105b0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
105c0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
105d0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
105e0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
105f0 2d 3e 64 62 3b 0a 7d 0a                          ->db;.}.