/ Hex Artifact Content
Login

Artifact 0d2a9730195d40f7d1156731bc69f240927255c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0660: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65  mt *pStmt){.  re
0670: 74 75 72 6e 20 28 28 56 64 62 65 20 2a 29 70 53  turn ((Vdbe *)pS
0680: 74 6d 74 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f  tmt)->zSql;.}../
0690: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06a0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06b0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06d0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06e0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06f0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0700: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0710: 0a 20 20 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74  .  int nTmp;.  t
0720: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0730: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0740: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0750: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0760: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0770: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0780: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0790: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07a0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07b0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07c0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07d0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07e0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07f0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0800: 70 3b 0a 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e  p;.  nTmp = pA->
0810: 6e 53 71 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c  nSql;.  pA->nSql
0820: 20 3d 20 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pB->nSql;.  p
0830: 42 2d 3e 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a  B->nSql = nTmp;.
0840: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0850: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0860: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0870: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0880: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0890: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
08a0: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
08b0: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
08c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
08d0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
08e0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  y so that it con
08f0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 4e  tains at least N
0900: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a  .** elements..**
0910: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0920: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0930: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0940: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 0a 2a  ing the array,.*
0950: 2a 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  * Vdbe.aOp and V
0960: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0970: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 20 28 74  ain unchanged (t
0980: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 2a  his is so that.*
0990: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  * any opcodes al
09a0: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
09b0: 63 61 6e 20 62 65 20 63 6f 72 72 65 63 74 6c 79  can be correctly
09c0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20   deallocated.** 
09d0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
09e0: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
09f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a00: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 56   resizeOpArray(V
0a10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
0a20: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0a30: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0a40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70  p->nOpAlloc;.  p
0a50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a60: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a70: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0a80: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0a90: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0aa0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ab0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  Op = pNew;.    i
0ac0: 66 28 20 4e 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a  f( N>oldSize ){.
0ad0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
0ae0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
0af0: 2c 20 28 4e 2d 6f 6c 64 53 69 7a 65 29 2a 73 69  , (N-oldSize)*si
0b00: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 7d  zeof(Op));.    }
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0b20: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b30: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b40: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b50: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b60: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0b80: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0b90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0ba0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bd0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0bf0: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c10: 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20  *    p1, p2, p3 
0c20: 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a       Operands.**
0c30: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
0c40: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
0c50: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0c60: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0c70: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0c80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0c90: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0ca0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0cb0: 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72  f the P4.** oper
0cc0: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64  te3VdbeAddOp3(Vd
0ce0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0cf0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
0d00: 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p3){.  int i;
0d10: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
0d20: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  .  i = p->nOp;. 
0d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0d40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0d50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
0d60: 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20  OpAlloc<=i ){.  
0d70: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
0d80: 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32  p, p->nOpAlloc*2
0d90: 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28   + 100);.    if(
0da0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
0db0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  iled ){.      re
0dc0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
0dd0: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
0de0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
0df0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
0e00: 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20  = op;.  pOp->p1 
0e10: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0e20: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0e30: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0e40: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0e50: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0e60: 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  D;.  p->expired 
0e70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
0e80: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 73  TE_DEBUG.  if( s
0e90: 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f  qlite3_vdbe_addo
0ea0: 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69 74 65  p_trace ) sqlite
0eb0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
0ec0: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
0ed0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
0ee0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
0ef0: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
0f00: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
0f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
0f20: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
0f30: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
0f40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
0f50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0f60: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
0f70: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
0f80: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
0f90: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
0fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
0fb0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0fc0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
0fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
0fe0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
0ff0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1000: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  }.../*.** Add an
1010: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1020: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1030: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
1040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1050: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1060: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1070: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1080: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1090: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
10b0: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
10c0: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
10d0: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
10e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1100: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1110: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1120: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1130: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
1150: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1160: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1170: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
1180: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
1190: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
11a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11b0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
11c0: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
11d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
11e0: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
11f0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1200: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1210: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1220: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1230: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1240: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1250: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1260: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1270: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1280: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1290: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
12a0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
12b0: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
12c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
12d0: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
12e0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
12f0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
1300: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
1310: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
1320: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
1330: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1340: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1350: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1360: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1370: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1380: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1390: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
13a0: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
13b0: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
13c0: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
13d0: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
13e0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
13f0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
1400: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
1410: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
1420: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
1430: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1440: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1460: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1470: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1490: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
14a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
14b0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
14c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
14d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
14e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
14f0: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
1500: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
1510: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
1520: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
1530: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1540: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1550: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1560: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1590: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
15a0: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
15b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
15c0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
15d0: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
15e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
15f0: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1600: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1610: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
1620: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
1630: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
1640: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
1650: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1660: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1670: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1680: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1690: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16a0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
16d0: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
16e0: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
16f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1700: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1710: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
1720: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
1730: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1740: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1750: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20  }.}../*.** Loop 
1770: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
1780: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
1790: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
17a0: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
17b0: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
17c0: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
17d0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
17e0: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
17f0: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
1800: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
1810: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
1820: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
1830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1840: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
1850: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
1860: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
1870: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
1880: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
1890: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
18a0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
18b0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
18c0: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
18d0: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
18e0: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
18f0: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
1900: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
1910: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1920: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
1930: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
1940: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rray..**.** This
1950: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
1960: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
1970: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20   optimization:  
1980: 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20  It scans for.** 
1990: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
19a0: 74 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  t might cause a 
19b0: 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
19c0: 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74 72 75  ck.  Such instru
19d0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a  ctions.** are:.*
19e0: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  *.**   *  OP_Hal
19f0: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  t with P1=SQLITE
1a00: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
1a10: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
1a20: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
1a30: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
1a40: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
1a50: 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ename.**.** If n
1a60: 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74 69  o such instructi
1a70: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  on is found, the
1a80: 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e  n every Statemen
1a90: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a  t instruction .*
1aa0: 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  * is changed to 
1ab0: 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68 69 73  a Noop.  In this
1ac0: 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63   way, we avoid c
1ad0: 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61 74  reating the stat
1ae0: 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61  ement .** journa
1af0: 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61  l file unnecessa
1b00: 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rily..*/.static 
1b10: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
1b20: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
1b30: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
1b40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1b50: 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20   nMaxArgs = 0;. 
1b60: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20   Op *pOp;.  int 
1b70: 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61  *aLabel = p->aLa
1b80: 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53  bel;.  int doesS
1b90: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1ba0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53   = 0;.  int hasS
1bb0: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20  tatementBegin = 
1bc0: 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  0;.  for(pOp=p->
1bd0: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
1be0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
1bf0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64  +){.    u8 opcod
1c00: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
1c10: 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ..    if( opcode
1c20: 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b  ==OP_Function ){
1c30: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1c40: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
1c50: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
1c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
1c80: 65 70 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ep .#ifndef SQLI
1c90: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ca0: 41 42 4c 45 0a 20 20 20 20 20 20 20 20 7c 7c 20  ABLE.        || 
1cb0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
1cc0: 74 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b  te.#endif.    ){
1cd0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1ce0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
1cf0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
1d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
1d20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
1d30: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->p1==SQLITE_CON
1d40: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
1d50: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  p2==OE_Abort ){.
1d60: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1d70: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1d80: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1d90: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1da0: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
1db0: 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d  .      hasStatem
1dc0: 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20  entBegin = 1;.  
1dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1de0: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29  de==OP_Destroy )
1df0: 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61 74  {.      doesStat
1e00: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1e10: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1e20: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e30: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
1e40: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
1e50: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
1e60: 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20  OP_VRename ){.  
1e70: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
1e80: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
1e90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1ea0: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
1eb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
1ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1ed0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
1ee0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ef0: 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
1f00: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
1f10: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
1f20: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
1f30: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
1f40: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
1f50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
1f60: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48  lite3VdbeOpcodeH
1f70: 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64  asProperty(opcod
1f80: 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26  e, OPFLG_JUMP) &
1f90: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
1fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
1fb0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
1fc0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
1fd0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
1fe0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
1ff0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2000: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
2010: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a  p->aLabel = 0;..
2020: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
2030: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f  = nMaxArgs;..  /
2040: 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f  * If we never ro
2050: 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
2060: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
2070: 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20  then statement. 
2080: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
2090: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e   are not needed.
20a0: 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72    So change ever
20b0: 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20  y OP_Statement. 
20c0: 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20   ** opcode into 
20d0: 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69  an OP_Noop.  Thi
20e0: 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74  s avoid a call t
20f0: 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  o sqlite3OsOpenE
2100: 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20  xclusive().  ** 
2110: 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70  which can be exp
2120: 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70  ensive on some p
2130: 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20  latforms..  */. 
2140: 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e   if( hasStatemen
2150: 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53  tBegin && !doesS
2160: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
2170: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d   ){.    for(pOp=
2180: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
2190: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
21a0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
21b0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
21c0: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
21d0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
21e0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
21f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2210: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2220: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2230: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2240: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2250: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2260: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
2270: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2280: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2290: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
22a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
22b0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
22c0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
22d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
22e0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
22f0: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
2300: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
2310: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
2320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
2330: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
2340: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
2350: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
2360: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
2370: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
2380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2390: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
23a0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
23b0: 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f  c ){.    resizeO
23c0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
23d0: 2a 32 20 2b 20 6e 4f 70 29 3b 0a 20 20 7d 0a 20  *2 + nOp);.  }. 
23e0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
23f0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2410: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
2420: 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20   if( nOp>0 ){.  
2430: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
2440: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70  eOpList const *p
2450: 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f  In = aOp;.    fo
2460: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
2470: 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20  +, pIn++){.     
2480: 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70   int p2 = pIn->p
2490: 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  2;.      VdbeOp 
24a0: 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b  *pOut = &p->aOp[
24b0: 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70  i+addr];.      p
24c0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49  Out->opcode = pI
24d0: 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20  n->opcode;.     
24e0: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d   pOut->p1 = pIn-
24f0: 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  >p1;.      if( p
2500: 32 3c 30 20 26 26 20 73 71 6c 69 74 65 33 56 64  2<0 && sqlite3Vd
2510: 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65  beOpcodeHasPrope
2520: 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty(pOut->opcode
2530: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b  , OPFLG_JUMP) ){
2540: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
2550: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
2560: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
2570: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
2580: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
2590: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
25a0: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
25b0: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
25c0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
25d0: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
25e0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
25f0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
2600: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
2610: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62 65  if( sqlite3_vdbe
2620: 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a  _addop_trace ){.
2630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2640: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
2650: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
2660: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
2670: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2680: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
2690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
26a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
26b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
26c0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
26d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
26e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
26f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2700: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
2710: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
2720: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
2730: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
2740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2750: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
2760: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
2770: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
2780: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
2790: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27a0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
27b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
27c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
27d0: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
27e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
27f0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2800: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2810: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2820: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2830: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
2840: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2850: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2860: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
2870: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2880: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2890: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
28a0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
28b0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
28c0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
28d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
28e0: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP2(Vdbe *p, in
28f0: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2900: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2910: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2920: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2930: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2940: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2950: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2960: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2970: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
2980: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2990: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
29a0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
29b0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
29c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
29d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
29e0: 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P3(Vdbe *p, int 
29f0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2a00: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
2a10: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
2a20: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2a30: 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d   if( p && addr>=
2a40: 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72  0 && p->nOp>addr
2a50: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
2a60: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
2a70: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
2a80: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2a90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
2aa0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
2ab0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
2ac0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
2ad0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2ae0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
2af0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
2b00: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2b10: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2b20: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2b30: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f    if( p && p->aO
2b40: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
2b50: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
2b60: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
2b70: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
2b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2b90: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
2ba0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
2bb0: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
2bc0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
2bd0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2be0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2bf0: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
2c00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
2c10: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
2c20: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
2c30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2c40: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
2c50: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
2c60: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
2c70: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
2c80: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
2c90: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
2ca0: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
2cb0: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
2cc0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
2cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2ce0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
2cf0: 6f 6e 28 46 75 6e 63 44 65 66 20 2a 70 44 65 66  on(FuncDef *pDef
2d00: 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26  ){.  if( pDef &&
2d10: 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
2d20: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
2d30: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
2d40: 69 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b  ite3_free(pDef);
2d50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
2d60: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20  lete a P4 value 
2d70: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
2d80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2d90: 65 50 34 28 69 6e 74 20 70 34 74 79 70 65 2c 20  eP4(int p4type, 
2da0: 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69 66 28  void *p3){.  if(
2db0: 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69 74 63   p3 ){.    switc
2dc0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
2dd0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
2de0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
2df0: 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65  NT64:.      case
2e00: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20   P4_MPRINTF:.   
2e10: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
2e20: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
2e30: 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20  4_KEYINFO:.     
2e40: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
2e50: 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20  _HANDOFF: {.    
2e60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e70: 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p3);.        br
2e80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2e90: 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46     case P4_VDBEF
2ea0: 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  UNC: {.        V
2eb0: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
2ec0: 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a  nc = (VdbeFunc *
2ed0: 29 70 33 3b 0a 20 20 20 20 20 20 20 20 66 72 65  )p3;.        fre
2ee0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
2ef0: 6f 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e 70 46  on(pVdbeFunc->pF
2f00: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71  unc);.        sq
2f10: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
2f20: 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63  uxData(pVdbeFunc
2f30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2f40: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 64 62 65  lite3_free(pVdbe
2f50: 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62  Func);.        b
2f60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2f70: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
2f80: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66  DEF: {.        f
2f90: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2fa0: 74 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a 29 70  tion((FuncDef*)p
2fb0: 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  3);.        brea
2fc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2fd0: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
2fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ff0: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
3000: 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20  3_value*)p3);.  
3010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3020: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
3030: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
3040: 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69  N opcodes starti
3050: 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f  ng at addr to No
3060: 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  -ops..*/.void sq
3070: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
3080: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
3090: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b  nt addr, int N){
30a0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61  .  if( p && p->a
30b0: 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  Op ){.    VdbeOp
30c0: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
30d0: 61 64 64 72 5d 3b 0a 20 20 20 20 77 68 69 6c 65  addr];.    while
30e0: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66  ( N-- ){.      f
30f0: 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70  reeP4(pOp->p4typ
3100: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
3110: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
3120: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
3130: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
3140: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
3150: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
3160: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3170: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3180: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
3190: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
31a0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
31b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
31c0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
31d0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
31e0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
31f0: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
3200: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
3210: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
3220: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
3230: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
3240: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
3250: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
3260: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
3270: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
3280: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
3290: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
32a0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
32b0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
32c0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
32d0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
32e0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
32f0: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
3300: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
3310: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
3320: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
3330: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
3340: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
3350: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
3360: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
3370: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
3380: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
3390: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
33a0: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
33b0: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
33c0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
33d0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
33e0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
33f0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
3400: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
3410: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
3420: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
3430: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
3440: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
3450: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
3460: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3470: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
3480: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
3490: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
34a0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
34b0: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
34c0: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
34d0: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
34e0: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
34f0: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3500: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3510: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3520: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3530: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
3540: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
3550: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
3560: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
3570: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
3580: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
3590: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
35a0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
35b0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
35c0: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
35d0: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
35e0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
35f0: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3600: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
3610: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3620: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3630: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3640: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
3650: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3660: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
3670: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
3680: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
3690: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
36a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
36b0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
36c0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
36d0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
36e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
36f0: 28 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  (n != P4_KEYINFO
3700: 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  ) {.      freeP4
3710: 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61  (n, (void*)*(cha
3720: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
3730: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3740: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c  .  if( addr<0 ||
3750: 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b   addr>=p->nOp ){
3760: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
3770: 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  Op - 1;.    if( 
3780: 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b  addr<0 ) return;
3790: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
37a0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
37b0: 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65  eeP4(pOp->p4type
37c0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
37d0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
37e0: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
37f0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3800: 69 20 3d 20 28 69 6e 74 29 7a 50 34 3b 0a 20 20  i = (int)zP4;.  
3810: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3820: 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  n;.  }else if( z
3830: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  P4==0 ){.    pOp
3840: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20  ->p4.p = 0;.    
3850: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3860: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73  _NOTUSED;.  }els
3870: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49  e if( n==P4_KEYI
3880: 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  NFO ){.    KeyIn
3890: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
38a0: 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42    int nField, nB
38b0: 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64  yte;..    nField
38c0: 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50   = ((KeyInfo*)zP
38d0: 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20  4)->nField;.    
38e0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
38f0: 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69  pKeyInfo) + (nFi
3900: 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b  eld-1)*sizeof(pK
3910: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
3920: 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  ) + nField;.    
3930: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
3940: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
3950: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
3960: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
3970: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
3980: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
3990: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 53  nsigned char *aS
39a0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
39b0: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c  memcpy(pKeyInfo,
39c0: 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20   zP4, nByte);.  
39d0: 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d      aSortOrder =
39e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
39f0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Order;.      if(
3a00: 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20   aSortOrder ){. 
3a10: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
3a20: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
3a30: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70  nsigned char*)&p
3a40: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
3a50: 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20  Field];.        
3a60: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d  memcpy(pKeyInfo-
3a70: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f  >aSortOrder, aSo
3a80: 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29  rtOrder, nField)
3a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3aa0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3ab0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65  _KEYINFO;.    }e
3ac0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  lse{.      p->db
3ad0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
3ae0: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   1;.      pOp->p
3af0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
3b00: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
3b10: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49  e if( n==P4_KEYI
3b20: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20  NFO_HANDOFF ){. 
3b30: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
3b40: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
3b50: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3b60: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
3b70: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
3b80: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3b90: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3ba0: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d  >p4type = n;.  }
3bb0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
3bc0: 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28  =0 ) n = strlen(
3bd0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
3be0: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
3bf0: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
3c00: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
3c10: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
3c20: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  MIC;.  }.}..#ifn
3c30: 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
3c40: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
3c50: 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d  ent on the the m
3c60: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
3c70: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
3c80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3c90: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
3ca0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
3cb0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
3cc0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61   va_list ap;.  a
3cd0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
3ce0: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
3cf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
3d00: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
3d10: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
3d20: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
3d30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
3d40: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
3d50: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
3d60: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
3d70: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61  zComment;.    va
3d80: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
3d90: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
3da0: 5f 66 72 65 65 28 2a 70 7a 29 3b 0a 20 20 20 20  _free(*pz);.    
3db0: 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  *pz = sqlite3VMP
3dc0: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
3dd0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
3de0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
3df0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
3e00: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
3e10: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
3e20: 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  ress..*/.VdbeOp 
3e30: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
3e40: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
3e50: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
3e60: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3e70: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
3e80: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
3e90: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
3ea0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3eb0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 65 74 75  Failed );.  retu
3ec0: 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26 26 20  rn ((addr>=0 && 
3ed0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70  addr<p->nOp)?(&p
3ee0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b  ->aOp[addr]):0);
3ef0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
3f00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
3f10: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
3f20: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
3f30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
3f40: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
3f50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
3f60: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
3f70: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
3f80: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
3f90: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
3fa0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
3fb0: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
3fc0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
3fd0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
3fe0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
3ff0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
4000: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
4010: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
4020: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
4030: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
4040: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
4050: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
4060: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
4070: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
4080: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
4090: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
40a0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
40b0: 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
40c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
40d0: 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f   zTemp, "keyinfo
40e0: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
40f0: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69  nField);.      i
4100: 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29   = strlen(zTemp)
4110: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
4120: 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   j<pKeyInfo->nFi
4130: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
4140: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
4150: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
4160: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
4170: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
4180: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
4190: 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  trlen(pColl->zNa
41a0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
41b0: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
41c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
41d0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
41e0: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
41f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4210: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
4220: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
4230: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
4240: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
4250: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
4260: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
4270: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
4280: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
4290: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
42a0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
42b0: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20  l->zName,n+1);. 
42c0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
42d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
42e0: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
42f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
4300: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
4310: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  il",4);.        
4320: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
4330: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4340: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
4350: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
4360: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
4370: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
4380: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4390: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
43a0: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
43b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
43c0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
43d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
43e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
43f0: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
4400: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
4410: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
4420: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4430: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
4440: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
4450: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
4460: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
4470: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4480: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
4490: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
44a0: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
44b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
44c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
44d0: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
44e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
44f0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
4500: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
4510: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
4520: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4530: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
4540: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4550: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4560: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
4570: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4580: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4590: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
45a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
45b0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
45c0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
45d0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
45e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
45f0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
4600: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
4610: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
4620: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
4630: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
4640: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
4650: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
4660: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
4670: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
4680: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4690: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
46a0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
46b0: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
46c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
46d0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
46e0: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
46f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4700: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4710: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
4720: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4730: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
4740: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
4750: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4760: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4770: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
4780: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4790: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
47a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
47b0: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
47c0: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
47d0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
47e0: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
47f0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
4800: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4810: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
4820: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
4830: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
4840: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4850: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
4860: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
4870: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
4880: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
4890: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
48a0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
48b0: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
48c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
48d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  }.  assert( zP4!
48e0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
48f0: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  P4;.}.#endif../*
4900: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
4910: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
4920: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
4930: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
4940: 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20  sed..**.*/.void 
4950: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
4960: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
4970: 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b  t i){.  int mask
4980: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
4990: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
49a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
49b0: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
49c0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b  ask)*8 );.  mask
49d0: 20 3d 20 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28   = 1<<i;.  if( (
49e0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d  p->btreeMask & m
49f0: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ask)==0 ){.    p
4a00: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d  ->btreeMask |= m
4a10: 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ask;.    sqlite3
4a20: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 49  BtreeMutexArrayI
4a30: 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78  nsert(&p->aMutex
4a40: 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  , p->db->aDb[i].
4a50: 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69  pBt);.  }.}...#i
4a60: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
4a70: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
4a80: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4a90: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
4aa0: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
4ab0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4ac0: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
4ad0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
4ae0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4af0: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
4b00: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
4b10: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
4b20: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
4b30: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
4b40: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
4b50: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
4b60: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
4b70: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
4b80: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
4b90: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
4ba0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
4bb0: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
4bc0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
4bd0: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
4be0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
4bf0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
4c00: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
4c10: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
4c20: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
4c30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4c40: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
4c50: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
4c60: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
4c70: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
4c80: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
4c90: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
4ca0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4cb0: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
4cc0: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
4cd0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
4ce0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
4cf0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
4d00: 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  p ){.    while( 
4d10: 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  N-->0 ){.      a
4d20: 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b  ssert( N<2 || p[
4d30: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
4d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4d50: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 2b  dbeMemSetNull(p+
4d60: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  +);.    }.  }.}.
4d70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4d80: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
4d90: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
4da0: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
4db0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
4dc0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
4dd0: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
4de0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
4df0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
4e00: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
4e10: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
4e20: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
4e30: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
4e40: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
4e50: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
4e60: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
4e70: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
4e80: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
4e90: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
4ea0: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
4eb0: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
4ec0: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
4ed0: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
4ee0: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
4ef0: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
4f00: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
4f10: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
4f20: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
4f30: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
4f40: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
4f50: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
4f60: 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  PLAN..*/.int sql
4f70: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
4f80: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
4f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4fa0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71   VDBE */.){.  sq
4fb0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4fc0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
4fd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4fe0: 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
4ff0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
5000: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20  &p->aMem[1];..  
5010: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
5020: 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  in );.  if( p->m
5030: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
5040: 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51  _RUN ) return SQ
5050: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61  LITE_MISUSE;.  a
5060: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63  ssert( db->magic
5070: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  ==SQLITE_MAGIC_B
5080: 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  USY );.  assert(
5090: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
50a0: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
50b0: 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a  TE_BUSY );..  /*
50c0: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
50d0: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
50e0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
50f0: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
5100: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
5110: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
5120: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
5130: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
5140: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
5150: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
5160: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
5170: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
5180: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
5190: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
51a0: 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 0a 20  em, p->nMem);.. 
51b0: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
51c0: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
51d0: 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65  i<p->nOp && p->e
51e0: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
51f0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
5200: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
5210: 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  f( i>=p->nOp ){.
5220: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
5230: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
5240: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
5250: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
5260: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
5270: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
5280: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
5290: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
52a0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
52b0: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
52c0: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 45  ErrMsg, sqlite3E
52d0: 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20 28 63  rrStr(p->rc), (c
52e0: 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65  har*)0);.  }else
52f0: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
5300: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
5310: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
5320: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
5330: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5340: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
5350: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5360: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
5370: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
53a0: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
53b0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
53c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
53d0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
53e0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
53f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
5400: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
5410: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
5420: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
5430: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
5440: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5450: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5460: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5470: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
5480: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
5490: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
54a0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
54b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
54c0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
54d0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
54e0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
54f0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
5520: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5530: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5540: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5550: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5560: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
5570: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
55a0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
55b0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
55c0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
55d0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
55e0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
55f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5600: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
5610: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
5640: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
5650: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5660: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  GER;.      pMem+
5670: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d  +;.    }..    pM
5680: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5690: 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45  Ephem|MEM_Str|ME
56a0: 4d 5f 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 50  M_Term;     /* P
56b0: 34 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  4 */.    pMem->z
56c0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
56d0: 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20  , pMem->zShort, 
56e0: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68  sizeof(pMem->zSh
56f0: 6f 72 74 29 29 3b 0a 20 20 20 20 61 73 73 65 72  ort));.    asser
5700: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
5710: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73  .    pMem->n = s
5720: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5730: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
5740: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
5750: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5760: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70  LITE_UTF8;.    p
5770: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
5780: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
5790: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
57a0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
57b0: 5f 54 65 72 6d 7c 4d 45 4d 5f 53 68 6f 72 74 3b  _Term|MEM_Short;
57c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
57d0: 20 73 70 72 69 6e 74 66 28 70 4d 65 6d 2d 3e 7a   sprintf(pMem->z
57e0: 53 68 6f 72 74 2c 20 22 25 2e 32 78 22 2c 20 70  Short, "%.2x", p
57f0: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
5800: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
5810: 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74  z = pMem->zShort
5820: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
5830: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5840: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
5850: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
5860: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
5870: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
5880: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
58b0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
58c0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
58d0: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
58e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
58f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
5900: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
5910: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
5920: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
5930: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74      pMem->n = st
5940: 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  rlen(pMem->z);. 
5950: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
5960: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
5970: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
5980: 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65     }..    p->nRe
5990: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35 2a  sColumn = 8 - 5*
59a0: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
59b0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
59c0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
59d0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
59e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
59f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5a00: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
5a10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5a20: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
5a30: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
5a40: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
5a50: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
5a60: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
5a70: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
5a80: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
5a90: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
5aa0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
5ab0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
5ac0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
5ad0: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
5ae0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
5af0: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
5b00: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
5b10: 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34  har *z = pOp->p4
5b20: 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  .z;.    while( i
5b30: 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20  sspace(*(u8*)z) 
5b40: 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74  ) z++;.    print
5b50: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
5b60: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
5b70: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
5b80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
5b90: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
5ba0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
5bb0: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
5bc0: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
5bd0: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
5be0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
5bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
5c00: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
5c10: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
5c20: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
5c30: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
5c40: 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29 20  3_io_trace==0 ) 
5c50: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
5c60: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
5c70: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
5c80: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
5c90: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
5ca0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
5cb0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
5cc0: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
5cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
5ce0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
5cf0: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
5d00: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
5d10: 30 3b 20 69 73 73 70 61 63 65 28 28 75 6e 73 69  0; isspace((unsi
5d20: 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b  gned char)z[i]);
5d30: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
5d40: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
5d50: 0a 20 20 20 20 20 20 69 66 28 20 69 73 73 70 61  .      if( isspa
5d60: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
5d70: 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  r)z[i]) ){.     
5d80: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
5d90: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
5da0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
5db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5dc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
5dd0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
5de0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
5df0: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
5e00: 74 65 33 5f 69 6f 5f 74 72 61 63 65 28 22 53 51  te3_io_trace("SQ
5e10: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
5e20: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
5e30: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
5e40: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
5e50: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a  _IOTRACE */.../*
5e60: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
5e70: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
5e80: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
5e90: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
5ea0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
5eb0: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
5ec0: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
5ed0: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
5ee0: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
5ef0: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
5f00: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
5f10: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
5f20: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
5f30: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
5f40: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
5f50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
5f60: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
5f70: 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56  ve a VDBE from V
5f80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74  DBE_MAGIC_INIT t
5f90: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
5fa0: 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RUN..*/.void sql
5fb0: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
5fc0: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
5ff0: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20  */.  int nVar,  
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6020: 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20   '?' see in the 
6030: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
6040: 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20  .  int nMem,    
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
6070: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61  emory cells to a
6080: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
6090: 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   nCursor,       
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
60b0: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
60c0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
60d0: 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20    int isExplain 
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
6100: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73  EXPLAIN keywords
6110: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29   is present */.)
6120: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
6130: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
6140: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
6150: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6160: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6170: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
6180: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
6190: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
61a0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
61b0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
61c0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
61d0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
61e0: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
61f0: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
6200: 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62  . This.   * is b
6210: 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
6220: 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  to resizeOpArray
6230: 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72  () below may shr
6240: 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e  ink the.   * p->
6250: 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73  aOp[] array to s
6260: 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61  ave memory if ca
6270: 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42  lled when in VDB
6280: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20  E_MAGIC_RUN .   
6290: 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20  * state..   */. 
62a0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
62b0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f  _MAGIC_RUN;..  /
62c0: 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f  *.  ** Allocatio
62d0: 6e 20 73 70 61 63 65 20 66 6f 72 20 72 65 67 69  n space for regi
62e0: 73 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sters..  */.  if
62f0: 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a  ( p->aMem==0 ){.
6300: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20      int nArg;   
6310: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
6320: 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61  umber of args pa
6330: 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66  ssed to a user f
6340: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
6350: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
6360: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 72  p, &nArg);.    r
6370: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20  esizeOpArray(p, 
6380: 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73  p->nOp);.    ass
6390: 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a  ert( nVar>=0 );.
63a0: 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69      if( isExplai
63b0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
63c0: 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
63d0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d  nMem = 10;.    }
63e0: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 73  .    p->aMem = s
63f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6400: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e  ro(db,.        n
6410: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Mem*sizeof(Mem) 
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6430: 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b   aMem */.      +
6440: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
6450: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
6460: 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20  /* aVar */.     
6470: 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d   + nArg*sizeof(M
6480: 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  em*)            
6490: 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20    /* apArg */.  
64a0: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
64b0: 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20  f(char*)        
64c0: 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f       /* azVar */
64d0: 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72  .      + nCursor
64e0: 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29  *sizeof(Cursor*)
64f0: 20 2b 20 31 20 20 20 20 2f 2a 20 61 70 43 73 72   + 1    /* apCsr
6500: 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   */.    );.    i
6510: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
6520: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  iled ){.      p-
6530: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
6540: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67       /* aMem[] g
6550: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d  oes from 1..nMem
6560: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65   */.      p->nMe
6570: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  m = nMem;       
6580: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
6590: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
65a0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
65b0: 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d  &p->aMem[nMem+1]
65c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20  ;.      p->nVar 
65d0: 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d  = nVar;.      p-
65e0: 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20  >okVar = 0;.    
65f0: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65    p->apArg = (Me
6600: 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61  m**)&p->aVar[nVa
6610: 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56  r];.      p->azV
6620: 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d  ar = (char**)&p-
6630: 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20  >apArg[nArg];.  
6640: 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28      p->apCsr = (
6650: 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56  Cursor**)&p->azV
6660: 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20  ar[nVar];.      
6670: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
6680: 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  rsor;.      for(
6690: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
66a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  ){.        p->aV
66b0: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
66c0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
66d0: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20  p->aVar[n].db = 
66e0: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
66f0: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
6700: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
6710: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
6720: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
6730: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
6740: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
6750: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
6760: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6770: 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d  .  for(n=1; n<p-
6780: 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  >nMem; n++){.   
6790: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
67a0: 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  [n].db==db );.  
67b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
67c0: 6d 5b 6e 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[n].flags==MEM_
67d0: 4e 75 6c 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  Null );.  }.#end
67e0: 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  if..  p->pc = -1
67f0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
6800: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71  TE_OK;.  p->uniq
6810: 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ueCnt = 0;.  p->
6820: 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b  returnDepth = 0;
6830: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
6840: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
6850: 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73  p->explain |= is
6860: 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61  Explain;.  p->ma
6870: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
6880: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
6890: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
68a0: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
68b0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
68c0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f  at = 255;.  p->o
68d0: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d  penedStatement =
68e0: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
68f0: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
6900: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
6910: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
6920: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
6930: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
6940: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
6950: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
6960: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
6970: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
6980: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
6990: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
69a0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
69b0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68   happens.** to h
69c0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
69d0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
69e0: 6f 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73  or(Vdbe *p, Curs
69f0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
6a00: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
6a10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6a20: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
6a30: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6a40: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
6a50: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >pCursor);.  }. 
6a60: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
6a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
6a80: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
6a90: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
6aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6ab0: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
6ac0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
6ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
6ae0: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
6af0: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
6b00: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
6b10: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
6b20: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
6b30: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
6b40: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
6b50: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
6b60: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
6b70: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
6b80: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
6b90: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  r);.    sqlite3S
6ba0: 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a  afetyOn(p->db);.
6bb0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
6bc0: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
6bd0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
6be0: 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a  ee(pCx->pData);.
6bf0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6c00: 43 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71  Cx->aType);.  sq
6c10: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 29 3b  lite3_free(pCx);
6c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6c30: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
6c40: 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73  pt for VTab curs
6c50: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ors that are cur
6c60: 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65  rently.** in use
6c70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6c80: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
6c90: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
6ca0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
6cb0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
6cc0: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
6cd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6ce0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
6cf0: 20 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d      Cursor *pC =
6d00: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
6d10: 20 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d    if( pC && (!p-
6d20: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c  >inVtabMethod ||
6d30: 20 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f   !pC->pVtabCurso
6d40: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
6d50: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
6d60: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
6d70: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
6d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
6d90: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
6da0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
6db0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
6dc0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
6dd0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
6de0: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
6df0: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
6e00: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
6e10: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
6e20: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
6e30: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
6e40: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
6e50: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
6e60: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
6e70: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
6e80: 69 6e 74 20 69 3b 0a 20 20 63 6c 6f 73 65 41 6c  int i;.  closeAl
6e90: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
6ea0: 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20  tiveVtabs(p);.  
6eb0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6ec0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
6ed0: 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  nMem);.  sqlite3
6ee0: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
6ef0: 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66 28 20  ->sFifo);.  if( 
6f00: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20  p->contextStack 
6f10: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6f20: 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  i<p->contextStac
6f30: 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  kTop; i++){.    
6f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66    sqlite3VdbeFif
6f50: 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e 74 65  oClear(&p->conte
6f60: 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69 66 6f  xtStack[i].sFifo
6f70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6f80: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 63 6f 6e  ite3_free(p->con
6f90: 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a  textStack);.  }.
6fa0: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
6fb0: 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  k = 0;.  p->cont
6fc0: 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20  extStackDepth = 
6fd0: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
6fe0: 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73  tackTop = 0;.  s
6ff0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
7000: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
7010: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
7020: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
7030: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
7040: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
7050: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
7060: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
7070: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
7080: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
7090: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
70a0: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
70b0: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
70c0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
70d0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
70e0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
70f0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
7100: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
7110: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
7120: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
7130: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
7140: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
7150: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
7160: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
7170: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
7180: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 72  e;.  int n;..  r
7190: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
71a0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
71b0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
71c0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_N);.  sqlite3_
71d0: 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  free(p->aColName
71e0: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
71f0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
7200: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
7210: 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70   nResColumn;.  p
7220: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
7230: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
7240: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7250: 6f 28 70 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  o(p->db, sizeof(
7260: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
7270: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
7280: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
7290: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
72a0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
72b0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
72c0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
72d0: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
72e0: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
72f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
7300: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
7310: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
7320: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
7330: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
7340: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
7350: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
7360: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
7370: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
7380: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
7390: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
73a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
73b0: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Cols()..**.** If
73c0: 20 4e 3d 3d 50 34 5f 53 54 41 54 49 43 20 20 69   N==P4_STATIC  i
73d0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e 61  t means that zNa
73e0: 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  me is a pointer 
73f0: 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74  to a constant st
7400: 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61  atic.** string a
7410: 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  nd we can just c
7420: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
7430: 20 49 66 20 69 74 20 69 73 20 50 34 5f 44 59 4e   If it is P4_DYN
7440: 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  AMIC, then .** t
7450: 68 65 20 73 74 72 69 6e 67 20 69 73 20 66 72 65  he string is fre
7460: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
7470: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  _free() when the
7480: 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65   vdbe is finishe
7490: 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74  d with.** it. Ot
74a0: 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73  herwise, N bytes
74b0: 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f   of zName are co
74c0: 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pied..*/.int sql
74d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
74e0: 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  me(Vdbe *p, int 
74f0: 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f  idx, int var, co
7500: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
7510: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72   int N){.  int r
7520: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
7530: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
7540: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
7550: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
7560: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
7570: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7580: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
7590: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
75a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
75b0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
75c0: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
75d0: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
75e0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
75f0: 20 69 66 28 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d   if( N==P4_DYNAM
7600: 49 43 20 7c 7c 20 4e 3d 3d 50 34 5f 53 54 41 54  IC || N==P4_STAT
7610: 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  IC ){.    rc = s
7620: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
7630: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
7640: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
7650: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
7660: 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TIC);.  }else{. 
7670: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
7680: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
7690: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c  lName, zName, N,
76a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c   SQLITE_UTF8,SQL
76b0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
76c0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
76d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34  LITE_OK && N==P4
76e0: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
76f0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
7700: 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  = (pColName->fla
7710: 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29  gs&(~MEM_Static)
7720: 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70  )|MEM_Dyn;.    p
7730: 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20  ColName->xDel = 
7740: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7750: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
7760: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
7770: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
7780: 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
7790: 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
77a0: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
77b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
77c0: 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
77d0: 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
77e0: 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
77f0: 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
7800: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
7810: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
7820: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
7830: 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
7840: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
7850: 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
7860: 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
7870: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
7880: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
7890: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
78a0: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
78b0: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
78c0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
78d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
78e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
78f0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
7900: 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  ;..  /* Before d
7910: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
7920: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
7930: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
7940: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
7950: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
7960: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
7970: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
7980: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
7990: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
79a0: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
79b0: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
79c0: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
79d0: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
79e0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
79f0: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
7a00: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
7a10: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
7a20: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
7a30: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
7a40: 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20 69  ync(db, rc);.  i
7a50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7a60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
7a70: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
7a80: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
7a90: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
7aa0: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
7ab0: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
7ac0: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
7ad0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7ae0: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
7af0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
7b00: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
7b10: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
7b20: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
7b30: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
7b40: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
7b50: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
7b60: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
7b70: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
7b80: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
7b90: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
7ba0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
7bb0: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
7bc0: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
7bd0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7be0: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
7bf0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7c00: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
7c10: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
7c20: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
7c30: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
7c40: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
7c50: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
7c60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
7c70: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
7c80: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
7c90: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
7ca0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
7cb0: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
7cc0: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
7cd0: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
7ce0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
7cf0: 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  f(db);.    rc = 
7d00: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
7d10: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
7d20: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
7d30: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
7d40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
7d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7d60: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
7d70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
7d80: 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
7d90: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
7da0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
7db0: 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
7dc0: 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
7dd0: 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
7de0: 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
7df0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
7e00: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
7e10: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
7e20: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
7e30: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
7e40: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
7e50: 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
7e60: 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
7e70: 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
7e80: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7e90: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49   is :memory:.  I
7ea0: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  n that case we d
7eb0: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f  o.  ** not suppo
7ec0: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
7ed0: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
7ee0: 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65 20   use the simple 
7ef0: 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74  case then.  ** t
7f00: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
7f10: 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33  ==strlen(sqlite3
7f20: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
7f30: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
7f40: 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29  ) || nTrans<=1 )
7f50: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
7f60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7f70: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7f80: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
7f90: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7fa0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
7fb0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
7fc0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
7fd0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
7fe0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
7ff0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
8000: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
8010: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
8020: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
8030: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
8040: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
8050: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
8060: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
8070: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
8080: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
8090: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
80a0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
80b0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
80c0: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
80d0: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
80e0: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
80f0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
8100: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
8110: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
8120: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
8130: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
8140: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
8150: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
8160: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8170: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8180: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
8190: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
81a0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
81b0: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
81c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
81d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
81e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
81f0: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
8200: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8210: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
8220: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
8230: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
8240: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
8250: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
8260: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
8270: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
8280: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
8290: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
82a0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
82b0: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  cly..  */.#ifnde
82c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
82d0: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
82e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
82f0: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
8300: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
8310: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
8320: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
8330: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
8340: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8350: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
8360: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
8370: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8380: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
8390: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
83a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
83b0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
83c0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20   offset = 0;..  
83d0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
83e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
83f0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f  e name */.    do
8400: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e   {.      u32 ran
8410: 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dom;.      sqlit
8420: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
8430: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
8440: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8450: 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f  (random), &rando
8460: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
8470: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
8480: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38  tf(db, "%s-mj%08
8490: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72  X", zMainFile, r
84a0: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
84b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
84c0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
84d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
84e0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
84f0: 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65    }while( sqlite
8500: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
8510: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
8520: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
8530: 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  ;..    /* Open t
8540: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8550: 6c 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  l. */.    rc = s
8560: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
8570: 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
8580: 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
8590: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
85a0: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
85b0: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
85c0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
85d0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
85e0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
85f0: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 29  JOURNAL, 0.    )
8600: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8610: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8620: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
8630: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
8640: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8650: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
8660: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
8670: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
8680: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8690: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
86a0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
86b0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
86c0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
86d0: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
86e0: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
86f0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8700: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
8710: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
8720: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
8730: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
8740: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
8750: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
8760: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
8770: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
8780: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
8790: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
87a0: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
87b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
87c0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
87d0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
87e0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
87f0: 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f     if( i==1 ) co
8800: 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e  ntinue;   /* Ign
8810: 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ore the TEMP dat
8820: 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  abase */.      i
8830: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
8840: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
8850: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
8860: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
8870: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
8880: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
8890: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
88a0: 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  0]==0 ) continue
88b0: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65  ;  /* Ignore :me
88c0: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
88d0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
88e0: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
88f0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
8900: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
8910: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
8920: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
8930: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8940: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
8950: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c  ter, zFile, strl
8960: 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  en(zFile)+1, off
8970: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
8980: 66 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a  fset += strlen(z
8990: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
89a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
89b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
89c0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
89d0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
89e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
89f0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
8a00: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
8a10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8a20: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
8a30: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8a40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8a60: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
8a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
8a80: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
8a90: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
8aa0: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
8ab0: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
8ac0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
8ad0: 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   zMainFile = sql
8ae0: 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e  ite3BtreeGetDirn
8af0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
8b00: 42 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 65  Bt);.    if( (ne
8b10: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
8b20: 28 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65  (0==(sqlite3OsDe
8b30: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
8b40: 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
8b50: 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
8b60: 54 49 41 4c 29 29 0a 20 20 20 20 20 26 26 20 28  TIAL)).     && (
8b70: 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  rc=sqlite3OsSync
8b80: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
8b90: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d  _SYNC_NORMAL))!=
8ba0: 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
8bb0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8bc0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
8bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8be0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
8bf0: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
8c00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
8c10: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
8c20: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
8c30: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
8c40: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
8c50: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
8c60: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
8c70: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
8c80: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
8c90: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
8ca0: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
8cb0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
8cc0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
8cd0: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
8ce0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
8cf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8d00: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
8d10: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
8d20: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
8d30: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
8d40: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
8d50: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
8d60: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
8d70: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
8d80: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
8d90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
8da0: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
8db0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
8dc0: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
8dd0: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
8de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8df0: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
8e00: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
8e10: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
8e20: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
8e30: 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ccured..    */. 
8e40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
8e50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
8e60: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8e70: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
8e80: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
8e90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
8ea0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
8ec0: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
8ed0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
8ee0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
8ef0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
8f00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28  Master);.    if(
8f10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8f20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f30: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
8f40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8f50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
8f60: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
8f70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
8f80: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
8f90: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
8fa0: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
8fb0: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
8fc0: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
8fd0: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
8fe0: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
8ff0: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
9000: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
9010: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
9020: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
9030: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
9040: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9050: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
9060: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
9070: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
9080: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9090: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
90a0: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
90b0: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
90c0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
90d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
90e0: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
90f0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9100: 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
9110: 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
9120: 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
9130: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
9140: 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
9150: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
9160: 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
9170: 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
9180: 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
9190: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
91a0: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
91b0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
91c0: 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
91d0: 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
91e0: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
91f0: 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
9200: 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
9210: 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
9220: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
9230: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
9240: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
9250: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
9260: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
9270: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
9280: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
9290: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
92a0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
92b0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
92c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
92d0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
92e0: 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  o(pBt);.      }.
92f0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 61 62 6c 65      }.    enable
9300: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
9310: 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
9320: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
9330: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
9340: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9350: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
9360: 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
9370: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69  the sqlite3.acti
9380: 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20  veVdbeCnt count 
9390: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
93a0: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
93b0: 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
93c0: 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
93d0: 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
93e0: 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
93f0: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
9400: 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
9410: 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
9420: 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
9430: 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
9440: 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
9450: 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
9460: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
9470: 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
9480: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
9490: 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
94a0: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
94b0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
94c0: 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
94d0: 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
94e0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
94f0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 70  int cnt = 0;.  p
9500: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
9510: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
9520: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
9530: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20  BE_MAGIC_RUN && 
9540: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
9550: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
9560: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
9570: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
9580: 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64  nt==db->activeVd
9590: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65  beCnt );.}.#else
95a0: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
95b0: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
95c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
95d0: 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61   every Btree tha
95e0: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  t in database co
95f0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63  nnection db whic
9600: 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  h .** has been m
9610: 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20  odified, "trip" 
9620: 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61  or invalidate ea
9630: 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20  ch cursor in.** 
9640: 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74  that Btree might
9650: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
9660: 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
9670: 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65  cursor.** can ne
9680: 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69  ver be used agai
9690: 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  n.  This happens
96a0: 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
96b0: 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65  .*** occurs.  We
96c0: 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c   have to trip al
96d0: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73  l the other curs
96e0: 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72  ors, even.** cur
96f0: 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56  sor from other V
9700: 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  Ms in different 
9710: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9720: 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74  ions,.** so that
9730: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72   none of them tr
9740: 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74  y to use the dat
9750: 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a  a at which they.
9760: 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67  ** were pointing
9770: 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d   and which now m
9780: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61  ay have been cha
9790: 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74  nged due.** to t
97a0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
97b0: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74  ** Remember that
97c0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20   a rollback can 
97d0: 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f  delete tables co
97e0: 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65  mplete and.** re
97f0: 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e  order rootpages.
9800: 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73    So it is not s
9810: 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74  ufficient just t
9820: 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74  o save.** the st
9830: 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
9840: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  r.  We have to i
9850: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75  nvalidate the cu
9860: 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20  rsor.** so that 
9870: 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  it is never used
9880: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   again..*/.stati
9890: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
98a0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
98b0: 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33  edBtrees(sqlite3
98c0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
98d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
98e0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
98f0: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
9900: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
9910: 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42  f( p && sqlite3B
9920: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
9930: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9940: 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
9950: 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41  sors(p, SQLITE_A
9960: 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  BORT);.    }.  }
9970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9980: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9990: 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
99a0: 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
99b0: 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
99c0: 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
99d0: 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
99e0: 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
99f0: 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
9a00: 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
9a10: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
9a20: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
9a30: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
9a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9a50: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
9a60: 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
9a70: 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
9a80: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
9a90: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
9aa0: 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72  HALT.  It is har
9ab0: 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c  mless to.** call
9ac0: 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68   this on a VM th
9ad0: 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c  at is in the SQL
9ae0: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73  ITE_MAGIC_HALT s
9af0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tate..**.** Retu
9b00: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
9b10: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
9b20: 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
9b30: 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
9b40: 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
9b50: 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
9b60: 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
9b70: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
9b80: 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
9b90: 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
9ba0: 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
9bb0: 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
9bc0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9bd0: 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
9be0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
9bf0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
9c00: 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e   i;.  int (*xFun
9c10: 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d  c)(Btree *pBt) =
9c20: 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e   0;  /* Function
9c30: 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68   to call on each
9c40: 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a   btree backend *
9c50: 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69 61  /.  int isSpecia
9c60: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
9c70: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
9c80: 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e if SQLITE_NOME
9c90: 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20  M or IOERR */.. 
9ca0: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
9cb0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
9cc0: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
9cd0: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
9ce0: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
9cf0: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
9d00: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
9d10: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
9d20: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
9d30: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
9d40: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
9d50: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
9d60: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
9d70: 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
9d80: 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
9d90: 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
9da0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
9db0: 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
9dc0: 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
9dd0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
9de0: 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
9df0: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
9e00: 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
9e10: 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
9e20: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
9e30: 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
9e40: 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
9e50: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
9e60: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
9e70: 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
9e80: 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
9e90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
9ea0: 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
9eb0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
9ec0: 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
9ed0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9ee0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
9ef0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9f00: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
9f10: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
9f20: 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69 66 28  eVtabs(p);.  if(
9f30: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
9f40: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
9f50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9f60: 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63  K;.  }.  checkAc
9f70: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
9f80: 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
9f90: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
9fa0: 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
9fb0: 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
9fc0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
9fd0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  =0 ){.    int mr
9fe0: 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
9ff0: 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
a000: 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a  p->rc */..    /*
a010: 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
a020: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
a030: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
a040: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
a050: 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d  rrayEnter(&p->aM
a060: 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  utex);..    /* C
a070: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
a080: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
a090: 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
a0a0: 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
a0b0: 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
a0c0: 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
a0d0: 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
a0e0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
a100: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
a110: 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
a120: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
a130: 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
a140: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
a150: 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73  This loop does s
a160: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f  tatic analysis o
a170: 66 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 73  f the query to s
a180: 65 65 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a  ee which of the.
a190: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
a1a0: 6e 67 20 74 68 72 65 65 20 63 61 74 65 67 6f 72  ng three categor
a1b0: 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74  ies it falls int
a1c0: 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o:.      **.    
a1d0: 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e    **     Read-on
a1e0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ly.      **     
a1f0: 51 75 65 72 79 20 77 69 74 68 20 73 74 61 74 65  Query with state
a200: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ment journal.   
a210: 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20     **     Query 
a220: 77 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e  without statemen
a230: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
a240: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 63  **.      ** We c
a250: 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e  ould do somethin
a260: 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20 74  g more elegant t
a270: 68 61 6e 20 74 68 69 73 20 73 74 61 74 69 63 20  han this static 
a280: 61 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20  analysis (i.e.. 
a290: 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68       ** store th
a2a0: 65 20 74 79 70 65 20 6f 66 20 71 75 65 72 79 20  e type of query 
a2b0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
a2c0: 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61 73 65  ompliation phase
a2d0: 29 2c 20 62 75 74 20 0a 20 20 20 20 20 20 2a 2a  ), but .      **
a2e0: 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63   handling malloc
a2f0: 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
a300: 20 69 73 20 61 20 66 61 69 72 6c 79 20 6f 62 73   is a fairly obs
a310: 63 75 72 65 20 65 64 67 65 20 63 61 73 65 20 73  cure edge case s
a320: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
a330: 20 69 73 20 70 72 6f 62 61 62 6c 79 20 65 61 73   is probably eas
a340: 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74  ier. Todo: Might
a350: 20 62 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   be an opportuni
a360: 74 79 20 74 6f 20 72 65 64 75 63 65 20 0a 20 20  ty to reduce .  
a370: 20 20 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65      ** code size
a380: 20 61 20 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d   a very small am
a390: 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20  ount though.... 
a3a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
a3b0: 74 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 3d 20  t notReadOnly = 
a3c0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53  0;.      int isS
a3d0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
a3e0: 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f      assert(p->aO
a3f0: 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b  p || p->nOp==0);
a400: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a410: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20  i<p->nOp; i++){ 
a420: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
a430: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
a440: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  e ){.          c
a450: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
a460: 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  on:.            
a470: 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 7c 3d 20 70  notReadOnly |= p
a480: 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b 0a 20 20 20  ->aOp[i].p2;.   
a490: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a4a0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
a4b0: 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20  P_Statement:.   
a4c0: 20 20 20 20 20 20 20 20 20 69 73 53 74 61 74 65           isState
a4d0: 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  ment = 1;.      
a4e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
a500: 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20     .      /* If 
a510: 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
a520: 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64  ad-only, we need
a530: 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   do no rollback 
a540: 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73  at all. Otherwis
a550: 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e,.      ** proc
a560: 65 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65  eed with the spe
a570: 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
a580: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
a590: 28 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 7c 7c  ( notReadOnly ||
a5a0: 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
a5b0: 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
a5c0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a5d0: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
a5e0: 44 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74  D && isStatement
a5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
a600: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
a610: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
a620: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
a630: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
a640: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
a650: 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  ( (mrc==SQLITE_N
a660: 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
a670: 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 69 73 53  ITE_FULL) && isS
a680: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
a690: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
a6a0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
a6b0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  ckStmt;.        
a6c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a6d0: 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
a6e0: 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
a6f0: 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
a700: 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
a710: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
a720: 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
a730: 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
a740: 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
a750: 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
a760: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
a770: 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64           invalid
a780: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
a790: 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
a7a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a7b0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
a7c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
a7d0: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
a7e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a7f0: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
a800: 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
a810: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
a820: 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
a830: 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76 64 62   only active vdb
a840: 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77  e, then.    ** w
a850: 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
a860: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
a870: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
a880: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
a890: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
a8a0: 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
a8b0: 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
a8c0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
a8d0: 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
a8e0: 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
a8f0: 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  cured. .    */. 
a900: 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43     if( db->autoC
a910: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63 74  ommit && db->act
a920: 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b  iveVdbeCnt==1 ){
a930: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
a940: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
a950: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
a960: 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
a970: 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
a980: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
a990: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
a9a0: 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20  s true, and the 
a9b0: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
a9c0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 63   .        ** suc
a9d0: 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61  cessful or hit a
a9e0: 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
a9f0: 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61  traint. This mea
aa00: 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
aa10: 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
aa20: 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
aa30: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
aa40: 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b   vdbeCommit(db);
aa50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
aa60: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
aa70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aa80: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
aa90: 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
aaa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
aab0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
aac0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
aad0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
aae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
aaf0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
ab00: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
ab10: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
ab20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ab30: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
ab40: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
ab50: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
ab60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ab70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
ab80: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
ab90: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
aba0: 69 66 28 20 21 78 46 75 6e 63 20 29 7b 0a 20 20  if( !xFunc ){.  
abb0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
abc0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
abd0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
abe0: 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ail ){.        i
abf0: 66 28 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74  f( p->openedStat
ac00: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ement ){.       
ac10: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
ac20: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
ac30: 74 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  t;.        } .  
ac40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
ac50: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
ac60: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
ac70: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
ac80: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
ac90: 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  mt;.      }else{
aca0: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
acb0: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
acc0: 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
acd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
ace0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
acf0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
ad00: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
ad10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
ad20: 20 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20   /* If xFunc is 
ad30: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
ad40: 74 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69  t is one of sqli
ad50: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
ad60: 53 74 6d 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73  Stmt or.    ** s
ad70: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ad80: 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f  tStmt. Call it o
ad90: 6e 63 65 20 6f 6e 20 65 61 63 68 20 62 61 63 6b  nce on each back
ada0: 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  end. If an error
adb0: 20 6f 63 63 75 72 73 0a 20 20 20 20 2a 2a 20 61   occurs.    ** a
adc0: 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  nd the return co
add0: 64 65 20 69 73 20 73 74 69 6c 6c 20 53 51 4c 49  de is still SQLI
ade0: 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72  TE_OK, set the r
adf0: 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68  eturn code to th
ae00: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 65 72 72  e new.    ** err
ae10: 6f 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  or value..    */
ae20: 0a 20 20 20 20 61 73 73 65 72 74 28 21 78 46 75  .    assert(!xFu
ae30: 6e 63 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e  nc ||.      xFun
ae40: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43  c==sqlite3BtreeC
ae50: 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20  ommitStmt ||.   
ae60: 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65     xFunc==sqlite
ae70: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
ae80: 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f  mt.    );.    fo
ae90: 72 28 69 3d 30 3b 20 78 46 75 6e 63 20 26 26 20  r(i=0; xFunc && 
aea0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
aeb0: 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a   .      int rc;.
aec0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
aed0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
aee0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
aef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
af00: 20 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20 20   xFunc(pBt);.   
af10: 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20 28       if( rc && (
af20: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
af30: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
af40: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b  E_CONSTRAINT) ){
af50: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
af60: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
af70: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
af80: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 30  g(&p->zErrMsg, 0
af90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
afa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
afb0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
afc0: 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
afd0: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
afe0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   the statement w
aff0: 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20  as committed, . 
b000: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68     ** set the ch
b010: 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20  ange counter. . 
b020: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
b030: 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20  >changeCntOn && 
b040: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
b050: 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20    if( !xFunc || 
b060: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
b070: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b  reeCommitStmt ){
b080: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b090: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
b0a0: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
b0b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b0d0: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
b0e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b0f0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
b100: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
b110: 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
b120: 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
b130: 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
b140: 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
b150: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
b160: 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
b170: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
b180: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
b190: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
b1a0: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
b1b0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
b1c0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
b1d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
b1e0: 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
b1f0: 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
b200: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
b210: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
b220: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
b230: 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tex);.  }..  /* 
b240: 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
b250: 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
b260: 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
b270: 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
b280: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
b290: 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
b2a0: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
b2b0: 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
b2c0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
b2d0: 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
b2e0: 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
b2f0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
b300: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
b310: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
b320: 4d 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63  M;.  }.  checkAc
b330: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
b340: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
b350: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
b360: 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
b370: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
b380: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
b390: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
b3a0: 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
b3b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
b3c0: 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
b3d0: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
b3e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b3f0: 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
b400: 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
b410: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
b420: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
b430: 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
b440: 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
b450: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
b460: 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
b470: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
b480: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
b490: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
b4a0: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
b4b0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
b4c0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
b4d0: 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
b4e0: 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
b4f0: 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
b500: 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
b510: 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
b520: 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
b530: 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
b540: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
b550: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
b560: 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
b570: 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
b580: 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
b590: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
b5a0: 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
b5b0: 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
b5c0: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
b5d0: 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
b5e0: 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
b5f0: 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
b600: 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
b610: 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
b620: 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
b630: 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
b640: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
b650: 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
b660: 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
b670: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
b680: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
b690: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
b6a0: 6c 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  lt(p);.  sqlite3
b6b0: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
b6c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
b6d0: 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
b6e0: 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
b6f0: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
b700: 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
b710: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
b720: 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
b730: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
b740: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
b750: 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
b760: 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
b770: 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
b780: 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
b790: 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
b7a0: 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
b7b0: 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
b7c0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
b7d0: 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
b7e0: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
b7f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
b800: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
b810: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
b820: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
b830: 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
b840: 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
b850: 5f 55 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72  _UTF8,sqlite3_fr
b860: 65 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  ee);.      db->e
b870: 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
b880: 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
b890: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
b8a0: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
b8b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
b8c0: 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
b8d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b8e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
b8f0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
b900: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
b910: 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
b920: 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
b930: 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
b940: 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
b950: 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
b960: 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
b970: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
b980: 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
b990: 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
b9a0: 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
b9b0: 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
b9c0: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
b9d0: 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
b9e0: 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
b9f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
ba00: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
ba10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
ba20: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
ba30: 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
ba40: 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
ba50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
ba60: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
ba70: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
ba80: 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
ba90: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
baa0: 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
bab0: 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
bac0: 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
bad0: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
bae0: 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
baf0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
bb00: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
bb10: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
bb20: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
bb30: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
bb40: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
bb50: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
bb60: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
bb70: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bb80: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
bb90: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
bba0: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
bbb0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
bbc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
bbd0: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
bbe0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
bbf0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
bc00: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
bc10: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
bc20: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
bc30: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
bc40: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
bc50: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
bc60: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
bc70: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
bc80: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
bc90: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
bca0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
bcb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
bcc0: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
bcd0: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
bce0: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
bcf0: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
bd00: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
bd10: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
bd20: 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74  INIT;.  p->abort
bd30: 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ed = 0;.  return
bd40: 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
bd50: 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
bd60: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
bd70: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
bd80: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
bd90: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
bda0: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
bdb0: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
bdc0: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
bdd0: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
bde0: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
bdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
be00: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
be10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
be20: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
be30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
be40: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
be50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
be60: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
be70: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
be80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
be90: 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
bea0: 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c  sk)==rc );.  }el
beb0: 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  se if( p->magic!
bec0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
bed0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
bee0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
bef0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
bf00: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
bf10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bf20: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
bf30: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
bf40: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
bf50: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
bf60: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
bf70: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
bf80: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
bf90: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
bfa0: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
bfb0: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
bfc0: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
bfd0: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
bfe0: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
bff0: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
c000: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
c010: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
c020: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
c030: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
c040: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
c050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
c060: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
c070: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
c080: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
c090: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
c0a0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
c0b0: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c  1 || !(mask&(1<<
c0c0: 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
c0d0: 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
c0e0: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
c0f0: 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
c100: 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
c110: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c120: 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
c130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c140: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
c150: 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
c160: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
c170: 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
c180: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c190: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c1a0: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66  Cleanup(p);.  if
c1b0: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
c1c0: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
c1d0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
c1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c1f0: 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d  t( p->db->pVdbe=
c200: 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d  =p );.    p->db-
c210: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
c220: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
c230: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
c240: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
c250: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
c260: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
c270: 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f   Op *pOp = p->aO
c280: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
c290: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70  i<p->nOp; i++, p
c2a0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
c2b0: 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c  eP4(pOp->p4type,
c2c0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
c2d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
c2f0: 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  ree(pOp->zCommen
c300: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
c310: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c320: 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a  3_free(p->aOp);.
c330: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
c340: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
c350: 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74  ->nVar);.  sqlit
c360: 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65  e3_free(p->aLabe
c370: 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  l);.  if( p->aMe
c380: 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  m ){.    sqlite3
c390: 5f 66 72 65 65 28 26 70 2d 3e 61 4d 65 6d 5b 31  _free(&p->aMem[1
c3a0: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
c3b0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
c3c0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
c3d0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
c3e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c3f0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
c400: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c410: 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69  zSql);.  p->magi
c420: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
c430: 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  EAD;.  sqlite3_f
c440: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
c450: 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
c460: 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
c470: 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
c480: 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
c490: 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
c4a0: 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  w.  Return an er
c4b0: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f  ror code.  If no
c4c0: 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69   MoveTo is pendi
c4d0: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ng, this.** rout
c4e0: 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67  ine does nothing
c4f0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
c500: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
c510: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
c520: 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70  Moveto(Cursor *p
c530: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
c540: 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
c550: 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
c560: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
c570: 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  T.    extern int
c580: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
c590: 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
c5a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
c5b0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  able );.    rc =
c5c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
c5d0: 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  eto(p->pCursor, 
c5e0: 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
c5f0: 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
c600: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
c610: 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49  n rc;.    *p->pI
c620: 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ncrKey = 0;.    
c630: 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b  p->lastRowid = k
c640: 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74  eyToInt(p->movet
c650: 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d  oTarget);.    p-
c660: 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
c670: 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20  res==0;.    if( 
c680: 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  res<0 ){.      r
c690: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
c6a0: 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c  Next(p->pCursor,
c6b0: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
c6c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c6d0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
c6e0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
c6f0: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
c700: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
c710: 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
c720: 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
c730: 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
c740: 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20  CHE_STALE;.  }. 
c750: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
c770: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
c780: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
c790: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
c7a0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
c7b0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
c7c0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c7d0: 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73  erialRead().** s
c7e0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
c7f0: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
c800: 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65 28  VdbeSerialWrite(
c810: 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
c820: 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
c830: 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
c840: 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
c850: 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
c860: 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
c870: 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
c880: 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
c890: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
c8a0: 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
c8b0: 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
c8c0: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
c8d0: 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
c8e0: 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
c8f0: 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
c900: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
c910: 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
c920: 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
c930: 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
c940: 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
c950: 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
c960: 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
c970: 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
c980: 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
c990: 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
c9a0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
c9b0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c9c0: 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
c9d0: 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
c9e0: 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
c9f0: 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
ca00: 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
ca10: 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
ca20: 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
ca30: 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
ca40: 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  seperately..**.*
ca50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ca60: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
ca70: 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
ca80: 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
ca90: 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
caa0: 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
cab0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
cac0: 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
cad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
cae0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
caf0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
cb00: 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
cb30: 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
cb60: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
cb70: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
cb90: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
cba0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
cbb0: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
cbc0: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
cbd0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
cbe0: 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
cc10: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
cc20: 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
cc30: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
cc40: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
cc50: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
cc80: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
cc90: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
ccb0: 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
ccc0: 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
ccf0: 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
cd00: 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
cd30: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
cd40: 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
cd70: 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
cd80: 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
cd90: 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
cda0: 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
cdb0: 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
cdc0: 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
cdd0: 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
cde0: 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
cdf0: 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
ce00: 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
ce10: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
ce20: 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
ce30: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
ce40: 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
ce50: 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
ce60: 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
ce70: 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
ce80: 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
ce90: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
cea0: 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
ceb0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
cec0: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
ced0: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
cee0: 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
cef0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e  ->flags;.  int n
cf00: 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
cf10: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
cf20: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
cf30: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
cf40: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
cf50: 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
cf60: 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
cf70: 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
cf80: 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
cf90: 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
cfa0: 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  001000)<<32)-1).
cfb0: 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
cfc0: 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
cfd0: 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66  ;.    if( file_f
cfe0: 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31  ormat>=4 && (i&1
cff0: 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65  )==i ){.      re
d000: 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a  turn 8+i;.    }.
d010: 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69      u = i<0 ? -i
d020: 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c   : i;.    if( u<
d030: 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
d040: 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
d050: 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
d060: 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
d070: 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
d080: 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
d090: 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
d0a0: 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
d0b0: 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
d0c0: 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
d0d0: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
d0e0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
d0f0: 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
d100: 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d  sert( flags&(MEM
d110: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
d120: 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
d130: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
d140: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
d150: 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20   += pMem->u.i;. 
d160: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
d170: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
d180: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
d190: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
d1a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
d1b0: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
d1c0: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
d1d0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
d1e0: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
d1f0: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
d200: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d210: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
d220: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
d230: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
d240: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
d250: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
d260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
d270: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
d280: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
d290: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
d2a0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
d2b0: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
d2c0: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
d2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
d2e0: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
d2f0: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
d300: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
d310: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
d320: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
d330: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
d340: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
d350: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
d360: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
d370: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
d380: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
d390: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
d3a0: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
d3b0: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
d3c0: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
d3d0: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
d3e0: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
d3f0: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
d400: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
d410: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
d420: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
d430: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
d440: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
d450: 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
d460: 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
d470: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
d480: 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
d490: 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
d4a0: 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
d4b0: 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
d4c0: 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
d4d0: 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
d4e0: 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
d4f0: 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
d500: 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
d510: 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
d520: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
d530: 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
d540: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
d550: 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
d560: 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
d570: 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
d580: 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
d590: 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
d5a0: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
d5b0: 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
d5c0: 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
d5d0: 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
d5e0: 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
d5f0: 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
d600: 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
d610: 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
d620: 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
d630: 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
d640: 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
d650: 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
d660: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
d670: 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
d680: 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
d690: 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
d6a0: 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
d6b0: 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
d6c0: 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
d6d0: 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
d6e0: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
d6f0: 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
d700: 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
d710: 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
d720: 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
d730: 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
d740: 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
d750: 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
d760: 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
d770: 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
d780: 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
d790: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
d7a0: 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
d7b0: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
d7c0: 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
d7d0: 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
d7e0: 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
d7f0: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
d800: 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
d810: 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
d820: 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
d830: 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
d840: 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
d850: 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
d860: 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
d870: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
d880: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
d890: 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
d8a0: 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
d8b0: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
d8c0: 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
d8d0: 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
d8e0: 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
d8f0: 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
d900: 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
d910: 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
d920: 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
d930: 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
d940: 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
d950: 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
d960: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
d970: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
d980: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
d990: 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
d9a0: 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
d9b0: 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
d9c0: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
d9d0: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
d9e0: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
d9f0: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
da00: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
da10: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
da20: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
da30: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
da40: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
da50: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
da60: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
da70: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
da80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
da90: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
daa0: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
dab0: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
dac0: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
dad0: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
dae0: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
daf0: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
db00: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
db10: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
db20: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
db30: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
db40: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
db50: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
db60: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
db70: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
db80: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
db90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
dba0: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
dbb0: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
dbc0: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
dbd0: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
dbe0: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
dbf0: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
dc00: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
dc10: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
dc20: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
dc30: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
dc40: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
dc50: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
dc60: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
dc70: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
dc80: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
dc90: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
dca0: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
dcb0: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
dcc0: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
dcd0: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
dce0: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
dcf0: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
dd00: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
dd10: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
dd20: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
dd30: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
dd40: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
dd50: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
dd60: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
dd70: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
dd80: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
dd90: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
dda0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
ddb0: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
ddc0: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
ddd0: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
dde0: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
ddf0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
de00: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
de10: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
de20: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
de30: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
de40: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
de50: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
de60: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
de70: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
de80: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
de90: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
dea0: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
deb0: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
dec0: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
ded0: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
dee0: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
def0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
df00: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
df10: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
df20: 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
df30: 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
df40: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
df50: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
df60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
df70: 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
df80: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
df90: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
dfa0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
dfb0: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
dfc0: 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75  assert( len<=nBu
dfd0: 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
dfe0: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
dff0: 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a  [i] = (v&0xFF);.
e000: 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
e010: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e020: 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
e030: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
e040: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
e050: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
e060: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
e070: 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
e080: 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
e090: 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20  u.i:0).         
e0a0: 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64      == sqlite3Vd
e0b0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
e0c0: 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
e0d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
e0e0: 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
e0f0: 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
e100: 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
e110: 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
e120: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
e130: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
e140: 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
e150: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69  em->u.i;.      i
e160: 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20  f( len>nBuf ){. 
e170: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75         len = nBu
e180: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
e190: 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
e1a0: 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
e1b0: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
e1c0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
e1d0: 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
e1e0: 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
e1f0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
e200: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
e210: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
e220: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
e230: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
e240: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
e250: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
e260: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
e270: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
e280: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
e290: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
e2a0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
e2b0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
e2c0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
e2d0: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
e2e0: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
e2f0: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
e300: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
e310: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
e320: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
e330: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
e360: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
e370: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
e380: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
e390: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
e3a0: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
e3b0: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
e3c0: 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
e3d0: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
e3e0: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
e3f0: 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
e400: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
e410: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e420: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
e430: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e440: 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
e450: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
e460: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
e470: 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
e480: 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
e490: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e4a0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
e4b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
e4c0: 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
e4d0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
e4e0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
e4f0: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
e500: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
e510: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
e520: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e530: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e540: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
e550: 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
e560: 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
e570: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
e580: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
e590: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
e5a0: 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
e5b0: 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
e5c0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
e5d0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e5e0: 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
e5f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
e600: 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
e610: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
e620: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e630: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
e640: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
e650: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
e660: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
e670: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e680: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
e690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e6a0: 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
e6b0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e6c0: 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
e6d0: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
e6e0: 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
e6f0: 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
e700: 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
e710: 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
e720: 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
e730: 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
e740: 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
e750: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
e760: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
e770: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e780: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
e790: 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
e7a0: 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
e7b0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
e7c0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
e7d0: 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
e7e0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
e7f0: 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
e800: 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
e810: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
e820: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e830: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
e840: 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
e850: 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
e860: 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
e870: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
e880: 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
e890: 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
e8a0: 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
e8b0: 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
e8c0: 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
e8d0: 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
e8e0: 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
e8f0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
e900: 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
e910: 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
e920: 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
e930: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e940: 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
e950: 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
e960: 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
e970: 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
e980: 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
e990: 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
e9a0: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e9b0: 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
e9c0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
e9d0: 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
e9e0: 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
e9f0: 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
ea00: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
ea10: 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
ea20: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
ea30: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
ea40: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
ea50: 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
ea60: 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
ea70: 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
ea80: 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
ea90: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
eaa0: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
eab0: 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
eac0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
ead0: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
eae0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
eaf0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
eb00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
eb10: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
eb20: 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
eb30: 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
eb40: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
eb50: 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
eb60: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
eb70: 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
eb80: 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
eb90: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
eba0: 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
ebb0: 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
ebc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
ebd0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
ebe0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
ebf0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
ec00: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
ec10: 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
ec20: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
ec30: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
ec40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
ec50: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
ec60: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  t: {.      int l
ec70: 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
ec80: 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
ec90: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
eca0: 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
ecb0: 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
ecc0: 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
ecd0: 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
ece0: 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
ecf0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
ed00: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
ed10: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
ed20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ed30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ed40: 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
ed50: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
ed60: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
ed70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ed80: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
ed90: 68 65 61 64 65 72 20 6f 66 20 61 20 72 65 63 6f  header of a reco
eda0: 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  rd consists of a
edb0: 20 73 65 71 75 65 6e 63 65 20 76 61 72 69 61 62   sequence variab
edc0: 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le-length intege
edd0: 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74  rs..** These int
ede0: 65 67 65 72 73 20 61 72 65 20 61 6c 6d 6f 73 74  egers are almost
edf0: 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e   always small an
ee00: 64 20 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73  d are encoded as
ee10: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
ee20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
ee30: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 64 76   macro takes adv
ee40: 61 6e 74 61 67 65 20 74 68 69 73 20 66 61 63 74  antage this fact
ee50: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 66 61   to provide a fa
ee60: 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20  st decode.** of 
ee70: 74 68 65 20 69 6e 74 65 67 65 72 73 20 69 6e 20  the integers in 
ee80: 61 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 2e  a record header.
ee90: 20 20 49 74 20 69 73 20 66 61 73 74 65 72 20 66    It is faster f
eea0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
eeb0: 73 65 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  se.** where the 
eec0: 69 6e 74 65 67 65 72 20 69 73 20 61 20 73 69 6e  integer is a sin
eed0: 67 6c 65 20 62 79 74 65 2e 20 20 49 74 20 69 73  gle byte.  It is
eee0: 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
eef0: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74   when the.** int
ef00: 65 67 65 72 20 69 73 20 74 77 6f 20 6f 72 20 6d  eger is two or m
ef10: 6f 72 65 20 62 79 74 65 73 2e 20 20 42 75 74 20  ore bytes.  But 
ef20: 6f 76 65 72 61 6c 6c 20 69 74 20 69 73 20 66 61  overall it is fa
ef30: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ster..**.** The 
ef40: 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
ef50: 73 69 6f 6e 73 20 61 72 65 20 65 71 75 69 76 61  sions are equiva
ef60: 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lent:.**.**     
ef70: 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61  x = sqlite3GetVa
ef80: 72 69 6e 74 33 32 28 20 41 2c 20 26 42 20 29 3b  rint32( A, &B );
ef90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47  .**.**     x = G
efa0: 65 74 56 61 72 69 6e 74 28 20 41 2c 20 42 20 29  etVarint( A, B )
efb0: 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ;.**.*/.#define 
efc0: 47 65 74 56 61 72 69 6e 74 28 41 2c 42 29 20 20  GetVarint(A,B)  
efd0: 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37  ((B = *(A))<=0x7
efe0: 66 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 47  f ? 1 : sqlite3G
eff0: 65 74 56 61 72 69 6e 74 33 32 28 41 2c 20 26 42  etVarint32(A, &B
f000: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ))../*.** This f
f010: 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
f020: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
f030: 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
f040: 6f 72 64 73 20 73 70 65 63 69 66 69 65 64 20 62  ords specified b
f050: 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b  y .** {nKey1, pK
f060: 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c  ey1} and {nKey2,
f070: 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72 6e 69   pKey2}, returni
f080: 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ng a negative, z
f090: 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
f0a0: 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e  ve integer if {n
f0b0: 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20  Key1, pKey1} is 
f0c0: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
f0d0: 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
f0e0: 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20  er than {nKey2, 
f0f0: 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20 4b 65  pKey2}.  Both Ke
f100: 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75 73 74  y1 and Key2 must
f110: 20 62 65 20 62 79 74 65 20 73 74 72 69 6e 67 73   be byte strings
f120: 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62 79 20  .** composed by 
f130: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
f140: 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
f150: 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  VDBE..*/.int sql
f160: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
f170: 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 75  mpare(.  void *u
f180: 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e  serData,.  int n
f190: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
f1a0: 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20   *pKey1, .  int 
f1b0: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
f1c0: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 4b 65  d *pKey2.){.  Ke
f1d0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
f1e0: 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73 65 72  = (KeyInfo*)user
f1f0: 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31 2c 20  Data;.  u32 d1, 
f200: 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d2;          /* 
f210: 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
f220: 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
f230: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
f240: 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20 20 20   idx1, idx2;    
f250: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
f260: 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
f270: 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
f280: 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 2c 20  /.  u32 szHdr1, 
f290: 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75 6d 62  szHdr2;  /* Numb
f2a0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
f2b0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
f2c0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
f2d0: 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
f2e0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
f2f0: 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
f300: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
f310: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
f320: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f330: 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63  char *aKey2 = (c
f340: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f350: 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 4d  ar *)pKey2;..  M
f360: 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d  em mem1;.  Mem m
f370: 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  em2;.  mem1.enc 
f380: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
f390: 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
f3a0: 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d  yInfo->db;.  mem
f3b0: 32 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  2.enc = pKeyInfo
f3c0: 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 64 62  ->enc;.  mem2.db
f3d0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
f3e0: 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74  .  .  idx1 = Get
f3f0: 56 61 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a  Varint(aKey1, sz
f400: 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
f410: 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47  Hdr1;.  idx2 = G
f420: 65 74 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20  etVarint(aKey2, 
f430: 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20  szHdr2);.  d2 = 
f440: 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64  szHdr2;.  nField
f450: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
f460: 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  eld;.  while( id
f470: 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78  x1<szHdr1 && idx
f480: 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20  2<szHdr2 ){.    
f490: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
f4a0: 3b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  ;.    u32 serial
f4b0: 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20  _type2;..    /* 
f4c0: 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
f4d0: 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
f4e0: 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
f4f0: 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
f500: 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74  dx1 += GetVarint
f510: 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
f520: 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20  rial_type1 );.  
f530: 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
f540: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
f550: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
f560: 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
f570: 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d  eak;.    idx2 +=
f580: 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79   GetVarint( aKey
f590: 32 2b 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74  2+idx2, serial_t
f5a0: 79 70 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ype2 );.    if( 
f5b0: 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c  d2>=nKey2 && sql
f5c0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f5d0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
f5e0: 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e2)>0 ) break;..
f5f0: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
f600: 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
f610: 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
f620: 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
f630: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
f640: 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
f650: 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
f660: 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69  ;.    d2 += sqli
f670: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
f680: 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72  (&aKey2[d2], ser
f690: 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32  ial_type2, &mem2
f6a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
f6b0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
f6c0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
f6d0: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
f6e0: 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e  mem1, &mem2, i<n
f6f0: 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f  Field ? pKeyInfo
f700: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b  ->aColl[i] : 0);
f710: 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c  .    if( mem1.fl
f720: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20  ags & MEM_Dyn ) 
f730: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
f740: 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20  lease(&mem1);.  
f750: 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73    if( mem2.flags
f760: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c   & MEM_Dyn ) sql
f770: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
f780: 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69  se(&mem2);.    i
f790: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
f7a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f7b0: 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
f7c0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  * One of the key
f7d0: 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
f7e0: 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  lds, but all the
f7f0: 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
f800: 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65  at point.  ** we
f810: 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
f820: 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73   incrKey flag is
f830: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
f840: 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20  second key is.  
f850: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61  ** treated as la
f860: 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rger..  */.  if(
f870: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
f880: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72  ( pKeyInfo->incr
f890: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
f8a0: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
f8b0: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70  if( !pKeyInfo->p
f8c0: 72 65 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a  refixIsEqual ){.
f8d0: 20 20 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65        if( d1<nKe
f8e0: 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  y1 ){.        rc
f8f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
f900: 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29  e if( d2<nKey2 )
f910: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
f920: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
f930: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65  .  }else if( pKe
f940: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
f950: 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d  r && i<pKeyInfo-
f960: 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20  >nField.        
f970: 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e         && pKeyIn
f980: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
f990: 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72  ] ){.    rc = -r
f9a0: 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
f9b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f9c0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
f9d0: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d   index entry com
f9e0: 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20  posed using the 
f9f0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
fa00: 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73  code..** The las
fa10: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  t entry in this 
fa20: 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
fa30: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65   an integer (spe
fa40: 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20  cifically.** an 
fa50: 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20  integer rowid). 
fa60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
fa70: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
fa80: 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20   of bytes in.** 
fa90: 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  that integer..*/
faa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
fab0: 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73  IdxRowidLen(cons
fac0: 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
fad0: 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
fae0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
faf0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
fb00: 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
fb10: 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
fb20: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20  the rowid */..  
fb30: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
fb40: 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29  32(aKey, &szHdr)
fb50: 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  ;.  sqlite3GetVa
fb60: 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48  rint32(&aKey[szH
fb70: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69  dr-1], &typeRowi
fb80: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  d);.  return sql
fb90: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
fba0: 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
fbb0: 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43  ;.}.  ../*.** pC
fbc0: 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
fbd0: 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
fbe0: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
fbf0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
fc00: 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
fc10: 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
fc20: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
fc30: 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
fc40: 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
fc50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
fc60: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
fc70: 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
fc80: 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
fc90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fca0: 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43  VdbeIdxRowid(BtC
fcb0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
fcc0: 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
fcd0: 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
fce0: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
fcf0: 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
fd00: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
fd10: 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
fd20: 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
fd30: 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
fd40: 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
fd50: 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
fd60: 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
fd70: 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
fd80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
fd90: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
fda0: 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
fdb0: 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20  CellKey<=0 ){.  
fdc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fdd0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
fde0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
fdf0: 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
fe00: 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
fe10: 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
fe20: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
fe30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c  rn rc;.  }.  sql
fe40: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
fe50: 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72  (u8*)m.z, &szHdr
fe60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
fe70: 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
fe80: 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70  z[szHdr-1], &typ
fe90: 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f  eRowid);.  lenRo
fea0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
feb0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
fec0: 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  ypeRowid);.  sql
fed0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
fee0: 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
fef0: 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
ff00: 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
ff10: 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
ff20: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
ff30: 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
ff40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ff50: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
ff60: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
ff70: 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
ff80: 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
ff90: 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  t to against.** 
ffa0: 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
ffb0: 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74  n pKey (of lengt
ffc0: 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20  h nKey).  Write 
ffd0: 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
ffe0: 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
fff0: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
10000 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
10010 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
10020 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
10030 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79  reater than pKey
10040 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
10050 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
10060 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69  **.** pKey is ei
10070 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
10080 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
10090 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
100a0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
100b0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
100c0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
100d0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
100e0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
100f0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
10100 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   well..*/.int sq
10110 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
10120 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72  ompare(.  Cursor
10130 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
10140 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
10150 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
10160 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20  gainst */.  int 
10170 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nKey, const u8 *
10180 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b  pKey,   /* The k
10190 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ey to compare */
101a0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
101c0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
101d0 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
101e0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
101f0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
10200 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
10210 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
10220 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e  ursor;.  int len
10230 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  Rowid;.  Mem m;.
10240 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
10250 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
10260 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
10270 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20  CellKey<=0 ){.  
10280 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
10290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
102a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
102b0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
102c0 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
102d0 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
102e0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
102f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10300 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
10310 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
10320 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d  xRowidLen((u8*)m
10330 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71  .z);.  *res = sq
10340 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
10350 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49  ompare(pC->pKeyI
10360 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  nfo, m.n-lenRowi
10370 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b  d, m.z, nKey, pK
10380 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ey);.  sqlite3Vd
10390 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
103a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
103b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
103c0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
103d0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
103e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
103f0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
10400 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
10410 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
10420 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
10430 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
10440 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
10450 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
10460 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
10470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10480 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
10490 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
104a0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
104b0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
104c0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
104d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
104e0 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
104f0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
10500 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
10510 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
10520 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
10530 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
10540 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
10550 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
10560 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
10570 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
10580 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
10590 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
105a0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
105b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
105c0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
105d0 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
105e0 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
105f0 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
10600 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
10610 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
10620 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
10630 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
10640 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
10650 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
10660 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
10670 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
10680 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
10690 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
106a0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
106b0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
106c0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
106d0 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
106e0 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
106f0 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
10700 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
10710 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10720 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
10730 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
10740 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
10750 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
10760 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
10770 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
10780 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
10790 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
107a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
107b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
107c0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
107d0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
107e0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
107f0 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a           urn v->db;.}.