/ Hex Artifact Content
Login

Artifact 77db89679834d55ff026c6311c34d2964bf46431:


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 56 64 62 65 47 65 74 53 71 6c 28 56 64 62 65  3VdbeGetSql(Vdbe
0660: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
0670: 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->zSql;.}../*.**
0680: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0690: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
06a0: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
06b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
06c0: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
06d0: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
06e0: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
06f0: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69   char *zTmp;.  i
0700: 6e 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d  nt nTmp;.  tmp =
0710: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
0720: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
0730: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
0740: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
0750: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
0760: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
0770: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0780: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0790: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
07a0: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
07b0: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
07c0: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
07d0: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
07e0: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
07f0: 20 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c   nTmp = pA->nSql
0800: 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70  ;.  pA->nSql = p
0810: 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e  B->nSql;.  pB->n
0820: 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23  Sql = nTmp;.}..#
0830: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
0840: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
0850: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0860: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0870: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0880: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0890: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
08a0: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
08b0: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
08c0: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
08d0: 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
08e0: 73 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20  s at least N.** 
08f0: 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65  elements. If the
0900: 20 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45   Vdbe is in VDBE
0910: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65  _MAGIC_RUN state
0920: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64  , then.** the Vd
0930: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c  be.aOp array wil
0940: 6c 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f  l be sized to co
0950: 6e 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 0a  ntain exactly N.
0960: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 56 64 62  ** elements. Vdb
0970: 65 2e 6e 4f 70 41 6c 6c 6f 63 20 69 73 20 73 65  e.nOpAlloc is se
0980: 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  t to reflect the
0990: 20 6e 65 77 20 73 69 7a 65 20 6f 66 0a 2a 2a 20   new size of.** 
09a0: 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  the array..**.**
09b0: 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65   If an out-of-me
09c0: 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72  mory error occur
09d0: 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67  s while resizing
09e0: 20 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56   the array,.** V
09f0: 64 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65  dbe.aOp and Vdbe
0a00: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
0a10: 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73   unchanged (this
0a20: 20 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61   is so that.** a
0a30: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a40: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a50: 20 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65   be correctly de
0a60: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
0a70: 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ng with the rest
0a80: 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a   of the Vdbe)..*
0a90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
0aa0: 73 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65  sizeOpArray(Vdbe
0ab0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
0ac0: 6e 74 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e  nt runMode = p->
0ad0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0ae0: 43 5f 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e  C_RUN;.  if( run
0af0: 4d 6f 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c  Mode || p->nOpAl
0b00: 6c 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62  loc<N ){.    Vdb
0b10: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  eOp *pNew;.    i
0b20: 6e 74 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30  nt nNew = N + 10
0b30: 30 2a 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20  0*(!runMode);.  
0b40: 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20    int oldSize = 
0b50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20  p->nOpAlloc;.   
0b60: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
0b70: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
0b80: 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  p->aOp, nNew*siz
0b90: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66  eof(Op));.    if
0ba0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
0bb0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6e 4e  p->nOpAlloc = nN
0bc0: 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  ew;.      p->aOp
0bd0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 69   = pNew;.      i
0be0: 66 28 20 6e 4e 65 77 3e 6f 6c 64 53 69 7a 65 20  f( nNew>oldSize 
0bf0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
0c00: 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 7a  t(&p->aOp[oldSiz
0c10: 65 5d 2c 20 30 2c 20 28 6e 4e 65 77 2d 6f 6c 64  e], 0, (nNew-old
0c20: 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f 70 29  Size)*sizeof(Op)
0c30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
0c40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
0c50: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0c60: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0c70: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0c80: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0c90: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0ca0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0cb0: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0cc0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0cd0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0cf0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0d00: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0d20: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0d30: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0d40: 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20 20 20  *    p1, p2     
0d50: 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20 6f       First two o
0d60: 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73 73  f the three poss
0d70: 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a 2a  ible operands..*
0d80: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
0d90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
0da0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
0db0: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
0dc0: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
0dd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
0de0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
0df0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
0e00: 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70 65  of the P3.** ope
0e10: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
0e20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56 64  ite3VdbeAddOp(Vd
0e30: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0e40: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a  nt p1, int p2){.
0e50: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0e60: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0e70: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0e80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0e90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0ea0: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0eb0: 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  =i ){.    resize
0ec0: 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31 29 3b  OpArray(p, i+1);
0ed0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
0ee0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
0ef0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0f00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0f10: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0f20: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0f30: 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20 20  >opcode = op;.  
0f40: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
0f50: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
0f60: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 70  pOp->p3 = 0;.  p
0f70: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
0f80: 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78  NOTUSED;.  p->ex
0f90: 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  pired = 0;.#ifde
0fa0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
0fb0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62   if( sqlite3_vdb
0fc0: 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 20  e_addop_trace ) 
0fd0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
0fe0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
0ff0: 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  [i]);.#endif.  r
1000: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
1010: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1020: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1030: 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69  e p3 value..*/.i
1040: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  nt sqlite3VdbeOp
1050: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
1060: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
1070: 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  2, const char *z
1080: 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29 7b 0a  P3,int p3type){.
1090: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
10a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 2c  ite3VdbeAddOp(p,
10b0: 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20   op, p1, p2);.  
10c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10d0: 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a 50 33  eP3(p, addr, zP3
10e0: 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72 65 74  , p3type);.  ret
10f0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1100: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1110: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
1120: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
1130: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
1140: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
1150: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
1160: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
1170: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
1180: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
1190: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
11a0: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
11b0: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
11c0: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
11d0: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
11e0: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
11f0: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
1200: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
1210: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
1220: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
1230: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
1240: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
1250: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
1260: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
1270: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
1280: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
1290: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
12a0: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
12b0: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
12c0: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
12d0: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
12e0: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
12f0: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
1300: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
1310: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
1320: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
1330: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
1340: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
1350: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
1360: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
1370: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
1380: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1390: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
13a0: 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62  i;.  i = p->nLab
13b0: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
13c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
13d0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
13e0: 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41  f( i>=p->nLabelA
13f0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
1400: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e  LabelAlloc = p->
1410: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
1420: 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65  10;.    p->aLabe
1430: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1440: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1450: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
1490: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
14a0: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
14b0: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
14c0: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
14d0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
14e0: 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n -1-i;.}../*.**
14f0: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
1500: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
1510: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
1520: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
1530: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
1540: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
1550: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
1560: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
1570: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
1580: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
1590: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
15a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
15b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
15c0: 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e  *p, int x){.  in
15d0: 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73  t j = -1-x;.  as
15e0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
15f0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
1610: 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  0 && j<p->nLabel
1620: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61   );.  if( p->aLa
1630: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1640: 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70  abel[j] = p->nOp
1650: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1660: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
1670: 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69 73  f opcode 'op' is
1680: 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 20   guarenteed not 
1690: 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61 6c  to push more val
16a0: 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ues.** onto the 
16b0: 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e 20  VDBE stack than 
16c0: 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a  it pops off..*/.
16d0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f 64  static int opcod
16e0: 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a  eNoPush(u8 op){.
16f0: 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50 55    /* The 10 NOPU
1700: 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74 61  SH_MASK_n consta
1710: 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64 20  nts are defined 
1720: 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  in the automatic
1730: 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72 61  ally.  ** genera
1740: 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65 20  ted header file 
1750: 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68 20  opcodes.h. Each 
1760: 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74 6d  is a 16-bit bitm
1770: 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62 69  ask, one.  ** bi
1780: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
1790: 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  to each opcode i
17a0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
17b0: 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 6d  e virtual.  ** m
17c0: 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e 63  achine in vdbe.c
17d0: 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72 75  . The bit is tru
17e0: 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22 6e  e if the word "n
17f0: 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73 0a  o-push" appears.
1800: 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65 6e    ** in a commen
1810: 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c 69  t on the same li
1820: 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65 20  ne as the "case 
1830: 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20 2a  OP_XXX:" in .  *
1840: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  * sqlite3VdbeExe
1850: 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a 20  c() in vdbe.c.. 
1860: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
1870: 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  bit is true, the
1880: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1890: 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67 75  ing opcode is gu
18a0: 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20 2a  arenteed not.  *
18b0: 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73 74  * to grow the st
18c0: 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20 65  ack when it is e
18d0: 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77 69  xecuted. Otherwi
18e0: 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77 20  se, it may grow 
18f0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 62  the.  ** stack b
1900: 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 6e  y at most one en
1910: 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  try..  **.  ** N
1920: 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f 72  OPUSH_MASK_0 cor
1930: 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63 6f  responds to opco
1940: 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f 50  des 0 to 15. NOP
1950: 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74 61  USH_MASK_1 conta
1960: 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69 74  ins.  ** one bit
1970: 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36 20   for opcodes 16 
1980: 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f 6e  to 31, and so on
1990: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62  ..  **.  ** 16-b
19a0: 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61 74  it bitmasks (rat
19b0: 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74 29  her than 32-bit)
19c0: 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20 69   are specified i
19d0: 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20 2a  n opcodes.h .  *
19e0: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
19f0: 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  le is generated 
1a00: 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72 61  by an awk progra
1a10: 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61 74  m. Awk manipulat
1a20: 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62  es.  ** all numb
1a30: 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67 2d  ers as floating-
1a40: 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f 6e  point and we don
1a50: 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b 20  't want to risk 
1a60: 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20  a rounding.  ** 
1a70: 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e 65  error if someone
1a80: 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e 20   builds with an 
1a90: 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28 66  awk that uses (f
1aa0: 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d 62  or example) 32-b
1ab0: 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66 6c  it .  ** IEEE fl
1ac0: 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73 74  oats..  */ .  st
1ad0: 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20 6d  atic const u32 m
1ae0: 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20 20  asks[5] = {.    
1af0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b 20  NOPUSH_MASK_0 + 
1b00: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1b10: 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29 2c  SH_MASK_1)<<16),
1b20: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1b30: 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _2 + (((unsigned
1b40: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29 3c  )NOPUSH_MASK_3)<
1b50: 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48  <16),.    NOPUSH
1b60: 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e 73  _MASK_4 + (((uns
1b70: 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53  igned)NOPUSH_MAS
1b80: 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e  K_5)<<16),.    N
1b90: 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20 28  OPUSH_MASK_6 + (
1ba0: 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53  ((unsigned)NOPUS
1bb0: 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a  H_MASK_7)<<16),.
1bc0: 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f      NOPUSH_MASK_
1bd0: 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29  8 + (((unsigned)
1be0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c  NOPUSH_MASK_9)<<
1bf0: 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72  16).  };.  asser
1c00: 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20 20  t( op<32*5 );.  
1c10: 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f 70  return (masks[op
1c20: 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26 30  >>5] & (1<<(op&0
1c30: 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64  x1F)));.}..#ifnd
1c40: 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
1c50: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 4e  lite3VdbeOpcodeN
1c60: 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20  oPush(u8 op){.  
1c70: 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f 50  return opcodeNoP
1c80: 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69  ush(op);.}.#endi
1c90: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68  f../*.** Loop th
1ca0: 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61  rough the progra
1cb0: 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32  m looking for P2
1cc0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
1cd0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45 61   negative..** Ea
1ce0: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
1cf0: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
1d00: 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79 20  ve the label by 
1d10: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a 2a  setting the P2.*
1d20: 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  * value to its c
1d30: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
1d40: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
1d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1d60: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
1d70: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
1d80: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
1d90: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
1da0: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
1db0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1dc0: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
1dd0: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
1de0: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
1df0: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
1e00: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
1e10: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
1e20: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
1e30: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
1e40: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
1e50: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
1e60: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20  .** The integer 
1e70: 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73 65  *pMaxStack is se
1e80: 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  t to the maximum
1e90: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 20   number of vdbe 
1ea0: 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65 73  stack.** entries
1eb0: 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e 61   that static ana
1ec0: 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74 68  lysis reveals th
1ed0: 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68 74  is program might
1ee0: 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   need..**.** Thi
1ef0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
1f00: 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  oes the followin
1f10: 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20  g optimization: 
1f20: 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a   It scans for.**
1f30: 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f   Halt instructio
1f40: 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51 4c  ns where P1==SQL
1f50: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6f  ITE_CONSTRAINT o
1f60: 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f  r P2==OE_Abort o
1f70: 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73 65  r for.** IdxInse
1f80: 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  rt instructions 
1f90: 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49 66  where P2!=0.  If
1fa0: 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63   no such instruc
1fb0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  tion is.** found
1fc0: 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61  , then every Sta
1fd0: 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69  tement instructi
1fe0: 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  on is changed to
1ff0: 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20   a Noop.  In.** 
2000: 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f  this way, we avo
2010: 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  id creating the 
2020: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2030: 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61  l file unnecessa
2040: 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rily..*/.static 
2050: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
2060: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
2070: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2c  t *pMaxFuncArgs,
2080: 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b 29   int *pMaxStack)
2090: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
20a0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20   nMaxArgs = 0;. 
20b0: 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d   int nMaxStack =
20c0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70   p->nOp;.  Op *p
20d0: 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  Op;.  int *aLabe
20e0: 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20  l = p->aLabel;. 
20f0: 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d 65   int doesStateme
2100: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ntRollback = 0;.
2110: 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d 65    int hasStateme
2120: 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66  ntBegin = 0;.  f
2130: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
2140: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
2150: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
2160: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
2170: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
2180: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
2190: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
21a0: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a 23  e==OP_AggStep .#
21b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21c0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
21d0: 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64          || opcod
21e0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23 65  e==OP_VUpdate.#e
21f0: 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
2200: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
2210: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2220: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
2230: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64   }.    if( opcod
2240: 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20  e==OP_Halt ){.  
2250: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d      if( pOp->p1=
2260: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2270: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
2280: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
2290: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
22a0: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
22b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
22c0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  if( opcode==OP_S
22d0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
22e0: 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65    hasStatementBe
22f0: 67 69 6e 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  gin = 1;.#ifndef
2300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2310: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
2320: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
2330: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
2340: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
2350: 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74   ){.      doesSt
2360: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
2370: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
2380: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46  f( opcode==OP_VF
2390: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69  ilter ){.      i
23a0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  nt n;.      asse
23b0: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
23c0: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  = 3 );.      ass
23d0: 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e 6f 70 63  ert( pOp[-2].opc
23e0: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
23f0: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70  );.      n = pOp
2400: 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-2].p1;.      i
2410: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
2420: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65  nMaxArgs = n;.#e
2430: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 69  ndif.    }.    i
2440: 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28  f( opcodeNoPush(
2450: 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20 20  opcode) ){.     
2460: 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20 20   nMaxStack--;.  
2470: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70    }..    if( pOp
2480: 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69 6e  ->p2>=0 ) contin
2490: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
24a0: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c  -1-pOp->p2<p->nL
24b0: 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70 2d  abel );.    pOp-
24c0: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
24d0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20  pOp->p2];.  }.  
24e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
24f0: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c  aLabel);.  p->aL
2500: 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d  abel = 0;..  *pM
2510: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
2520: 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78 53 74  xArgs;.  *pMaxSt
2530: 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63 6b 3b  ack = nMaxStack;
2540: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65 76  ..  /* If we nev
2550: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74  er rollback a st
2560: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
2570: 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65 6d  ion, then statem
2580: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
2590: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65  tions are not ne
25a0: 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67 65  eded.  So change
25b0: 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65 6d   every OP_Statem
25c0: 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20  ent.  ** opcode 
25d0: 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
25e0: 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20 63    This avoid a c
25f0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2600: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 0a  OpenExclusive().
2610: 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20 62    ** which can b
2620: 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20 73  e expensive on s
2630: 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20  ome platforms.. 
2640: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74 61   */.  if( hasSta
2650: 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20 21  tementBegin && !
2660: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
2670: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  lback ){.    for
2680: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2690: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
26a0: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
26b0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
26c0: 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20  e==OP_Statement 
26d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  ){.        pOp->
26e0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
26f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2700: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2710: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
2720: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
2730: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
2740: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
2750: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2760: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
2770: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
2780: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2790: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
27a0: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
27b0: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
27c0: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
27d0: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
27e0: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
27f0: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
2800: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
2810: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
2820: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
2830: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
2840: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
2850: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
2860: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
2870: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
2880: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2890: 49 54 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70  IT );.  resizeOp
28a0: 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 20  Array(p, p->nOp 
28b0: 2b 20 6e 4f 70 29 3b 0a 20 20 69 66 28 20 70 2d  + nOp);.  if( p-
28c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
28d0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
28e0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
28f0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p->nOp;.  if( nO
2900: 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p>0 ){.    int i
2910: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
2920: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
2930: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
2940: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
2950: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
2960: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
2970: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
2980: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
2990: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
29a0: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
29b0: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
29c0: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
29d0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70      pOut->p2 = p
29e0: 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44  2<0 ? addr + ADD
29f0: 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20  R(p2) : p2;.    
2a00: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
2a10: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
2a20: 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e  ->p3type = pIn->
2a30: 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a  p3 ? P3_STATIC :
2a40: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66   P3_NOTUSED;.#if
2a50: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2a60: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a70: 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
2a80: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
2a90: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
2aa0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
2ab0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
2ac0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2ad0: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2ae0: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
2af0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2b00: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2b10: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
2b20: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2b30: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2b40: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2b50: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
2b60: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
2b70: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
2b80: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
2b90: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
2ba0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
2bb0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
2bc0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2bd0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2be0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
2bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c00: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
2c10: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2c20: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2c30: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2c40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2c50: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
2c60: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
2c70: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
2c80: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
2c90: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
2ca0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2cb0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2cc0: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
2cd0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2ce0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2cf0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2d00: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
2d10: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
2d20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2d30: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
2d40: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2d50: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2d60: 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20 61  t( val>=0 );.  a
2d70: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2d80: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2d90: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2da0: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2db0: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
2dc0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
2dd0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
2de0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2df0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
2e00: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
2e10: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
2e20: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2e30: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
2e40: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2e50: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
2e60: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
2e70: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2e80: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
2e90: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
2ea0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
2eb0: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
2ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
2ed0: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
2ee0: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
2ef0: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
2f00: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
2f10: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
2f20: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
2f30: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
2f40: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
2f50: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75 6e  eralFunction(Fun
2f60: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
2f70: 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65 66  f( pDef && (pDef
2f80: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2f90: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
2fa0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2fb0: 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  ree(pDef);.  }.}
2fc0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
2fd0: 20 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P3 value if nec
2fe0: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
2ff0: 63 20 76 6f 69 64 20 66 72 65 65 50 33 28 69 6e  c void freeP3(in
3000: 74 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20 2a  t p3type, void *
3010: 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29 7b  p3){.  if( p3 ){
3020: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 33 74  .    switch( p3t
3030: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
3040: 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P3_DYNAMIC:.  
3050: 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49      case P3_KEYI
3060: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
3070: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
3080: 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FF: {.        sq
3090: 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b 0a  lite3_free(p3);.
30a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
30c0: 65 20 50 33 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a  e P3_MPRINTF: {.
30d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
30e0: 66 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20  free(p3);.      
30f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3100: 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 56  .      case P3_V
3110: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
3120: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
3130: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
3140: 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20  nc *)p3;.       
3150: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3160: 6e 63 74 69 6f 6e 28 70 56 64 62 65 46 75 6e 63  nction(pVdbeFunc
3170: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  ->pFunc);.      
3180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
3190: 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65  eteAuxData(pVdbe
31a0: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  Func, 0);.      
31b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31c0: 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20  VdbeFunc);.     
31d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31e0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
31f0: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
3200: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
3210: 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44 65  Function((FuncDe
3220: 66 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20  f*)p3);.        
3230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3240: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45 4d       case P3_MEM
3250: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
3260: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
3270: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29  lite3_value*)p3)
3280: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32a0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   }.}.../*.** Cha
32b0: 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74  nge N opcodes st
32c0: 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74  arting at addr t
32d0: 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69  o No-ops..*/.voi
32e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
32f0: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
3300: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3310: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
3320: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64  p->aOp ){.    Vd
3330: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
3340: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 77  aOp[addr];.    w
3350: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
3360: 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70     freeP3(pOp->p
3370: 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b  3type, pOp->p3);
3380: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  .      memset(pO
3390: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
33a0: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70  [0]));.      pOp
33b0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
33c0: 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b  op;.      pOp++;
33d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
33e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
33f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3400: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3410: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3420: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3430: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
3440: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
3450: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
3460: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
3470: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
3480: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
3490: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
34a0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
34b0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
34c0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
34d0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
34e0: 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P3 operand is dy
34f0: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
3500: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
3510: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
3520: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
3530: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3540: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
3550: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
3560: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
3570: 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f  tes of zP3 up to
3580: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
3590: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
35a0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
35b0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
35c0: 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a  es of zP3..**.**
35d0: 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46   If n==P3_KEYINF
35e0: 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  O it means that 
35f0: 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72  zP3 is a pointer
3600: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
3610: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f  ructure..** A co
3620: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
3630: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
3640: 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ure into memory 
3650: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
3660: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c   sqlite3_malloc,
3670: 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65   to be freed whe
3680: 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69  n the Vdbe is fi
3690: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50  nalized..** n==P
36a0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
36b0: 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  F indicates that
36c0: 20 7a 50 33 20 70 6f 69 6e 74 73 20 74 6f 20 61   zP3 points to a
36d0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
36e0: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
36f0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20  memory that the 
3700: 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69  caller has obtai
3710: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3720: 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a  _malloc. The .**
3730: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
3740: 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f  ot free the allo
3750: 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  cation, it will 
3760: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
3770: 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e  e Vdbe is.** fin
3780: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f  alized..** .** O
3790: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
37a0: 20 28 50 33 5f 53 54 41 54 49 43 2c 20 50 33 5f   (P3_STATIC, P3_
37b0: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
37c0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 33 20  dicate that zP3 
37d0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
37e0: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
37f0: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
3800: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
3810: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
3820: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
3830: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
3840: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
3850: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
3860: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
3870: 6e 20 63 68 61 6e 67 65 20 50 33 20 6f 6e 20 74  n change P3 on t
3880: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
3890: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
38a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
38b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
38c0: 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P3(Vdbe *p, int 
38d0: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
38e0: 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP3, int n){. 
38f0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65   Op *pOp;.  asse
3900: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
3910: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
3920: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
3930: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  ==0 || p->aOp==0
3940: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
3950: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
3960: 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e  f (n != P3_KEYIN
3970: 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  FO) {.      free
3980: 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  P3(n, (void*)*(c
3990: 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20  har**)&zP3);.   
39a0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
39b0: 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20   }.  if( addr<0 
39c0: 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20  || addr>=p->nOp 
39d0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
39e0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
39f0: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
3a00: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
3a10: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3a20: 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79  freeP3(pOp->p3ty
3a30: 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  pe, pOp->p3);.  
3a40: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 69  pOp->p3 = 0;.  i
3a50: 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20  f( zP3==0 ){.   
3a60: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3a70: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3a80: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P3_NOTUSED;.  }e
3a90: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45  lse if( n==P3_KE
3aa0: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
3ab0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
3ac0: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
3ad0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
3ae0: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
3af0: 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP3)->nField;.  
3b00: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
3b10: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
3b20: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
3b30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3b40: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
3b50: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
3b60: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
3b70: 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  te );.    pOp->p
3b80: 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79 49  3 = (char*)pKeyI
3b90: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
3ba0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
3bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 53  nsigned char *aS
3bc0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
3bd0: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c  memcpy(pKeyInfo,
3be0: 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20   zP3, nByte);.  
3bf0: 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d      aSortOrder =
3c00: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
3c10: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Order;.      if(
3c20: 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20   aSortOrder ){. 
3c30: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
3c40: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
3c50: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70  nsigned char*)&p
3c60: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
3c70: 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20  Field];.        
3c80: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d  memcpy(pKeyInfo-
3c90: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f  >aSortOrder, aSo
3ca0: 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29  rtOrder, nField)
3cb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3cc0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
3cd0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65  _KEYINFO;.    }e
3ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  lse{.      p->db
3cf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
3d00: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   1;.      pOp->p
3d10: 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53  3type = P3_NOTUS
3d20: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
3d30: 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49  e if( n==P3_KEYI
3d40: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20  NFO_HANDOFF ){. 
3d50: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68     pOp->p3 = (ch
3d60: 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70  ar*)zP3;.    pOp
3d70: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45  ->p3type = P3_KE
3d80: 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69  YINFO;.  }else i
3d90: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
3da0: 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a  p->p3 = (char*)z
3db0: 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74  P3;.    pOp->p3t
3dc0: 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65  ype = n;.  }else
3dd0: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
3de0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29   n = strlen(zP3)
3df0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  ;.    pOp->p3 = 
3e00: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
3e10: 28 70 2d 3e 64 62 2c 20 7a 50 33 2c 20 6e 29 3b  (p->db, zP3, n);
3e20: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
3e30: 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P3_DYNAMIC;. 
3e40: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
3e50: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  EBUG./*.** Repla
3e60: 63 65 20 74 68 65 20 50 33 20 66 69 65 6c 64 20  ce the P3 field 
3e70: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
3e80: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
3e90: 75 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 63  uction with.** c
3ea0: 6f 6d 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a  omment text..*/.
3eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3ec0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
3ed0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3ee0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
3ef0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65  _list ap;.  asse
3f00: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
3f10: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
3f20: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
3f30: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
3f40: 70 2d 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 70 2d  p-1].p3==0 || p-
3f50: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3f60: 64 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  d );.  va_start(
3f70: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
3f80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3f90: 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69 74  eP3(p, -1, sqlit
3fa0: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
3fb0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20  , zFormat, ap), 
3fc0: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76  P3_DYNAMIC);.  v
3fd0: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e  a_end(ap);.}.#en
3fe0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
3ff0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
4000: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
4010: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
4020: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
4030: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
4040: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
4050: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4060: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
4070: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
4080: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
4090: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
40a0: 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ed );.  return (
40b0: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
40c0: 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f  <p->nOp)?(&p->aO
40d0: 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a  p[addr]):0);.}..
40e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
40f0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
4100: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
4110: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
4120: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
4130: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
4140: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
4150: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
4160: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
4170: 69 62 65 73 20 74 68 65 20 50 33 20 70 61 72 61  ibes the P3 para
4180: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
4190: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
41a0: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
41b0: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
41c0: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
41d0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
41e0: 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP3(Op *pOp, ch
41f0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
4200: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
4210: 50 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  P3;.  assert( nT
4220: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69  emp>=20 );.  swi
4230: 74 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70 65  tch( pOp->p3type
4240: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33 5f   ){.    case P3_
4250: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
4260: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
4270: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
4280: 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 70  fo = (KeyInfo*)p
4290: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71  Op->p3;.      sq
42a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
42b0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65  Temp, zTemp, "ke
42c0: 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49  yinfo(%d", pKeyI
42d0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20  nfo->nField);.  
42e0: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
42f0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
4300: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
4310: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
4320: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
4330: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
4340: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
4350: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29       if( pColl )
4360: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
4370: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c  n = strlen(pColl
4380: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4390: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d      if( i+n>nTem
43a0: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
43b0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
43c0: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
43d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
43e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
43f0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4400: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
4410: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
4420: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
4430: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
4440: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
4450: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
4460: 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20  ] = '-';.       
4470: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
4480: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
4490: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b   pColl->zName,n+
44a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  1);.          i 
44b0: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  += n;.        }e
44c0: 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d  lse if( i+4<nTem
44d0: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
44e0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
44f0: 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20  ],",nil",4);.   
4500: 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
4510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4520: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b  .      zTemp[i++
4530: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a  ] = ')';.      z
4540: 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Temp[i] = 0;.   
4550: 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65     assert( i<nTe
4560: 6d 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20  mp );.      zP3 
4570: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62  = zTemp;.      b
4580: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4590: 63 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a  case P3_COLLSEQ:
45a0: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
45b0: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
45c0: 65 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  eq*)pOp->p3;.   
45d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
45e0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
45f0: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
4600: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
4610: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
4620: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4630: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4640: 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P3_FUNCDEF: {.
4650: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
4660: 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  Def = (FuncDef*)
4670: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
4680: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4690: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
46a0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
46b0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
46c0: 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  ;.      zP3 = zT
46d0: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
46e0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
46f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4700: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
4710: 65 20 50 33 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P3_VTAB: {.   
4720: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
4730: 2a 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  *pVtab = (sqlite
4740: 33 5f 76 74 61 62 2a 29 70 4f 70 2d 3e 70 33 3b  3_vtab*)pOp->p3;
4750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4760: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4770: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
4780: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
4790: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
47a0: 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP3 = zTemp;. 
47b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
47c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
47d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
47e0: 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  3 = pOp->p3;.   
47f0: 20 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c     if( zP3==0 ||
4800: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
4810: 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  _Noop ){.       
4820: 20 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20 20   zP3 = "";.     
4830: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
4840: 73 73 65 72 74 28 20 7a 50 33 21 3d 30 20 29 3b  ssert( zP3!=0 );
4850: 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b 0a 7d  .  return zP3;.}
4860: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
4870: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
4880: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
4890: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
48a0: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
48b0: 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  **.*/.void sqlit
48c0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
48d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 2c 20  Vdbe *p, int i, 
48e0: 42 74 72 65 65 20 2a 70 42 74 72 65 65 29 7b 0a  Btree *pBtree){.
48f0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
4900: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29  & i<p->db->nDb )
4910: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73 69  ;.  assert( i<si
4920: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
4930: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
4940: 28 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  ( p->db->aDb[i].
4950: 70 42 74 3d 3d 70 42 74 72 65 65 20 29 3b 0a 20  pBt==pBtree );. 
4960: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d   p->btreeMask |=
4970: 20 31 3c 3c 69 3b 0a 20 20 73 71 6c 69 74 65 33   1<<i;.  sqlite3
4980: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 49  BtreeMutexArrayI
4990: 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78  nsert(&p->aMutex
49a0: 2c 20 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 0a 23  , pBtree);.}...#
49b0: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
49c0: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
49d0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
49e0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
49f0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
4a00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4a10: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
4a20: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
4a30: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
4a40: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
4a50: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
4a60: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20  {.  char *zP3;. 
4a70: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
4a80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
4a90: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
4aa0: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
4ab0: 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  4d %s\n";.  if( 
4ac0: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
4ad0: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d   stdout;.  zP3 =
4ae0: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
4af0: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
4b00: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
4b10: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20  Out, zFormat1,. 
4b20: 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33       pc, sqlite3
4b30: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
4b40: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
4b50: 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b  , pOp->p2, zP3);
4b60: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
4b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4b80: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
4b90: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
4ba0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
4bb0: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
4bc0: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
4bd0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
4be0: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29    while( N-->0 )
4bf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4c00: 4e 3c 32 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  N<2 || p[0].db==
4c10: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
4c20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
4c30: 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20  elease(p++);.   
4c40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
4c50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
4c60: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
4c70: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
4c80: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
4c90: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
4ca0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
4cb0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
4cc0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
4cd0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
4ce0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
4cf0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
4d00: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
4d10: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
4d20: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
4d30: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
4d40: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
4d50: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
4d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
4d70: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  beList(.  Vdbe *
4d80: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
4d90: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
4da0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4db0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
4dc0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
4dd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
4de0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
4df0: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  n );.  if( p->ma
4e00: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
4e10: 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  RUN ) return SQL
4e20: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73  ITE_MISUSE;.  as
4e30: 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d  sert( db->magic=
4e40: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55  =SQLITE_MAGIC_BU
4e50: 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SY );.  assert( 
4e60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
4e70: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
4e80: 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20  E_BUSY );..  /* 
4e90: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
4ea0: 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74   opcode does not
4eb0: 20 70 75 74 20 64 79 6e 61 6d 69 63 20 73 74 72   put dynamic str
4ec0: 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20  ings onto the.  
4ed0: 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68  ** the stack, th
4ee0: 65 79 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ey may become dy
4ef0: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
4f00: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
4f10: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
4f20: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
4f30: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
4f40: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
4f50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54    */.  if( p->pT
4f60: 6f 73 3d 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34  os==&p->aStack[4
4f70: 5d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ] ){.    release
4f80: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61  MemArray(p->aSta
4f90: 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d  ck, 5);.  }.  p-
4fa0: 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b  >resOnStack = 0;
4fb0: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20  ..  do{.    i = 
4fc0: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c  p->pc++;.  }whil
4fd0: 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70  e( i<p->nOp && p
4fe0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
4ff0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
5000: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
5010: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20    if( i>=p->nOp 
5020: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
5030: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
5040: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
5050: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
5060: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
5070: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
5080: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
5090: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
50a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
50b0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
50c0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  ->zErrMsg, sqlit
50d0: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c  e3ErrStr(p->rc),
50e0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65   (char*)0);.  }e
50f0: 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  lse{.    Op *pOp
5100: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
5110: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
5120: 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d  ->aStack;.    pM
5130: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5140: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  Int;.    pMem->t
5150: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5160: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  EGER;.    pMem->
5170: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
51a0: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
51b0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
51c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
51d0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
51e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d  MEM_Term;.    pM
51f0: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
5200: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
5210: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20  (pOp->opcode);  
5220: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
5230: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
5240: 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  !=0 );.    pMem-
5250: 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d  >n = strlen(pMem
5260: 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ->z);.    pMem->
5270: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
5280: 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  XT;.    pMem->en
5290: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
52a0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
52b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
52c0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
52d0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
52e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
5300: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
5310: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5320: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
5330: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
5340: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
5350: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
5360: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5380: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
5390: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
53a0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
53b0: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
53c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68 65  flags = MEM_Ephe
53d0: 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  m|MEM_Str|MEM_Te
53e0: 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20  rm;   /* P3 */. 
53f0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73     pMem->z = dis
5400: 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d  playP3(pOp, pMem
5410: 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66  ->zShort, sizeof
5420: 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b  (pMem->zShort));
5430: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
5440: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70  m->z!=0 );.    p
5450: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5460: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d  pMem->z);.    pM
5470: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5480: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
5490: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
54a0: 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65  TF8;..    p->nRe
54b0: 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32 2a  sColumn = 5 - 2*
54c0: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
54d0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d      p->pTos = pM
54e0: 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  em;.    p->rc = 
54f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
5500: 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 31  ->resOnStack = 1
5510: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
5520: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
5530: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
5540: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5550: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
5560: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5570: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
5580: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
5590: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
55a0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
55b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
55c0: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
55d0: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
55e0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
55f0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
5600: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
5610: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70  Op = &p->aOp[nOp
5620: 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  -1];.  if( pOp->
5630: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20  opcode==OP_Noop 
5640: 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b  && pOp->p3!=0 ){
5650: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5660: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  *z = pOp->p3;.  
5670: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
5680: 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b  (*(u8*)z) ) z++;
5690: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
56a0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
56b0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
56c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
56d0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
56e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
56f0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
5700: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
5710: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
5720: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
5730: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
5740: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
5750: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5760: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
5770: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
5780: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74  if( sqlite3_io_t
5790: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
57a0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
57b0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
57c0: 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a  &p->aOp[nOp-1];.
57d0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
57e0: 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f  e==OP_Noop && pO
57f0: 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20  p->p3!=0 ){.    
5800: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
5810: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
5820: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
5830: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
5840: 25 73 22 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  %s", pOp->p3);. 
5850: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70     for(i=0; issp
5860: 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ace((unsigned ch
5870: 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ar)z[i]); i++){}
5880: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
5890: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
58a0: 69 66 28 20 69 73 73 70 61 63 65 28 28 75 6e 73  if( isspace((uns
58b0: 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29  igned char)z[i])
58c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
58d0: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
58e0: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
58f0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
5900: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5910: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
5920: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
5930: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
5940: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  .    sqlite3_io_
5950: 74 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  trace("SQL %s\n"
5960: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
5970: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
5980: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
5990: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
59a0: 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  E */.../*.** Pre
59b0: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
59c0: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
59d0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f  tion.  This invo
59e0: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
59f0: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
5a00: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
5a10: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
5a20: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
5a30: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
5a40: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
5a50: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
5a60: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
5a70: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
5a80: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
5a90: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
5aa0: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
5ab0: 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44  way to move a VD
5ac0: 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  BE from VDBE_MAG
5ad0: 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44  IC_INIT to.** VD
5ae0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f  BE_MAGIC_RUN..*/
5af0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5b00: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
5b10: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b30: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  The VDBE */.  in
5b40: 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20  t nVar,         
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b60: 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65  Number of '?' se
5b70: 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61  e in the SQL sta
5b80: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
5b90: 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20  nMem,           
5ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5bb0: 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63  mber of memory c
5bc0: 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ells to allocate
5bd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
5be0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
5bf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5c00: 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  f cursors to all
5c10: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  ocate */.  int i
5c20: 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20  sExplain        
5c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
5c40: 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e  e if the EXPLAIN
5c50: 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65   keywords is pre
5c60: 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sent */.){.  int
5c70: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
5c80: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73  b = p->db;..  as
5c90: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
5ca0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
5cb0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
5cc0: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
5cd0: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
5ce0: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
5cf0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
5d00: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
5d10: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
5d20: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
5d30: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
5d40: 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a  han later. This.
5d50: 20 20 20 2a 20 69 73 20 62 65 63 61 75 73 65 20     * is because 
5d60: 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69  the call to resi
5d70: 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f  zeOpArray() belo
5d80: 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65  w may shrink the
5d90: 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61  .   * p->aOp[] a
5da0: 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d  rray to save mem
5db0: 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68  ory if called wh
5dc0: 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43  en in VDBE_MAGIC
5dd0: 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65  _RUN .   * state
5de0: 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ..   */.  p->mag
5df0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
5e00: 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e  RUN;..  /* No in
5e10: 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70  struction ever p
5e20: 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  ushes more than 
5e30: 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74  a single element
5e40: 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73   onto the.  ** s
5e50: 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73  tack.  And the s
5e60: 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73  tack never grows
5e70: 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20 65   on successive e
5e80: 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65  xecutions of the
5e90: 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e  .  ** same loop.
5ea0: 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e    So the total n
5eb0: 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63  umber of instruc
5ec0: 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65  tions is an uppe
5ed0: 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20  r bound.  ** on 
5ee0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63  the maximum stac
5ef0: 6b 20 64 65 70 74 68 20 72 65 71 75 69 72 65 64  k depth required
5f00: 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65 72 3a  .  (Added later:
5f10: 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 73 6f  )  The.  ** reso
5f20: 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20 63 61  lveP2Values() ca
5f30: 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20 74 69  ll computes a ti
5f40: 67 68 74 65 72 20 75 70 70 65 72 20 62 6f 75 6e  ghter upper boun
5f50: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73 74  d on the.  ** st
5f60: 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20  ack size..  **. 
5f70: 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61   ** Allocation a
5f80: 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61  ll the stack spa
5f90: 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20  ce we will ever 
5fa0: 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  need..  */.  if(
5fb0: 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b   p->aStack==0 ){
5fc0: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  .    int nArg;  
5fd0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
5fe0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70  number of args p
5ff0: 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20  assed to a user 
6000: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
6010: 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20   int nStack;    
6020: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
6030: 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72  er of stack entr
6040: 69 65 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ies required */.
6050: 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c      resolveP2Val
6060: 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20 26 6e  ues(p, &nArg, &n
6070: 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65 73 69  Stack);.    resi
6080: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
6090: 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nOp);.    assert
60a0: 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20  ( nVar>=0 );.   
60b0: 20 61 73 73 65 72 74 28 20 6e 53 74 61 63 6b 3c   assert( nStack<
60c0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66  p->nOp );.    if
60d0: 28 20 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ( isExplain ){. 
60e0: 20 20 20 20 20 6e 53 74 61 63 6b 20 3d 20 31 30       nStack = 10
60f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
6100: 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 44  Stack = sqlite3D
6110: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a  bMallocZero(db,.
6120: 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b 2a 73          nStack*s
6130: 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b  izeof(p->aStack[
6140: 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61 63 6b  0])    /* aStack
6150: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67   */.      + nArg
6160: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20  *sizeof(Mem*)   
6170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
6180: 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Arg */.      + n
6190: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20  Var*sizeof(Mem) 
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
61b0: 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b   aVar */.      +
61c0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
61d0: 72 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r*)             
61e0: 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20  /* azVar */.    
61f0: 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28    + nMem*sizeof(
6200: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6210: 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20     /* aMem */.  
6220: 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69      + nCursor*si
6230: 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20 20 20  zeof(Cursor*)   
6240: 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f       /* apCsr */
6250: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
6260: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
6270: 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  d ){.      p->aM
6280: 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  em = &p->aStack[
6290: 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20 70  nStack];.      p
62a0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ->nMem = nMem;. 
62b0: 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26       p->aVar = &
62c0: 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20  p->aMem[nMem];. 
62d0: 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e       p->nVar = n
62e0: 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b  Var;.      p->ok
62f0: 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Var = 0;.      p
6300: 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a  ->apArg = (Mem**
6310: 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b  )&p->aVar[nVar];
6320: 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  .      p->azVar 
6330: 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70  = (char**)&p->ap
6340: 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20  Arg[nArg];.     
6350: 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75 72   p->apCsr = (Cur
6360: 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b  sor**)&p->azVar[
6370: 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nVar];.      p->
6380: 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
6390: 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30  r;.      for(n=0
63a0: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
63b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
63c0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
63d0: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ull;.        p->
63e0: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
63f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
6400: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 53 74 61 63 6b  or(n=0; n<nStack
6410: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
6420: 70 2d 3e 61 53 74 61 63 6b 5b 6e 5d 2e 64 62 20  p->aStack[n].db 
6430: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = db;.      }.  
6440: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d    }.  }.  for(n=
6450: 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  0; n<p->nMem; n+
6460: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  +){.    p->aMem[
6470: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
6480: 75 6c 6c 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  ull;.    p->aMem
6490: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 7d  [n].db = db;.  }
64a0: 0a 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70  ..  p->pTos = &p
64b0: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20  ->aStack[-1];.  
64c0: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
64d0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
64e0: 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20  .  p->uniqueCnt 
64f0: 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e  = 0;.  p->return
6500: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
6510: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
6520: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70  _Abort;.  p->pop
6530: 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d  Stack =  0;.  p-
6540: 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78  >explain |= isEx
6550: 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69  plain;.  p->magi
6560: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
6570: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
6580: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
6590: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
65a0: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
65b0: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70 65   = 255;.  p->ope
65c0: 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  nedStatement = 0
65d0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
65e0: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e  OFILE.  {.    in
65f0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
6600: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
6610: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  {.      p->aOp[i
6620: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ].cnt = 0;.     
6630: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
6640: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
6650: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6660: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
6670: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
6680: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
6690: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 68  es that cursor h
66a0: 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c  appens.** to hol
66b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
66c0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
66d0: 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73 6f 72  (Vdbe *p, Cursor
66e0: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
66f0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
6700: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
6710: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
6720: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
6730: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
6740: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  Cursor);.  }.  i
6750: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
6760: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
6770: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
6780: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
6790: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
67a0: 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e  ABLE.  if( pCx->
67b0: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
67c0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
67d0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
67e0: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
67f0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
6800: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
6810: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d   *pModule = pCx-
6820: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d  >pModule;.    p-
6830: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
6840: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61  1;.    sqlite3Sa
6850: 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a  fetyOff(p->db);.
6860: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
6870: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29  ose(pVtabCursor)
6880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66  ;.    sqlite3Saf
6890: 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20  etyOn(p->db);.  
68a0: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
68b0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
68c0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
68d0: 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pCx->pData);.  
68e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78  sqlite3_free(pCx
68f0: 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69  ->aType);.  sqli
6900: 74 65 33 5f 66 72 65 65 28 70 43 78 29 3b 0a 7d  te3_free(pCx);.}
6910: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
6920: 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74  l cursors except
6930: 20 66 6f 72 20 56 54 61 62 20 63 75 72 73 6f 72   for VTab cursor
6940: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
6950: 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a  ntly.** in use..
6960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
6970: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
6980: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
6990: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
69a0: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  i;.  if( p->apCs
69b0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
69c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
69d0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
69e0: 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70    Cursor *pC = p
69f0: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
6a00: 69 66 28 20 70 43 20 26 26 20 28 21 70 2d 3e 69  if( pC && (!p->i
6a10: 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21  nVtabMethod || !
6a20: 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29  pC->pVtabCursor)
6a30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6a40: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
6a50: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d  p, pC);.      p-
6a60: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
6a70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6a80: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
6a90: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
6aa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
6ab0: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
6ac0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
6ad0: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
6ae0: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
6af0: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
6b00: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
6b10: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
6b20: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
6b30: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
6b40: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
6b50: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
6b60: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  p(Vdbe *p){.  in
6b70: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53  t i;.  if( p->aS
6b80: 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65  tack ){.    rele
6b90: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
6ba0: 53 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70  Stack, 1 + (p->p
6bb0: 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29  Tos - p->aStack)
6bc0: 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d  );.    p->pTos =
6bd0: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b   &p->aStack[-1];
6be0: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  .  }.  closeAllC
6bf0: 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69  ursorsExceptActi
6c00: 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 72 65  veVtabs(p);.  re
6c10: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
6c20: 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  >aMem, p->nMem);
6c30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  .  sqlite3VdbeFi
6c40: 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66  foClear(&p->sFif
6c50: 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e  o);.  if( p->con
6c60: 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20  textStack ){.   
6c70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63   for(i=0; i<p->c
6c80: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20  ontextStackTop; 
6c90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
6ca0: 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72  te3VdbeFifoClear
6cb0: 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  (&p->contextStac
6cc0: 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20  k[i].sFifo);.   
6cd0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
6ce0: 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ree(p->contextSt
6cf0: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ack);.  }.  p->c
6d00: 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b  ontextStack = 0;
6d10: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
6d20: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  ckDepth = 0;.  p
6d30: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
6d40: 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  p = 0;.  sqlite3
6d50: 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67  _free(p->zErrMsg
6d60: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
6d70: 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 73 4f 6e 53  = 0;.  p->resOnS
6d80: 74 61 63 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tack = 0;.}../*.
6d90: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
6da0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
6db0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
6dc0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
6dd0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
6de0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
6df0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
6e00: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
6e10: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
6e20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
6e30: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
6e40: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
6e50: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
6e60: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
6e70: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
6e80: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
6e90: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
6ea0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
6eb0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
6ec0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
6ed0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
6ee0: 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65  nt n;..  release
6ef0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
6f00: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
6f10: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
6f20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6f30: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
6f40: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
6f50: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
6f60: 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43  esColumn = nResC
6f70: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
6f80: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
6f90: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
6fa0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64  bMallocZero(p->d
6fb0: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
6fc0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
6fd0: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
6fe0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
6ff0: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
7000: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
7010: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
7020: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
7030: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
7040: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
7050: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
7060: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
7070: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
7080: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
7090: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
70a0: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
70b0: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
70c0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
70d0: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
70e0: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
70f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7100: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
7110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33  ..**.** If N==P3
7120: 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e  _STATIC  it mean
7130: 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20  s that zName is 
7140: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63  a pointer to a c
7150: 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a  onstant static.*
7160: 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20  * string and we 
7170: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
7180: 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74  e pointer. If it
7190: 20 69 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20   is P3_DYNAMIC, 
71a0: 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72  then .** the str
71b0: 69 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69  ing is freed usi
71c0: 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
71d0: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
71e0: 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  is finished with
71f0: 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73  .** it. Otherwis
7200: 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e  e, N bytes of zN
7210: 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a  ame are copied..
7220: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
7230: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62  beSetColName(Vdb
7240: 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69  e *p, int idx, i
7250: 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68  nt var, const ch
7260: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
7270: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
7280: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
7290: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
72a0: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
72b0: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
72c0: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
72d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
72e0: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
72f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72  E_NOMEM;.  asser
7300: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
7310: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
7320: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
7330: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
7340: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e  olumn]);.  if( N
7350: 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20  ==P3_DYNAMIC || 
7360: 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a  N==P3_STATIC ){.
7370: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7380: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
7390: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
73a0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
73b0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
73c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
73d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
73e0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
73f0: 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54   zName, N, SQLIT
7400: 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52  E_UTF8,SQLITE_TR
7410: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
7420: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7430: 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d  K && N==P3_DYNAM
7440: 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61  IC ){.    pColNa
7450: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f  me->flags = (pCo
7460: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d  lName->flags&(~M
7470: 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f  EM_Static))|MEM_
7480: 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  Dyn;.    pColNam
7490: 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d  e->xDel = 0;.  }
74a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
74b0: 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72  ./*.** A read or
74c0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
74d0: 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  on may or may no
74e0: 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64  t be active on d
74f0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
7500: 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73  * db. If a trans
7510: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
7520: 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20  , commit it. If 
7530: 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72  there is a.** wr
7540: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
7550: 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68  spanning more th
7560: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
7570: 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69  file, this routi
7580: 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65  ne.** takes care
7590: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
75a0: 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e  ournal trickery.
75b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
75c0: 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  dbeCommit(sqlite
75d0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
75e0: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
75f0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
7600: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
7610: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
7620: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
7630: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7640: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
7650: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  commit = 0;..  /
7660: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
7670: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
7680: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
7690: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
76a0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
76b0: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
76c0: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
76d0: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
76e0: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
76f0: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
7700: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
7710: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
7720: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
7730: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
7740: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
7750: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
7760: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
7770: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7780: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
7790: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
77a0: 2c 20 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21  , rc);.  if( rc!
77b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
77c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
77d0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
77e0: 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
77f0: 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
7800: 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
7810: 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
7820: 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
7830: 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
7840: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
7850: 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
7860: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
7870: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
7880: 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
7890: 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
78a0: 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
78b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
78c0: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
78d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
78e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
78f0: 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
7900: 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
7910: 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
7920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
7930: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
7940: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
7950: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
7960: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
7970: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
7980: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
7990: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
79a0: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
79b0: 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  s++;.    }.  }..
79c0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
79d0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
79e0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
79f0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
7a00: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
7a10: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
7a20: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
7a30: 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ack ){.    sqlit
7a40: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
7a50: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
7a60: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
7a70: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
7a80: 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79     sqlite3Safety
7a90: 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  On(db);.    if( 
7aa0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
7ab0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
7ac0: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  AINT;.    }.  }.
7ad0: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
7ae0: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
7af0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
7b00: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
7b10: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
7b20: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
7b30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
7b40: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
7b50: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
7b60: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
7b70: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
7b80: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
7b90: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
7ba0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
7bb0: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
7bc0: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
7bd0: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
7be0: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
7bf0: 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74  emory:.  In that
7c00: 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a   case we do.  **
7c10: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
7c20: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
7c30: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
7c40: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  he simple case t
7c50: 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20  hen.  ** too..  
7c60: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c  */.  if( 0==strl
7c70: 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  en(sqlite3BtreeG
7c80: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
7c90: 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e  Db[0].pBt)) || n
7ca0: 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20  Trans<=1 ){.    
7cb0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
7cc0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
7cd0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
7ce0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7cf0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7d00: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
7d10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
7d20: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
7d30: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
7d40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
7d50: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
7d60: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
7d70: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
7d80: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
7d90: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
7da0: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
7db0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
7dc0: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
7dd0: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
7de0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
7df0: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
7e00: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
7e10: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
7e20: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
7e30: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
7e40: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
7e50: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
7e60: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
7e70: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
7e80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7e90: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
7ea0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
7eb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
7ec0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
7ed0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
7ee0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
7ef0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
7f00: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
7f10: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
7f20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7f30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
7f50: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
7f60: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
7f70: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
7f80: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
7f90: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
7fa0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
7fb0: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
7fc0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
7fd0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
7fe0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
7ff0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
8000: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
8010: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8020: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
8030: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
8040: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
8050: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
8060: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
8070: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
8080: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
8090: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
80a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
80b0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
80c0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
80d0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
80e0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
80f0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
8100: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
8110: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
8120: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  t = 0;..    /* S
8130: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
8140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8150: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
8160: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20     u32 random;. 
8170: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8180: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8190: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
81a0: 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ess(sizeof(rando
81b0: 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20  m), &random);.  
81c0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
81d0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
81e0: 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d   "%s-mj%08X", zM
81f0: 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26  ainFile, random&
8200: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0x7fffffff);.   
8210: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
8220: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8230: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
8250: 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63  le( sqlite3OsAcc
8260: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
8270: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
8280: 5f 45 58 49 53 54 53 29 20 29 3b 0a 0a 20 20 20  _EXISTS) );..   
8290: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
82a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
82b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
82c0: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
82d0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
82e0: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 53  ster, .        S
82f0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
8300: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
8310: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
8320: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
8330: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
8340: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
8350: 4c 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20  L, 0.    );.    
8360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8370: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
8380: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
8390: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
83a0: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
83b0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
83c0: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
83d0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
83e0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
83f0: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
8400: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8410: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
8420: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
8430: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
8440: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
8450: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8460: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
8470: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
8480: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
8490: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
84a0: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
84b0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
84c0: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
84d0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
84e0: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
84f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
8500: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
8510: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
8520: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
8530: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
8540: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
8550: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
8560: 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  ;   /* Ignore th
8570: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
8580: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
8590: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
85a0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
85b0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
85c0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
85d0: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
85e0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
85f0: 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20  if( zFile[0]==0 
8600: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
8610: 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20  Ignore :memory: 
8620: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
8630: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
8640: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
8650: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
8660: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
8670: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
8680: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8690: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
86a0: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
86b0: 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69  File, strlen(zFi
86c0: 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
86d0: 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
86e0: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  = strlen(zFile)+
86f0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
8700: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8710: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8720: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
8730: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
8740: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
8750: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8760: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
8770: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
8780: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
8790: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
87a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
87b0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
87c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
87d0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
87e0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
87f0: 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
8800: 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
8810: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
8820: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e      */.    zMain
8830: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
8840: 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62  reeGetDirname(db
8850: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
8860: 20 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63     if( (needSync
8870: 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73   .     && (0==(s
8880: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
8890: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
88a0: 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
88b0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29  CAP_SEQUENTIAL))
88c0: 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c  .     && (rc=sql
88d0: 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
88e0: 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
88f0: 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45  NORMAL))!=SQLITE
8900: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71  _OK) ){.      sq
8910: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
8920: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
8930: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
8940: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8950: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8960: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8970: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8980: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8990: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
89a0: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
89b0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
89c0: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
89d0: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
89e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
89f0: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
8a00: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
8a10: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
8a20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
8a30: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
8a40: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8a50: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
8a60: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
8a70: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
8a80: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
8a90: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
8aa0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
8ab0: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
8ac0: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
8ad0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
8ae0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
8af0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
8b00: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
8b10: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
8b20: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
8b30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8b40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
8b50: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
8b60: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
8b70: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
8b80: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
8b90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8ba0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
8bb0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
8bc0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
8bd0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
8be0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
8bf0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
8c00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8c10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
8c20: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
8c30: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
8c40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
8c50: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
8c60: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8c70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8c80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8c90: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
8ca0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8cb0: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
8cc0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8cd0: 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
8ce0: 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
8cf0: 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
8d00: 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
8d10: 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
8d20: 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
8d30: 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
8d40: 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
8d50: 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
8d60: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
8d70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8d80: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
8d90: 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
8da0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
8db0: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
8dc0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
8dd0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
8de0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
8df0: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
8e00: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
8e10: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
8e20: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
8e30: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
8e40: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
8e50: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8e60: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
8e70: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
8e80: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
8e90: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
8ea0: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
8eb0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8ec0: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
8ed0: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
8ee0: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
8ef0: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
8f00: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
8f10: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
8f20: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
8f30: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
8f40: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
8f50: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
8f60: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
8f70: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
8f80: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
8f90: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
8fa0: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
8fb0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
8fc0: 72 73 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rs();.    for(i=
8fd0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
8fe0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
8ff0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
9000: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
9010: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
9020: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
9030: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
9040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9050: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
9060: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
9070: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
9080: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
9090: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
90a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
90b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
90c0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
90d0: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
90e0: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
90f0: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
9100: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
9110: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
9120: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
9130: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
9140: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
9150: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
9160: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
9170: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
9180: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
9190: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
91a0: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
91b0: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
91c0: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
91d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
91e0: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
91f0: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
9200: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9210: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
9220: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
9230: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
9240: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
9250: 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  t = 0;.  p = db-
9260: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
9270: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
9280: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
9290: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
92a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
92b0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
92c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
92d0: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
92e0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
92f0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
9300: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
9310: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
9320: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65 76 65 72  ./*.** Find ever
9330: 79 20 61 63 74 69 76 65 20 56 4d 20 6f 74 68 65  y active VM othe
9340: 72 20 74 68 61 6e 20 70 56 64 62 65 20 61 6e 64  r than pVdbe and
9350: 20 63 68 61 6e 67 65 20 69 74 73 20 73 74 61 74   change its stat
9360: 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72 74 65 64  us to.** aborted
9370: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
9380: 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63 61 75 73  when one VM caus
9390: 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 64 75  es a rollback du
93a0: 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f  e to an.** ON CO
93b0: 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 20  NFLICT ROLLBACK 
93c0: 63 6c 61 75 73 65 20 28 66 6f 72 20 65 78 61 6d  clause (for exam
93d0: 70 6c 65 29 2e 20 20 54 68 65 20 6f 74 68 65 72  ple).  The other
93e0: 20 56 4d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20   VMs must be.** 
93f0: 61 62 6f 72 74 65 64 20 73 6f 20 74 68 61 74 20  aborted so that 
9400: 74 68 65 79 20 64 6f 20 6e 6f 74 20 68 61 76 65  they do not have
9410: 20 64 61 74 61 20 72 6f 6c 6c 65 64 20 6f 75 74   data rolled out
9420: 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65 61 74 68   from underneath
9430: 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64 69 6e 67  .** them leading
9440: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 2e 0a   to a segfault..
9450: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9460: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
9470: 64 62 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  dbes(sqlite3 *db
9480: 2c 20 56 64 62 65 20 2a 70 45 78 63 65 70 74 29  , Vdbe *pExcept)
9490: 7b 0a 20 20 56 64 62 65 20 2a 70 4f 74 68 65 72  {.  Vdbe *pOther
94a0: 3b 0a 20 20 66 6f 72 28 70 4f 74 68 65 72 3d 64  ;.  for(pOther=d
94b0: 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72  b->pVdbe; pOther
94c0: 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d  ; pOther=pOther-
94d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
94e0: 20 70 4f 74 68 65 72 3d 3d 70 45 78 63 65 70 74   pOther==pExcept
94f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9500: 20 69 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67   if( pOther->mag
9510: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
9520: 55 4e 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63  UN || pOther->pc
9530: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
9540: 20 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64     checkActiveVd
9550: 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 20 20 63  beCnt(db);.    c
9560: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
9570: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
9580: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 63 68 65  pOther);.    che
9590: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
95a0: 64 62 29 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d  db);.    pOther-
95b0: 3e 61 62 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  >aborted = 1;.  
95c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
95d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
95e0: 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
95f0: 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
9600: 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
9610: 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
9620: 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
9630: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
9640: 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
9650: 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
9660: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
9670: 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
9680: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
9690: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
96a0: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
96b0: 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
96c0: 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
96d0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
96e0: 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
96f0: 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
9700: 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
9710: 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
9720: 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
9730: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
9740: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
9750: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
9760: 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
9770: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
9780: 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
9790: 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
97a0: 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
97b0: 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
97c0: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
97d0: 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
97e0: 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
97f0: 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
9800: 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
9810: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
9820: 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
9830: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
9840: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
9850: 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75  t i;.  int (*xFu
9860: 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20  nc)(Btree *pBt) 
9870: 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f  = 0;  /* Functio
9880: 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63  n to call on eac
9890: 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20  h btree backend 
98a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69  */.  int isSpeci
98b0: 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
98c0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
98d0: 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d  ue if SQLITE_NOM
98e0: 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a  EM or IOERR */..
98f0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
9900: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
9910: 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
9920: 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
9930: 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
9940: 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
9950: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
9960: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
9970: 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
9980: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
9990: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
99a0: 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
99b0: 53 70 65 63 69 61 6c 20 65 72 72 6f 72 73 3a 0a  Special errors:.
99c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66    **.  **     If
99d0: 20 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   an SQLITE_NOMEM
99e0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
99f0: 65 64 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e  ed in a statemen
9a00: 74 20 74 68 61 74 20 77 72 69 74 65 73 20 74 6f  t that writes to
9a10: 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61  .  **     the da
9a20: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 65 69 74  tabase, then eit
9a30: 68 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74 20  her a statement 
9a40: 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  or transaction m
9a50: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 0a 20 20  ust be rolled.  
9a60: 2a 2a 20 20 20 20 20 62 61 63 6b 20 74 6f 20 65  **     back to e
9a70: 6e 73 75 72 65 20 74 68 65 20 74 72 65 65 2d 73  nsure the tree-s
9a80: 74 72 75 63 74 75 72 65 73 20 61 72 65 20 69 6e  tructures are in
9a90: 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
9aa0: 61 74 65 2e 20 41 0a 20 20 2a 2a 20 20 20 20 20  ate. A.  **     
9ab0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
9ac0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
9ad0: 62 61 63 6b 20 69 66 20 6f 6e 65 20 69 73 20 6f  back if one is o
9ae0: 70 65 6e 2c 20 6f 74 68 65 72 77 69 73 65 20 74  pen, otherwise t
9af0: 68 65 0a 20 20 2a 2a 20 20 20 20 20 65 6e 74 69  he.  **     enti
9b00: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  re transaction m
9b10: 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
9b20: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck..  **.  **   
9b30: 20 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 49    If an SQLITE_I
9b40: 4f 45 52 52 20 65 72 72 6f 72 20 68 61 73 20 6f  OERR error has o
9b50: 63 63 75 72 65 64 20 69 6e 20 61 20 73 74 61 74  ccured in a stat
9b60: 65 6d 65 6e 74 20 74 68 61 74 20 77 72 69 74 65  ement that write
9b70: 73 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 74 68  s to.  **     th
9b80: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
9b90: 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
9ba0: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
9bb0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 65  rolled back. The
9bc0: 0a 20 20 2a 2a 20 20 20 20 20 49 2f 4f 20 65 72  .  **     I/O er
9bd0: 72 6f 72 20 6d 61 79 20 68 61 76 65 20 63 61 75  ror may have cau
9be0: 73 65 64 20 67 61 72 62 61 67 65 20 74 6f 20 62  sed garbage to b
9bf0: 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
9c00: 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 20   journal .  **  
9c10: 20 20 20 66 69 6c 65 2e 20 57 65 72 65 20 74 68     file. Were th
9c20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
9c30: 20 63 6f 6e 74 69 6e 75 65 20 61 6e 64 20 65 76   continue and ev
9c40: 65 6e 74 75 61 6c 6c 79 20 62 65 20 72 6f 6c 6c  entually be roll
9c50: 65 64 20 0a 20 20 2a 2a 20 20 20 20 20 62 61 63  ed .  **     bac
9c60: 6b 20 74 68 61 74 20 67 61 72 62 61 67 65 20 6d  k that garbage m
9c70: 69 67 68 74 20 65 6e 64 20 75 70 20 69 6e 20 74  ight end up in t
9c80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9c90: 2e 0a 20 20 2a 2a 20 20 20 20 20 0a 20 20 2a 2a  ..  **     .  **
9ca0: 20 20 20 20 20 49 6e 20 62 6f 74 68 20 6f 66 20       In both of 
9cb0: 74 68 65 20 61 62 6f 76 65 20 63 61 73 65 73 2c  the above cases,
9cc0: 20 74 68 65 20 56 64 62 65 2e 65 72 72 6f 72 41   the Vdbe.errorA
9cd0: 63 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69  ction variable i
9ce0: 73 20 0a 20 20 2a 2a 20 20 20 20 20 69 67 6e 6f  s .  **     igno
9cf0: 72 65 64 2e 20 49 66 20 74 68 65 20 73 71 6c 69  red. If the sqli
9d00: 74 65 33 2e 61 75 74 6f 43 6f 6d 6d 69 74 20 66  te3.autoCommit f
9d10: 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64  lag is false and
9d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20   a transaction. 
9d30: 20 2a 2a 20 20 20 20 20 69 73 20 72 6f 6c 6c 65   **     is rolle
9d40: 64 20 62 61 63 6b 2c 20 69 74 20 77 69 6c 6c 20  d back, it will 
9d50: 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
9d60: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 20    **.  ** Other 
9d70: 65 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20 2a  errors:.  **.  *
9d80: 2a 20 4e 6f 20 65 72 72 6f 72 3a 0a 20 20 2a 2a  * No error:.  **
9d90: 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
9da0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9db0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9dc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9dd0: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
9de0: 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56  orsExceptActiveV
9df0: 74 61 62 73 28 70 29 3b 0a 20 20 69 66 28 20 70  tabs(p);.  if( p
9e00: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
9e10: 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
9e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9e30: 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
9e40: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
9e50: 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
9e60: 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
9e70: 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
9e80: 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a   never started *
9e90: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
9ea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
9eb0: 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
9ec0: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
9ed0: 3e 72 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c  >rc */..    /* L
9ee0: 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75  ock all btrees u
9ef0: 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  sed by the state
9f00: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ment */.    sqli
9f10: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
9f20: 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74  ayEnter(&p->aMut
9f30: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  ex);..    /* Che
9f40: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
9f50: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
9f60: 20 2d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20   - SQLITE_NOMEM 
9f70: 6f 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  or SQLITE_IOERR 
9f80: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
9f90: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
9fa0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
9fb0: 28 0a 20 20 20 20 20 20 20 20 28 6d 72 63 3d 3d  (.        (mrc==
9fc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
9fd0: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
9fe0: 52 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  R || mrc==SQLITE
9ff0: 5f 49 4e 54 45 52 52 55 50 54 29 3f 31 3a 30 29  _INTERRUPT)?1:0)
a000: 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
a010: 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
a020: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
a030: 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  oes static analy
a040: 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  sis of the query
a050: 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66   to see which of
a060: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f   the.      ** fo
a070: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61  llowing three ca
a080: 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c  tegories it fall
a090: 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a  s into:.      **
a0a0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65  .      **     Re
a0b0: 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a  ad-only.      **
a0c0: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20       Query with 
a0d0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a0e0: 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  l.      **     Q
a0f0: 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61  uery without sta
a100: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  tement journal. 
a110: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
a120: 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d   We could do som
a130: 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67  ething more eleg
a140: 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74  ant than this st
a150: 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69  atic analysis (i
a160: 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f  .e..      ** sto
a170: 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71  re the type of q
a180: 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20  uery as part of 
a190: 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20  the compliation 
a1a0: 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20  phase), but .   
a1b0: 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d     ** handling m
a1c0: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
a1d0: 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c  ilure is a fairl
a1e0: 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63  y obscure edge c
a1f0: 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a  ase so .      **
a200: 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c   this is probabl
a210: 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20  y easier. Todo: 
a220: 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f  Might be an oppo
a230: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63  rtunity to reduc
a240: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  e .      ** code
a250: 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61   size a very sma
a260: 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68  ll amount though
a270: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
a280: 20 20 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c     int isReadOnl
a290: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  y = 1;.      int
a2a0: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30   isStatement = 0
a2b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
a2c0: 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d  ->aOp || p->nOp=
a2d0: 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  =0);.      for(i
a2e0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
a2f0: 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69  +){ .        swi
a300: 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  tch( p->aOp[i].o
a310: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
a320: 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73     case OP_Trans
a330: 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  action:.        
a340: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
a350: 20 62 69 74 20 73 74 72 61 6e 67 65 2e 20 49 66   bit strange. If
a360: 20 77 65 20 68 69 74 20 61 20 6d 61 6c 6c 6f 63   we hit a malloc
a370: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 61  () or IO error a
a380: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nd.            *
a390: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
a3a0: 64 69 64 20 6e 6f 74 20 6f 70 65 6e 20 61 20 73  did not open a s
a3b0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
a3c0: 74 69 6f 6e 2c 20 77 65 20 77 69 6c 6c 0a 20 20  tion, we will.  
a3d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c            ** rol
a3e0: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
a3f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
a400: 20 61 62 6f 72 74 20 61 6c 6c 20 6f 74 68 65 72   abort all other
a410: 20 61 63 74 69 76 65 0a 20 20 20 20 20 20 20 20   active.        
a420: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
a430: 73 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  s. Or, if this i
a440: 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  s an SQLITE_INTE
a450: 52 52 55 50 54 20 65 72 72 6f 72 2c 20 77 65 0a  RRUPT error, we.
a460: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
a470: 69 6c 6c 20 6f 6e 6c 79 20 72 6f 6c 6c 62 61 63  ill only rollbac
a480: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 72 75  k if the interru
a490: 70 74 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  pted statement w
a4a0: 61 73 20 61 20 77 72 69 74 65 2e 0a 20 20 20 20  as a write..    
a4b0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
a4c0: 20 20 20 20 20 20 20 2a 2a 20 49 74 20 63 6f 75         ** It cou
a4d0: 6c 64 20 62 65 20 61 72 67 75 65 64 20 74 68 61  ld be argued tha
a4e0: 74 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74 61 74  t read-only stat
a4f0: 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 6e 65  ements should ne
a500: 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ver.            
a510: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 74  ** rollback anyt
a520: 68 69 6e 67 2e 20 42 75 74 20 63 61 72 65 66 75  hing. But carefu
a530: 6c 20 61 6e 61 6c 79 73 69 73 20 69 73 20 72 65  l analysis is re
a540: 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 20 20  quired before.  
a550: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 6b            ** mak
a560: 69 6e 67 20 74 68 69 73 20 63 68 61 6e 67 65 0a  ing this change.
a570: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
a580: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
a590: 2d 3e 61 4f 70 5b 69 5d 2e 70 32 20 7c 7c 20 6d  ->aOp[i].p2 || m
a5a0: 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
a5b0: 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
a5c0: 20 20 20 20 20 20 69 73 52 65 61 64 4f 6e 6c 79        isReadOnly
a5d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a5e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a600: 20 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65   case OP_Stateme
a610: 6e 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt:.            
a620: 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b  isStatement = 1;
a630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a640: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a650: 20 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20      }..   .     
a660: 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
a670: 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20   was read-only, 
a680: 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f  we need do no ro
a690: 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f  llback at all. O
a6a0: 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
a6b0: 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  ** proceed with 
a6c0: 74 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  the special hand
a6d0: 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ling..      */. 
a6e0: 20 20 20 20 20 69 66 28 20 21 69 73 52 65 61 64       if( !isRead
a6f0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
a700: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a710: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
a720: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
a730: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
a740: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a750: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
a760: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
a770: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
a780: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20       } else if( 
a790: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
a7a0: 4d 45 4d 20 26 26 20 69 73 53 74 61 74 65 6d 65  MEM && isStateme
a7b0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
a7c0: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
a7d0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
a7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a7f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
a800: 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
a810: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
a820: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
a830: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
a840: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
a850: 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
a860: 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
a870: 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
a880: 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
a890: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a8a0: 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f     sqlite3AbortO
a8b0: 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28  therActiveVdbes(
a8c0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
a8d0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
a8e0: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
a8f0: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
a900: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
a910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
a920: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
a930: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
a940: 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
a950: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
a960: 74 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a  tive vdbe, then.
a970: 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74      ** we do eit
a980: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
a990: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
a9a0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
a9b0: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
a9c0: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
a9d0: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
a9e0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
a9f0: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
aa00: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
aa10: 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a  e has occured. .
aa20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
aa30: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26  b->autoCommit &&
aa40: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
aa50: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  nt==1 ){.      i
aa60: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
aa70: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
aa80: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
aa90: 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
aaa0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  or) ){.        /
aab0: 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
aac0: 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
aad0: 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72 6f  and the vdbe pro
aae0: 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20  gram was .      
aaf0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
ab00: 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
ab10: 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  IL' constraint. 
ab20: 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
ab30: 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mit .        ** 
ab40: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
ab50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ab60: 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d  int rc = vdbeCom
ab70: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20  mit(db);.       
ab80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ab90: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
aba0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
abb0: 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70  texArrayLeave(&p
abc0: 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  ->aMutex);.     
abd0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
abe0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
abf0: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
ac00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ac10: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
ac20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ac30: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
ac40: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
ac50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
ac60: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
ac70: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
ac80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ac90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
aca0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
acb0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
acc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75    }else if( !xFu
acd0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nc ){.      if( 
ace0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
acf0: 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
ad00: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
ad10: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
ad20: 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b  enedStatement ){
ad30: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
ad40: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
ad50: 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20  ommitStmt;.     
ad60: 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
ad70: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
ad80: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
ad90: 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20  {.        xFunc 
ada0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
adb0: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
adc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
add0: 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68   sqlite3AbortOth
ade0: 65 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62  erActiveVdbes(db
adf0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , p);.        sq
ae00: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
ae10: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
ae20: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
ae30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ae40: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
ae50: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
ae60: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
ae70: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
ae80: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
ae90: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
aea0: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
aeb0: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
aec0: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
aed0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
aee0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
aef0: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
af00: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
af10: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
af20: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
af30: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
af40: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
af50: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
af60: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
af70: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
af80: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
af90: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
afa0: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
afb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
afc0: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
afd0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
afe0: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
aff0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
b000: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
b010: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
b020: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
b030: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b040: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
b050: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
b060: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
b070: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
b080: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
b090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
b0a0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
b0b0: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
b0c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b0d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b0e0: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
b0f0: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
b100: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
b110: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
b120: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
b130: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
b140: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
b150: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
b160: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
b170: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
b180: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
b190: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
b1a0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
b1b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
b1c0: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
b1d0: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
b1e0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b1f0: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
b200: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
b210: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
b220: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
b230: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
b240: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
b250: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
b260: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
b270: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
b280: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
b290: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
b2a0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
b2b0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
b2c0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
b2d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
b2e0: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
b2f0: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
b300: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
b310: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
b320: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
b330: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
b340: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
b350: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
b360: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
b370: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
b380: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
b390: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
b3a0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
b3b0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
b3c0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
b3d0: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
b3e0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
b3f0: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
b400: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
b410: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
b420: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b430: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
b440: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
b450: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b460: 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e  t(db);..  return
b470: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
b480: 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
b490: 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
b4a0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b4b0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
b4c0: 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
b4d0: 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
b4e0: 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
b4f0: 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
b500: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
b510: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
b520: 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
b530: 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
b540: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b550: 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
b560: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
b570: 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
b580: 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
b590: 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
b5a0: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
b5b0: 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
b5c0: 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
b5d0: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
b5e0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
b5f0: 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
b600: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
b610: 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
b620: 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
b630: 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
b640: 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
b650: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
b660: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
b670: 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
b680: 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
b690: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
b6a0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
b6b0: 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
b6c0: 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
b6d0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
b6e0: 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
b6f0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
b700: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
b710: 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
b720: 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
b730: 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
b740: 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
b750: 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
b760: 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
b770: 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
b780: 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
b790: 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
b7a0: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
b7b0: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
b7c0: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73  VdbeHalt(p);.  s
b7d0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
b7e0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
b7f0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
b800: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
b810: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
b820: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
b830: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
b840: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
b850: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
b860: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
b870: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
b880: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
b890: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
b8a0: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
b8b0: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
b8c0: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
b8d0: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
b8e0: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
b8f0: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
b900: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
b910: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
b920: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
b930: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
b940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
b950: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
b960: 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
b970: 53 51 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69  SQLITE_UTF8,sqli
b980: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20  te3_free);.     
b990: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
b9a0: 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ->rc;.      p->z
b9b0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
b9c0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
b9d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b9e0: 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
b9f0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
ba00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ba10: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
ba20: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
ba30: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
ba40: 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
ba50: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
ba60: 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
ba70: 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
ba80: 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
ba90: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
baa0: 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
bab0: 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
bac0: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
bad0: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
bae0: 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
baf0: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
bb00: 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
bb10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
bb20: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
bb30: 3e 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  >rc, 0);.  }..  
bb40: 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
bb50: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
bb60: 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
bb70: 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
bb80: 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
bb90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
bba0: 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
bbb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
bbc0: 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b  >pTos<&p->aStack
bbd0: 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63  [p->pc<0?0:p->pc
bbe0: 5d 20 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20  ] || !p->aStack 
bbf0: 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  );.#ifdef VDBE_P
bc00: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
bc10: 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
bc20: 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
bc30: 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
bc40: 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
bc50: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
bc60: 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
bc70: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
bc80: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
bc90: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
bca0: 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
bcb0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
bcc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bcd0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
bce0: 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  n");.      for(i
bcf0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
bd00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
bd10: 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31  ntf(out, "%6d %1
bd20: 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20  0lld %8lld ",.  
bd30: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
bd40: 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
bd50: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
bd60: 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
bd70: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
bd80: 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
bd90: 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
bda0: 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
bdb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bdc0: 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
bdd0: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
bde0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
bdf0: 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
be00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
be10: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
be20: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61  GIC_INIT;.  p->a
be30: 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72 65  borted = 0;.  re
be40: 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
be50: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
be60: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
be70: 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
be80: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
be90: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
bea0: 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
beb0: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
bec0: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
bed0: 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
bee0: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
bef0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
bf00: 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
bf10: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
bf20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
bf30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
bf40: 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
bf50: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
bf60: 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
bf70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
bf80: 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
bf90: 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
bfa0: 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
bfb0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61   }else if( p->ma
bfc0: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
bfd0: 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  INIT ){.    retu
bfe0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
bff0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
c000: 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
c010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c020: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
c030: 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
c040: 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
c050: 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
c060: 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
c070: 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
c080: 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
c090: 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
c0a0: 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
c0b0: 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
c0c0: 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
c0d0: 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
c0e0: 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
c0f0: 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
c100: 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
c110: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
c120: 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
c130: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
c140: 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
c150: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c160: 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
c170: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c180: 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
c190: 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
c1a0: 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
c1b0: 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
c1c0: 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78  (1<<i))) && pAux
c1d0: 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20  ->pAux ){.      
c1e0: 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
c1f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
c200: 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
c210: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
c220: 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78        pAux->pAux
c230: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
c240: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
c250: 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
c260: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
c270: 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
c280: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
c290: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
c2a0: 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  ;.  Cleanup(p);.
c2b0: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
c2c0: 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
c2d0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
c2e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
c2f0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56  ssert( p->db->pV
c300: 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d  dbe==p );.    p-
c310: 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e  >db->pVdbe = p->
c320: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
c330: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
c340: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
c350: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
c360: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
c370: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c380: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
c390: 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70      Op *pOp = &p
c3a0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20  ->aOp[i];.      
c3b0: 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79  freeP3(pOp->p3ty
c3c0: 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  pe, pOp->p3);.  
c3d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
c3e0: 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  free(p->aOp);.  
c3f0: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
c400: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
c410: 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  nVar);.  sqlite3
c420: 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29  _free(p->aLabel)
c430: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
c440: 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72  (p->aStack);.  r
c450: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
c460: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
c470: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c480: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_N);.  sqlite3_
c490: 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  free(p->aColName
c4a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c4b0: 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d  e(p->zSql);.  p-
c4c0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
c4d0: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
c4e0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
c4f0: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
c500: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
c510: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
c520: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
c530: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
c540: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
c550: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
c560: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
c570: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
c580: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
c590: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
c5a0: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
c5b0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
c5c0: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
c5d0: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
c5e0: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
c5f0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
c600: 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
c610: 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
c620: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
c630: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
c640: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
c650: 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
c660: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c670: 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72  eeMoveto(p->pCur
c680: 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
c690: 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
c6a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c6b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a  return rc;.    *
c6c0: 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b  p->pIncrKey = 0;
c6d0: 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
c6e0: 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e  d = keyToInt(p->
c6f0: 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20  movetoTarget);. 
c700: 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
c710: 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20  id = res==0;.   
c720: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
c730: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c740: 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75  BtreeNext(p->pCu
c750: 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
c760: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
c770: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66  rn rc;.    }.#if
c780: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
c790: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
c7a0: 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
c7b0: 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
c7c0: 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
c7d0: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
c7e0: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
c7f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c800: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c810: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
c820: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
c830: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c840: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
c850: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
c860: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
c870: 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29  VdbeSerialRead()
c880: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c890: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
c8a0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57  lite3VdbeSerialW
c8b0: 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  rite().**.** enc
c8c0: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
c8d0: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
c8e0: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
c8f0: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
c900: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
c910: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
c920: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
c930: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
c940: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
c950: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
c960: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
c970: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
c980: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
c990: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
c9a0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
c9b0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
c9c0: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
c9d0: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
c9e0: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
c9f0: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
ca00: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
ca10: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
ca20: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
ca30: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
ca40: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
ca50: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
ca60: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
ca70: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
ca80: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
ca90: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
caa0: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
cab0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
cac0: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
cad0: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
cae0: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
caf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
cb00: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
cb10: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
cb20: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
cb30: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
cb40: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
cb50: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
cb60: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
cb70: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
cb80: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
cb90: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
cbb0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cbc0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
cbd0: 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
cbe0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
cbf0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
cc00: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
cc10: 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
cc40: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
cc50: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
cc60: 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
cc70: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
cc80: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
ccb0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
ccc0: 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
ccf0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
cd00: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
cd10: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
cd20: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
cd30: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
cd60: 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
cd70: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
cd80: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
cd90: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
cda0: 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
cdb0: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
cdc0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
cdd0: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
cde0: 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
cdf0: 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
ce20: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
ce30: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
ce40: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
ce50: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
ce60: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
ce70: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
ce80: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
ce90: 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
cea0: 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
ceb0: 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
cec0: 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
ced0: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
cee0: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
cef0: 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
cf00: 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
cf10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
cf20: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
cf30: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
cf40: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
cf50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
cf60: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
cf70: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
cf80: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
cf90: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
cfa0: 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  int n;..  if( fl
cfb0: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
cfc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cfd0: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
cfe0: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
cff0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
d000: 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
d010: 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
d020: 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
d030: 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
d040: 29 30 78 30 30 30 30 31 30 30 30 29 3c 3c 33 32  )0x00001000)<<32
d050: 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
d060: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
d070: 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66  u64 u;.    if( f
d080: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26  ile_format>=4 &&
d090: 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20   (i&1)==i ){.   
d0a0: 20 20 20 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20     return 8+i;. 
d0b0: 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30     }.    u = i<0
d0c0: 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69   ? -i : i;.    i
d0d0: 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75  f( u<=127 ) retu
d0e0: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 1;.    if( u<
d0f0: 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20  =32767 ) return 
d100: 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33  2;.    if( u<=83
d110: 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33  88607 ) return 3
d120: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  ;.    if( u<=214
d130: 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e  7483647 ) return
d140: 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d   4;.    if( u<=M
d150: 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72  AX_6BYTE ) retur
d160: 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 5;.    return 
d170: 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
d180: 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
d190: 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
d1a0: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
d1b0: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
d1c0: 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
d1d0: 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
d1e0: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
d1f0: 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
d200: 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  .i;.  }.  assert
d210: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( n>=0 );.  retu
d220: 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
d230: 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
d240: 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
d250: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
d260: 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
d270: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
d280: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
d290: 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74  ial-type..*/.int
d2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d2b0: 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
d2c0: 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
d2d0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
d2e0: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
d2f0: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
d300: 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
d310: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
d320: 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
d330: 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
d340: 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
d350: 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
d360: 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
d370: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
d380: 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
d390: 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
d3a0: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
d3b0: 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
d3c0: 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
d3d0: 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
d3e0: 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
d3f0: 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
d400: 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
d410: 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
d420: 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
d430: 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
d440: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
d450: 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
d460: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
d470: 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
d480: 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
d490: 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
d4a0: 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
d4b0: 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
d4c0: 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
d4d0: 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
d4e0: 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
d4f0: 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
d500: 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
d510: 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
d520: 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
d530: 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
d540: 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
d550: 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
d560: 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
d570: 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
d580: 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
d590: 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
d5a0: 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
d5b0: 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
d5c0: 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
d5d0: 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
d5e0: 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
d5f0: 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
d600: 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
d610: 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
d620: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
d630: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
d640: 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
d650: 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
d660: 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
d670: 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
d680: 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
d690: 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
d6a0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
d6b0: 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
d6c0: 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
d6d0: 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
d6e0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
d6f0: 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
d700: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
d710: 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
d720: 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  t..*/.#ifdef SQL
d730: 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
d740: 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
d750: 74 69 63 20 64 6f 75 62 6c 65 20 66 6c 6f 61 74  tic double float
d760: 53 77 61 70 28 64 6f 75 62 6c 65 20 69 6e 29 7b  Swap(double in){
d770: 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 64  .  union {.    d
d780: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 75 33 32  ouble r;.    u32
d790: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
d7a0: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
d7b0: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
d7c0: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
d7d0: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
d7e0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
d7f0: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
d800: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
d810: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
d820: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
d830: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
d840: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
d850: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
d860: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
d870: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
d880: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
d890: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
d8a0: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
d8b0: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
d8c0: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
d8d0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
d8e0: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
d8f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d900: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
d910: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
d920: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
d930: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
d940: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
d950: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
d960: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
d970: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
d980: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
d990: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
d9a0: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
d9b0: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
d9c0: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
d9d0: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
d9e0: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
d9f0: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
da00: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
da10: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
da20: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
da30: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
da40: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
da50: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
da60: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
da70: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
da80: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
da90: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
daa0: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
dab0: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
dac0: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
dad0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
dae0: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
daf0: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
db00: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
db10: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
db20: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
db30: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
db40: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
db50: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
db60: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
db70: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
db80: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
db90: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
dba0: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
dbb0: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
dbc0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
dbd0: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
dbe0: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
dbf0: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
dc00: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
dc10: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
dc20: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
dc30: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
dc40: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
dc50: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
dc60: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
dc70: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
dc80: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
dc90: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
dca0: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
dcb0: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
dcc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
dcd0: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
dce0: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
dcf0: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
dd00: 46 6c 6f 61 74 28 70 4d 65 6d 2d 3e 72 29 3b 0a  Float(pMem->r);.
dd10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
dd20: 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f   &pMem->r, sizeo
dd30: 66 28 76 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  f(v));.    }else
dd40: 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
dd50: 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
dd60: 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
dd70: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
dd80: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
dd90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65  ;.    assert( le
dda0: 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 77  n<=nBuf );.    w
ddb0: 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20  hile( i-- ){.   
ddc0: 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30     buf[i] = (v&0
ddd0: 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
dde0: 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
ddf0: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
de00: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
de10: 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
de20: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
de30: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
de40: 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
de50: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
de60: 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20 20  pMem->u.i:0).   
de70: 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73 71 6c            == sql
de80: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
de90: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
dea0: 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
deb0: 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
dec0: 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
ded0: 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
dee0: 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
def0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
df00: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
df10: 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
df20: 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20   += pMem->u.i;. 
df30: 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75       if( len>nBu
df40: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  f ){.        len
df50: 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d   = nBuf;.      }
df60: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62  .      memset(&b
df70: 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20  uf[pMem->n], 0, 
df80: 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  len-pMem->n);.  
df90: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
dfa0: 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
dfb0: 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
dfc0: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
dfd0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
dfe0: 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
dff0: 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
e000: 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
e010: 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
e020: 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
e030: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
e040: 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
e050: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
e060: 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74  es read..*/ .int
e070: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e080: 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
e090: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
e0a0: 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
e0b0: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
e0c0: 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
e0d0: 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
e0e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
e0f0: 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
e100: 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
e110: 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
e120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
e130: 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
e140: 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
e150: 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
e160: 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
e170: 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
e180: 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
e190: 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
e1a0: 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
e1b0: 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
e1c0: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
e1d0: 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20   {  /* NULL */. 
e1e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e1f0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
e200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e210: 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
e220: 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
e230: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
e240: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67  pMem->u.i = (sig
e250: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b  ned char)buf[0];
e260: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
e270: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
e290: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
e2a0: 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
e2b0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
e2c0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
e2d0: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
e2e0: 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
e2f0: 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [1];.      pMem-
e300: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e310: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
e320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e330: 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
e340: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e350: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
e360: 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
e370: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20  ar)buf[0])<<16) 
e380: 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20  | (buf[1]<<8) | 
e390: 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[2];.      pM
e3a0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e3b0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e3c0: 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
e3d0: 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
e3e0: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e3f0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
e400: 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c  >u.i = (buf[0]<<
e410: 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
e420: 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
e430: 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
e440: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e450: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
e460: 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
e470: 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
e480: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
e490: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36  eger */.      u6
e4a0: 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20  4 x = (((signed 
e4b0: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
e4c0: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
e4d0: 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d   u32 y = (buf[2]
e4e0: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c  <<24) | (buf[3]<
e4f0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c  <16) | (buf[4]<<
e500: 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20  8) | buf[5];.   
e510: 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
e520: 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   y;.      pMem->
e530: 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
e540: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
e550: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e560: 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
e570: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
e580: 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
e590: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
e5a0: 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
e5b0: 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
e5c0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  nt */.      u64 
e5d0: 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a  x;.      u32 y;.
e5e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
e5f0: 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
e600: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
e610: 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
e620: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
e630: 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
e640: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
e650: 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
e660: 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
e670: 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
e680: 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
e690: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
e6a0: 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  OAT is.      ** 
e6b0: 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
e6c0: 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
e6d0: 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
e6e0: 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20   are mixed.     
e6f0: 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
e700: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
e710: 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
e720: 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
e730: 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74  0)<<32;.      st
e740: 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
e750: 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
e760: 20 20 64 6f 75 62 6c 65 20 72 32 20 3d 20 72 31    double r2 = r1
e770: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
e780: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 72 32 29  dEndianFloat(r2)
e790: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e7a0: 73 69 7a 65 6f 66 28 72 32 29 3d 3d 73 69 7a 65  sizeof(r2)==size
e7b0: 6f 66 28 74 31 29 20 26 26 20 6d 65 6d 63 6d 70  of(t1) && memcmp
e7c0: 28 26 72 32 2c 20 26 74 31 2c 20 73 69 7a 65 6f  (&r2, &t1, sizeo
e7d0: 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
e7e0: 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
e7f0: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
e800: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
e810: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
e820: 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
e830: 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
e840: 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
e850: 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
e860: 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
e870: 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
e880: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
e890: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
e8a0: 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
e8b0: 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
e8c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e8d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e8e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
e8f0: 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
e900: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
e910: 38 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  8 );.        mem
e920: 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
e930: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
e940: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
e950: 6e 64 69 61 6e 46 6c 6f 61 74 28 70 4d 65 6d 2d  ndianFloat(pMem-
e960: 3e 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >r);.        pMe
e970: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52  m->flags = MEM_R
e980: 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eal;.      }.   
e990: 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20     return 8;.   
e9a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
e9b0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
e9c0: 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
e9d0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
e9e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
e9f0: 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
ea00: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
ea10: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ea20: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ea30: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
ea40: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  : {.      int le
ea50: 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
ea60: 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
ea70: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
ea80: 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
ea90: 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  >n = len;.      
eaa0: 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
eab0: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
eac0: 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20  _type&0x01 ){.  
ead0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
eae0: 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
eaf0: 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
eb00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
eb10: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
eb20: 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  Blob | MEM_Ephem
eb30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eb40: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20  return len;.    
eb50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
eb60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68  ;.}../*.** The h
eb70: 65 61 64 65 72 20 6f 66 20 61 20 72 65 63 6f 72  eader of a recor
eb80: 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  d consists of a 
eb90: 73 65 71 75 65 6e 63 65 20 76 61 72 69 61 62 6c  sequence variabl
eba0: 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e-length integer
ebb0: 73 2e 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74 65  s..** These inte
ebc0: 67 65 72 73 20 61 72 65 20 61 6c 6d 6f 73 74 20  gers are almost 
ebd0: 61 6c 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64  always small and
ebe0: 20 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20   are encoded as 
ebf0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
ec00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ec10: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 64 76 61  macro takes adva
ec20: 6e 74 61 67 65 20 74 68 69 73 20 66 61 63 74 20  ntage this fact 
ec30: 74 6f 20 70 72 6f 76 69 64 65 20 61 20 66 61 73  to provide a fas
ec40: 74 20 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74  t decode.** of t
ec50: 68 65 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61  he integers in a
ec60: 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 2e 20   record header. 
ec70: 20 49 74 20 69 73 20 66 61 73 74 65 72 20 66 6f   It is faster fo
ec80: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
ec90: 65 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 69  e.** where the i
eca0: 6e 74 65 67 65 72 20 69 73 20 61 20 73 69 6e 67  nteger is a sing
ecb0: 6c 65 20 62 79 74 65 2e 20 20 49 74 20 69 73 20  le byte.  It is 
ecc0: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 20  a little slower 
ecd0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65  when the.** inte
ece0: 67 65 72 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f  ger is two or mo
ecf0: 72 65 20 62 79 74 65 73 2e 20 20 42 75 74 20 6f  re bytes.  But o
ed00: 76 65 72 61 6c 6c 20 69 74 20 69 73 20 66 61 73  verall it is fas
ed10: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ter..**.** The f
ed20: 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
ed30: 69 6f 6e 73 20 61 72 65 20 65 71 75 69 76 61 6c  ions are equival
ed40: 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78  ent:.**.**     x
ed50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72   = sqlite3GetVar
ed60: 69 6e 74 33 32 28 20 41 2c 20 26 42 20 29 3b 0a  int32( A, &B );.
ed70: 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47 65  **.**     x = Ge
ed80: 74 56 61 72 69 6e 74 28 20 41 2c 20 42 20 29 3b  tVarint( A, B );
ed90: 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  .**.*/.#define G
eda0: 65 74 56 61 72 69 6e 74 28 41 2c 42 29 20 20 28  etVarint(A,B)  (
edb0: 28 42 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66  (B = *(A))<=0x7f
edc0: 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 47 65   ? 1 : sqlite3Ge
edd0: 74 56 61 72 69 6e 74 33 32 28 41 2c 20 26 42 29  tVarint32(A, &B)
ede0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )../*.** This fu
edf0: 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
ee00: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
ee10: 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
ee20: 72 64 73 20 73 70 65 63 69 66 69 65 64 20 62 79  rds specified by
ee30: 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   .** {nKey1, pKe
ee40: 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20  y1} and {nKey2, 
ee50: 70 4b 65 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e  pKey2}, returnin
ee60: 67 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  g a negative, ze
ee70: 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
ee80: 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b  e integer if {nK
ee90: 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c  ey1, pKey1} is l
eea0: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
eeb0: 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
eec0: 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70  r than {nKey2, p
eed0: 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79  Key2}.  Both Key
eee0: 31 20 61 6e 64 20 4b 65 79 32 20 6d 75 73 74 20  1 and Key2 must 
eef0: 62 65 20 62 79 74 65 20 73 74 72 69 6e 67 73 0a  be byte strings.
ef00: 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62 79 20 74  ** composed by t
ef10: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
ef20: 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
ef30: 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  DBE..*/.int sqli
ef40: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
ef50: 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 75 73  pare(.  void *us
ef60: 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b  erData,.  int nK
ef70: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
ef80: 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e  *pKey1, .  int n
ef90: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
efa0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79   *pKey2.){.  Key
efb0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
efc0: 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73 65 72 44   (KeyInfo*)userD
efd0: 61 74 61 3b 0a 20 20 75 33 32 20 64 31 2c 20 64  ata;.  u32 d1, d
efe0: 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  2;          /* O
eff0: 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
f000: 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
f010: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
f020: 69 64 78 31 2c 20 69 64 78 32 3b 20 20 20 20 20  idx1, idx2;     
f030: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
f040: 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
f050: 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
f060: 0a 20 20 75 33 32 20 73 7a 48 64 72 31 2c 20 73  .  u32 szHdr1, s
f070: 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65  zHdr2;  /* Numbe
f080: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
f090: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
f0a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
f0b0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
f0c0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
f0d0: 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
f0e0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
f0f0: 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
f100: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f110: 68 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f  har *aKey2 = (co
f120: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f130: 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65  r *)pKey2;..  Me
f140: 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65  m mem1;.  Mem me
f150: 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d  m2;.  mem1.enc =
f160: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
f170: 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
f180: 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32  Info->db;.  mem2
f190: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
f1a0: 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 64 62 20  >enc;.  mem2.db 
f1b0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
f1c0: 20 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56    .  idx1 = GetV
f1d0: 61 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48  arint(aKey1, szH
f1e0: 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
f1f0: 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47 65  dr1;.  idx2 = Ge
f200: 74 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20 73  tVarint(aKey2, s
f210: 7a 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20 73  zHdr2);.  d2 = s
f220: 7a 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20  zHdr2;.  nField 
f230: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
f240: 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78  ld;.  while( idx
f250: 31 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78 32  1<szHdr1 && idx2
f260: 3c 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20 75  <szHdr2 ){.    u
f270: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
f280: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
f290: 74 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52  type2;..    /* R
f2a0: 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
f2b0: 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
f2c0: 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
f2d0: 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
f2e0: 78 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28  x1 += GetVarint(
f2f0: 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
f300: 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20  ial_type1 );.   
f310: 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
f320: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
f330: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
f340: 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
f350: 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20  ak;.    idx2 += 
f360: 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 32  GetVarint( aKey2
f370: 2b 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74 79  +idx2, serial_ty
f380: 70 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe2 );.    if( d
f390: 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69  2>=nKey2 && sqli
f3a0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
f3b0: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
f3c0: 32 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  2)>0 ) break;.. 
f3d0: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
f3e0: 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
f3f0: 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
f400: 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
f410: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
f420: 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
f430: 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
f440: 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69 74  .    d2 += sqlit
f450: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
f460: 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72 69  &aKey2[d2], seri
f470: 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32 29  al_type2, &mem2)
f480: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
f490: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
f4a0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
f4b0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
f4c0: 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46  em1, &mem2, i<nF
f4d0: 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d  ield ? pKeyInfo-
f4e0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a  >aColl[i] : 0);.
f4f0: 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61      if( mem1.fla
f500: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73  gs & MEM_Dyn ) s
f510: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
f520: 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20  ease(&mem1);.   
f530: 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20   if( mem2.flags 
f540: 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  & MEM_Dyn ) sqli
f550: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
f560: 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66  e(&mem2);.    if
f570: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
f580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f590: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
f5a0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   One of the keys
f5b0: 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
f5c0: 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  ds, but all the 
f5d0: 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
f5e0: 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72  t point.  ** wer
f5f0: 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20  e equal. If the 
f600: 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20  incrKey flag is 
f610: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73  true, then the s
f620: 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a  econd key is.  *
f630: 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61 72  * treated as lar
f640: 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
f650: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
f660: 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b   pKeyInfo->incrK
f670: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
f680: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
f690: 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20  f( d1<nKey1 ){. 
f6a0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
f6b0: 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c 6e 4b   }else if( d2<nK
f6c0: 65 79 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ey2 ){.      rc 
f6d0: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  = -1;.    }.  }e
f6e0: 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
f6f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
f700: 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  i<pKeyInfo->nFie
f710: 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ld.             
f720: 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61    && pKeyInfo->a
f730: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
f740: 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
f750: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f760: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
f770: 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e 64 65  ument is an inde
f780: 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64  x entry composed
f790: 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
f7a0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
f7b0: 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6e 74  .** The last ent
f7c0: 72 79 20 69 6e 20 74 68 69 73 20 72 65 63 6f 72  ry in this recor
f7d0: 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  d should be an i
f7e0: 6e 74 65 67 65 72 20 28 73 70 65 63 69 66 69 63  nteger (specific
f7f0: 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  ally.** an integ
f800: 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68 69 73  er rowid).  This
f810: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
f820: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
f830: 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ytes in.** that 
f840: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
f850: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
f860: 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20  widLen(const u8 
f870: 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a  *aKey){.  u32 sz
f880: 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
f890: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
f8a0: 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
f8b0: 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
f8c0: 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
f8d0: 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  owid */..  sqlit
f8e0: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b  e3GetVarint32(aK
f8f0: 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  ey, &szHdr);.  s
f900: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
f910: 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d  2(&aKey[szHdr-1]
f920: 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  , &typeRowid);. 
f930: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
f940: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f950: 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20  (typeRowid);.}. 
f960: 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
f970: 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
f980: 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
f990: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
f9a0: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
f9b0: 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
f9c0: 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
f9d0: 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
f9e0: 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
f9f0: 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
fa00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
fa10: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
fa20: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
fa30: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
fa40: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
fa50: 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  dxRowid(BtCursor
fa60: 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
fa70: 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
fa80: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
fa90: 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
faa0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
fab0: 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
fac0: 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
fad0: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
fae0: 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
faf0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
fb00: 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
fb10: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
fb20: 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71   Mem m, v;..  sq
fb30: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
fb40: 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
fb50: 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
fb60: 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey<=0 ){.    ret
fb70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fb80: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
fb90: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
fba0: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
fbb0: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
fbc0: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
fbd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fbe0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47  ;.  }.  sqlite3G
fbf0: 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
fc00: 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  m.z, &szHdr);.  
fc10: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
fc20: 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
fc30: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69  dr-1], &typeRowi
fc40: 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d  d);.  lenRowid =
fc50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
fc60: 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
fc70: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
fc80: 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
fc90: 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
fca0: 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
fcb0: 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
fcc0: 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
fcd0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
fce0: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
fcf0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fd00: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
fd10: 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
fd20: 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
fd30: 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20   pC is point to 
fd40: 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
fd50: 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65  ey string in pKe
fd60: 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65  y (of length nKe
fd70: 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  y).  Write into 
fd80: 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
fd90: 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
fda0: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
fdb0: 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
fdc0: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
fdd0: 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
fde0: 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65  r than pKey.  Re
fdf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
fe00: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
fe10: 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20   pKey is either 
fe20: 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
fe30: 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
fe40: 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
fe50: 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
fe60: 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
fe70: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
fe80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
fe90: 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
fea0: 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
feb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fec0: 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
fed0: 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c  e(.  Cursor *pC,
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
ff00: 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
ff10: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
ff20: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c   const u8 *pKey,
ff30: 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f     /* The key to
ff40: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e   compare */.  in
ff50: 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
ff60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
ff70: 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
ff80: 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
ff90: 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
ffa0: 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
ffb0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
ffc0: 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
ffd0: 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64  ;.  int lenRowid
ffe0: 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71  ;.  Mem m;..  sq
fff0: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
10000 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
10010 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
10020 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65  ey<=0 ){.    *re
10030 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
10040 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10060 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
10070 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
10080 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
10090 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
100a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
100b0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
100c0 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
100d0 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a  dLen((u8*)m.z);.
100e0 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
100f0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
10100 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  e(pC->pKeyInfo, 
10110 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e  m.n-lenRowid, m.
10120 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  z, nKey, pKey);.
10130 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
10140 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
10150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
10170 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
10180 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
10190 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
101a0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
101b0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
101c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
101d0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
101e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
101f0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
10200 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
10210 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
10220 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10230 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
10240 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
10250 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
10260 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
10270 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
10280 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
10290 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
102a0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
102b0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
102c0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
102d0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
102e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
102f0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
10300 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
10310 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
10320 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
10330 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10340 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10350 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
10360 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
10370 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
10380 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
10390 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
103a0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
103b0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
103c0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
103d0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
103e0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
103f0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
10400 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
10410 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
10420 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
10430 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
10440 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
10450 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
10460 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
10470 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
10480 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
10490 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
104a0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
104b0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
104c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
104d0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
104e0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
104f0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
10500 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
10510 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
10520 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
10530 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
10540 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
10550 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
10560 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
10570 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
10580 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
10590 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
105a0 2d 3e 64 62 3b 0a 7d 0a                          ->db;.}.