/ Hex Artifact Content
Login

Artifact 5f1e5e98a13235cbc446501fe040eb31423fface:


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 29 7b  Vdbe *p, int i){
48e0: 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61  .  int mask;.  a
48f0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4900: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  <p->db->nDb );. 
4910: 20 61 73 73 65 72 74 28 20 69 3c 73 69 7a 65 6f   assert( i<sizeo
4920: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
4930: 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c  8 );.  mask = 1<
4940: 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74  <i;.  if( (p->bt
4950: 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  reeMask & mask)=
4960: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72  =0 ){.    p->btr
4970: 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  eeMask |= mask;.
4980: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
4990: 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72 74  MutexArrayInsert
49a0: 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e  (&p->aMutex, p->
49b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
49c0: 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66  .  }.}...#if def
49d0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
49e0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
49f0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
4a00: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
4a10: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
4a20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
4a30: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
4a40: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
4a50: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
4a60: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
4a70: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
4a80: 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61 72 20  ar *zP3;.  char 
4a90: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74  zPtr[50];.  stat
4aa0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
4ab0: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
4ac0: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 73 5c  -13s %4d %4d %s\
4ad0: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
4ae0: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
4af0: 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73 70 6c  t;.  zP3 = displ
4b00: 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP3(pOp, zPtr, 
4b10: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20  sizeof(zPtr));. 
4b20: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
4b30: 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20 20 70  Format1,.      p
4b40: 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  c, sqlite3Opcode
4b50: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
4b60: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
4b70: 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c  >p2, zP3);.  ffl
4b80: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
4b90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
4ba0: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
4bb0: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
4bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
4bd0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
4be0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
4bf0: 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68 69 6c  f( p ){.    whil
4c00: 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20  e( N-->0 ){.    
4c10: 20 20 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c    assert( N<2 ||
4c20: 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64   p[0].db==p[1].d
4c30: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
4c40: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
4c50: 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (p++);.    }.  }
4c60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4c70: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
4c80: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
4c90: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
4ca0: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
4cb0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
4cc0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
4cd0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
4ce0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
4cf0: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
4d00: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
4d10: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
4d20: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
4d30: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
4d40: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
4d50: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
4d60: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
4d70: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74  EXPLAIN"..*/.int
4d80: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
4d90: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4db0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
4dc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4dd0: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
4de0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4df0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
4e00: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
4e10: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
4e20: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20  DBE_MAGIC_RUN ) 
4e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
4e40: 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  SUSE;.  assert( 
4e50: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
4e60: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a  E_MAGIC_BUSY );.
4e70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
4e80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
4e90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
4ea0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
4eb0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
4ec0: 65 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64  e does not put d
4ed0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f  ynamic strings o
4ee0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
4ef0: 20 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79   stack, they may
4f00: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
4f10: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
4f20: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
4f30: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
4f40: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
4f50: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
4f60: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
4f70: 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70   if( p->pTos==&p
4f80: 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20  ->aStack[4] ){. 
4f90: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
4fa0: 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29  ay(p->aStack, 5)
4fb0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e  ;.  }.  p->resOn
4fc0: 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f  Stack = 0;..  do
4fd0: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
4fe0: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70  +;.  }while( i<p
4ff0: 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c  ->nOp && p->expl
5000: 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70  ain==2 && p->aOp
5010: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45  [i].opcode!=OP_E
5020: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
5030: 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  i>=p->nOp ){.   
5040: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5050: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
5060: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
5070: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
5080: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
5090: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
50a0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
50b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
50c0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
50d0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
50e0: 4d 73 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53  Msg, sqlite3ErrS
50f0: 74 72 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72  tr(p->rc), (char
5100: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
5110: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d     Op *pOp = &p-
5120: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d  >aOp[i];.    Mem
5130: 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61   *pMem = p->aSta
5140: 63 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ck;.    pMem->fl
5150: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5160: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5170: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
5180: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
5190: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
51c0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  nter */.    pMem
51d0: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
51e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
51f0: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
5200: 72 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  rm;.    pMem->z 
5210: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
5220: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
5230: 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63  opcode);  /* Opc
5240: 6f 64 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ode */.    asser
5250: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
5260: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73  .    pMem->n = s
5270: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5280: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
5290: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
52a0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
52b0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70  LITE_UTF8;.    p
52c0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
52d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
52e0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
52f0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
5320: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5330: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
5340: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5350: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5360: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
5370: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
53a0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
53b0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
53c0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
53d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
53e0: 3d 20 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f  = MEM_Ephem|MEM_
53f0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20  Str|MEM_Term;   
5400: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
5410: 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 33  m->z = displayP3
5420: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f  (pOp, pMem->zSho
5430: 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  rt, sizeof(pMem-
5440: 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 61  >zShort));.    a
5450: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5460: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
5470: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5480: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
5490: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
54a0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
54b0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a  = SQLITE_UTF8;..
54c0: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
54d0: 6e 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78  n = 5 - 2*(p->ex
54e0: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
54f0: 3e 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20  >pTos = pMem;.  
5500: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
5510: 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f  _OK;.    p->resO
5520: 6e 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  nStack = 1;.    
5530: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
5540: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5550: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5560: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5570: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
5580: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
5590: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
55a0: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
55b0: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
55c0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
55d0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
55e0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
55f0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
5600: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
5610: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
5620: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
5630: 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20  p->aOp[nOp-1];. 
5640: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
5650: 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70  ==OP_Noop && pOp
5660: 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 63  ->p3!=0 ){.    c
5670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
5680: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c  Op->p3;.    whil
5690: 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a  e( isspace(*(u8*
56a0: 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70  )z) ) z++;.    p
56b0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
56c0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
56d0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
56e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
56f0: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
5700: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
5710: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
5720: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
5730: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
5740: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
5750: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5760: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
5770: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
5780: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
5790: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
57a0: 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 3d 3d  lite3_io_trace==
57b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
57c0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
57d0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
57e0: 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20  p[nOp-1];.  if( 
57f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
5800: 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21  Noop && pOp->p3!
5810: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
5820: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
5830: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
5840: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
5850: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
5860: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 66 6f 72  Op->p3);.    for
5870: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
5880: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
5890: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
58a0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
58b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
58c0: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
58d0: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
58e0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
58f0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
5900: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
5910: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5930: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
5940: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5950: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
5960: 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 28  qlite3_io_trace(
5970: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
5980: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
5990: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
59a0: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
59b0: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
59c0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
59d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
59e0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20   for execution. 
59f0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
5a00: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
5a10: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
5a20: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
5a30: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
5a40: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
5a50: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
5a60: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
5a70: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
5a80: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
5a90: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
5aa0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
5ab0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73    .**.** This is
5ac0: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
5ad0: 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f   move a VDBE fro
5ae0: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  m VDBE_MAGIC_INI
5af0: 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  T to.** VDBE_MAG
5b00: 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20  IC_RUN..*/.void 
5b10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
5b20: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
5b50: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  BE */.  int nVar
5b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5b70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5b80: 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74   of '?' see in t
5b90: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
5ba0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20   */.  int nMem, 
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5bd0: 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
5be0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
5bf0: 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20  int nCursor,    
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5c10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
5c20: 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ors to allocate 
5c30: 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61  */.  int isExpla
5c40: 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
5c50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5c60: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
5c70: 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a  rds is present *
5c80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
5c90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
5ca0: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
5cb0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
5cc0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5cd0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
5ce0: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
5cf0: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
5d00: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
5d10: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5d20: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
5d30: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
5d40: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
5d50: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
5d60: 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69  ter. This.   * i
5d70: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
5d80: 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72  ll to resizeOpAr
5d90: 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20  ray() below may 
5da0: 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20  shrink the.   * 
5db0: 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74  p->aOp[] array t
5dc0: 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66  o save memory if
5dd0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20   called when in 
5de0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a  VDBE_MAGIC_RUN .
5df0: 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a     * state..   *
5e00: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
5e10: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
5e20: 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74    /* No instruct
5e30: 69 6f 6e 20 65 76 65 72 20 70 75 73 68 65 73 20  ion ever pushes 
5e40: 6d 6f 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67  more than a sing
5e50: 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20  le element onto 
5e60: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20  the.  ** stack. 
5e70: 20 41 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e   And the stack n
5e80: 65 76 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75  ever grows on su
5e90: 63 63 65 73 73 69 76 65 20 65 78 65 63 75 74 69  ccessive executi
5ea0: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
5eb0: 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74  same loop.  So t
5ec0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
5ed0: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
5ee0: 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  is an upper boun
5ef0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  d.  ** on the ma
5f00: 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74  ximum stack dept
5f10: 68 20 72 65 71 75 69 72 65 64 2e 20 20 28 41 64  h required.  (Ad
5f20: 64 65 64 20 6c 61 74 65 72 3a 29 20 20 54 68 65  ded later:)  The
5f30: 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56  .  ** resolveP2V
5f40: 61 6c 75 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d  alues() call com
5f50: 70 75 74 65 73 20 61 20 74 69 67 68 74 65 72 20  putes a tighter 
5f60: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  upper bound on t
5f70: 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 73 69  he.  ** stack si
5f80: 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c  ze..  **.  ** Al
5f90: 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65  location all the
5fa0: 20 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20   stack space we 
5fb0: 77 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a  will ever need..
5fc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53    */.  if( p->aS
5fd0: 74 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69  tack==0 ){.    i
5fe0: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f  nt nArg;       /
5ff0: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
6000: 20 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20   of args passed 
6010: 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69  to a user functi
6020: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
6030: 53 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61  Stack;     /* Ma
6040: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
6050: 73 74 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65  stack entries re
6060: 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65  quired */.    re
6070: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
6080: 20 26 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29   &nArg, &nStack)
6090: 3b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  ;.    resizeOpAr
60a0: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ray(p, p->nOp);.
60b0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72      assert( nVar
60c0: 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
60d0: 74 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70  t( nStack<p->nOp
60e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78   );.    if( isEx
60f0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 6e  plain ){.      n
6100: 53 74 61 63 6b 20 3d 20 31 30 3b 0a 20 20 20 20  Stack = 10;.    
6110: 7d 0a 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 20  }.    p->aStack 
6120: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6130: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
6140: 20 20 6e 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28    nStack*sizeof(
6150: 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20 20 20  p->aStack[0])   
6160: 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20   /* aStack */.  
6170: 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f      + nArg*sizeo
6180: 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20  f(Mem*)         
6190: 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f       /* apArg */
61a0: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
61b0: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
61c0: 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20          /* aVar 
61d0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
61e0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20  sizeof(char*)   
61f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56            /* azV
6200: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d  ar */.      + nM
6210: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  em*sizeof(Mem)  
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6230: 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aMem */.      + 
6240: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43  nCursor*sizeof(C
6250: 75 72 73 6f 72 2a 29 20 20 20 20 20 20 20 20 2f  ursor*)        /
6260: 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29  * apCsr */.    )
6270: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
6280: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6290: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26       p->aMem = &
62a0: 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b  p->aStack[nStack
62b0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  ];.      p->nMem
62c0: 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70   = nMem;.      p
62d0: 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65  ->aVar = &p->aMe
62e0: 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70  m[nMem];.      p
62f0: 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20  ->nVar = nVar;. 
6300: 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20       p->okVar = 
6310: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  0;.      p->apAr
6320: 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61  g = (Mem**)&p->a
6330: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
6340: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61   p->azVar = (cha
6350: 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41  r**)&p->apArg[nA
6360: 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  rg];.      p->ap
6370: 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29  Csr = (Cursor**)
6380: 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b  &p->azVar[nVar];
6390: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  .      p->nCurso
63a0: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20  r = nCursor;.   
63b0: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
63c0: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
63d0: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
63e0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
63f0: 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e         p->aVar[n
6400: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
6410: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30   }.      for(n=0
6420: 3b 20 6e 3c 6e 53 74 61 63 6b 3b 20 6e 2b 2b 29  ; n<nStack; n++)
6430: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 74  {.        p->aSt
6440: 61 63 6b 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  ack[n].db = db;.
6450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6460: 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70  }.  for(n=0; n<p
6470: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
6480: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
6490: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
64a0: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
64b0: 20 3d 20 64 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d   = db;.  }..  p-
64c0: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
64d0: 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20  ck[-1];.  p->pc 
64e0: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
64f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
6500: 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20  uniqueCnt = 0;. 
6510: 20 70 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20   p->returnDepth 
6520: 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  = 0;.  p->errorA
6530: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
6540: 3b 0a 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20  ;.  p->popStack 
6550: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
6560: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
6570: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
6580: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
6590: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
65a0: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
65b0: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
65c0: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
65d0: 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61  ;.  p->openedSta
65e0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64  tement = 0;.#ifd
65f0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
6600: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
6610: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
6620: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
6630: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
6640: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
6650: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
6660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6670: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
6680: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
6690: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
66a0: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
66b0: 74 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73  t cursor happens
66c0: 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  .** to hold..*/.
66d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
66e0: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
66f0: 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29  *p, Cursor *pCx)
6700: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
6710: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
6720: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75  }.  if( pCx->pCu
6730: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
6740: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
6750: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
6760: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  );.  }.  if( pCx
6770: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
6780: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
6790: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69  Cx->pBt);.  }.#i
67a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
67b0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
67c0: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
67d0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
67e0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
67f0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
6800: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
6810: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
6820: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
6830: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
6840: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
6850: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
6860: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
6870: 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d  f(p->db);.    pM
6880: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
6890: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
68a0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
68b0: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69  p->db);.    p->i
68c0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
68d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
68e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e  lite3_free(pCx->
68f0: 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  pData);.  sqlite
6900: 33 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70  3_free(pCx->aTyp
6910: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
6920: 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(pCx);.}../*.*
6930: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
6940: 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72 20 56  ors except for V
6950: 54 61 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  Tab cursors that
6960: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
6970: 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  * in use..*/.sta
6980: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
6990: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
69a0: 74 69 76 65 56 74 61 62 73 28 56 64 62 65 20 2a  tiveVtabs(Vdbe *
69b0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
69c0: 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29  f( p->apCsr==0 )
69d0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
69e0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
69f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73  ; i++){.    Curs
6a00: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
6a10: 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  r[i];.    if( pC
6a20: 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d   && (!p->inVtabM
6a30: 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56  ethod || !pC->pV
6a40: 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  tabCursor) ){.  
6a50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
6a60: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
6a70: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
6a80: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
6a90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
6aa0: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
6ab0: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
6ac0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ad0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
6ae0: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
6af0: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
6b00: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
6b10: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
6b20: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
6b30: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
6b40: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
6b50: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
6b60: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
6b70: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
6b80: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
6b90: 20 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29   if( p->aStack )
6ba0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
6bb0: 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c  Array(p->aStack,
6bc0: 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20   1 + (p->pTos - 
6bd0: 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20  p->aStack));.   
6be0: 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61   p->pTos = &p->a
6bf0: 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20  Stack[-1];.  }. 
6c00: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
6c10: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
6c20: 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  s(p);.  releaseM
6c30: 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
6c40: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c   p->nMem);.  sql
6c50: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
6c60: 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20  r(&p->sFifo);.  
6c70: 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  if( p->contextSt
6c80: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ack ){.    for(i
6c90: 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74  =0; i<p->context
6ca0: 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a  StackTop; i++){.
6cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6cc0: 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63  eFifoClear(&p->c
6cd0: 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73  ontextStack[i].s
6ce0: 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Fifo);.    }.   
6cf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
6d00: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a  >contextStack);.
6d10: 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74    }.  p->context
6d20: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  Stack = 0;.  p->
6d30: 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74  contextStackDept
6d40: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  h = 0;.  p->cont
6d50: 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b  extStackTop = 0;
6d60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6d70: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
6d80: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
6d90: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
6da0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
6db0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
6dc0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
6dd0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
6de0: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
6df0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
6e00: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
6e10: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
6e20: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
6e30: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
6e40: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
6e50: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
6e60: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
6e70: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
6e80: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
6e90: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
6ea0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
6eb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6ec0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
6ed0: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
6ee0: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
6ef0: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
6f00: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
6f10: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
6f20: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
6f30: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
6f40: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c  te3_free(p->aCol
6f50: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
6f60: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
6f70: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
6f80: 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b  mn = nResColumn;
6f90: 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
6fa0: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
6fb0: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
6fc0: 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20 73 69 7a  cZero(p->db, siz
6fd0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
6fe0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
6ff0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
7000: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
7010: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
7020: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
7030: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
7040: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
7050: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
7060: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7070: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
7080: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
7090: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
70a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
70b0: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
70c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
70d0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
70e0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
70f0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
7100: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
7110: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
7120: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
7130: 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49  * If N==P3_STATI
7140: 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  C  it means that
7150: 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e   zName is a poin
7160: 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e  ter to a constan
7170: 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69  t static.** stri
7180: 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75  ng and we can ju
7190: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
71a0: 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50 33  ter. If it is P3
71b0: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a  _DYNAMIC, then .
71c0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
71d0: 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
71e0: 69 74 65 33 5f 66 72 65 65 28 29 20 77 68 65 6e  ite3_free() when
71f0: 20 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e   the vdbe is fin
7200: 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74  ished with.** it
7210: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62  . Otherwise, N b
7220: 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72  ytes of zName ar
7230: 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74  e copied..*/.int
7240: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
7250: 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20  olName(Vdbe *p, 
7260: 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 76 61 72  int idx, int var
7270: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
7280: 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ame, int N){.  i
7290: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
72a0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
72b0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
72c0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
72d0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
72e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
72f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
7300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
7310: 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  M;.  assert( p->
7320: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
7330: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
7340: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
7350: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
7360: 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44  );.  if( N==P3_D
7370: 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f  YNAMIC || N==P3_
7380: 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63  STATIC ){.    rc
7390: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
73a0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
73b0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
73c0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
73d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73  _STATIC);.  }els
73e0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
73f0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
7400: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
7410: 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , N, SQLITE_UTF8
7420: 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
7430: 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  T);.  }.  if( rc
7440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e  ==SQLITE_OK && N
7450: 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  ==P3_DYNAMIC ){.
7460: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
7470: 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d  ags = (pColName-
7480: 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61  >flags&(~MEM_Sta
7490: 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20  tic))|MEM_Dyn;. 
74a0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65     pColName->xDe
74b0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
74c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
74d0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
74e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
74f0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
7500: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
7510: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
7520: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
7530: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
7540: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
7550: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
7560: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
7570: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
7580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
7590: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
75a0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
75b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
75c0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
75d0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
75e0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
75f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
7600: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
7610: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
7620: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
7630: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
7640: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
7650: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7660: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
7670: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f   = 0;..  /* Befo
7680: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
7690: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
76a0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
76b0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
76c0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
76d0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
76e0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
76f0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
7700: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
7710: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
7720: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
7730: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
7740: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
7750: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
7760: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
7770: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
7780: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
7790: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
77a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
77b0: 74 61 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b  tabSync(db, rc);
77c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
77d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
77e0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
77f0: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
7800: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
7810: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
7820: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
7830: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
7840: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
7850: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
7860: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
7870: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
7880: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
7890: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
78a0: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
78b0: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
78c0: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
78d0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
78e0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
78f0: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
7900: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
7910: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
7920: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
7930: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
7940: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
7950: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
7960: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
7970: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
7980: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
7990: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
79a0: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
79b0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
79c0: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
79d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
79e0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
79f0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7a00: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
7a10: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
7a20: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
7a30: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
7a40: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
7a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
7a60: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
7a70: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
7a80: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
7a90: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  mitArg);.    sql
7aa0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
7ab0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
7ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7ad0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
7ae0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7af0: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
7b00: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
7b10: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
7b20: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
7b30: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
7b40: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
7b50: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
7b60: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
7b70: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
7b80: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
7b90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
7ba0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
7bb0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
7bc0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
7bd0: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
7be0: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
7bf0: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
7c00: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
7c10: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  .  In that case 
7c20: 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73  we do.  ** not s
7c30: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
7c40: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
7c50: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d  , so use the sim
7c60: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20  ple case then.  
7c70: 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ** too..  */.  i
7c80: 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c  f( 0==strlen(sql
7c90: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
7ca0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
7cb0: 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c  pBt)) || nTrans<
7cc0: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =1 ){.    for(i=
7cd0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
7ce0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
7cf0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
7d00: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
7d10: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
7d20: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
7d30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
7d40: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
7d50: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
7d60: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
7d70: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
7d80: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
7d90: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
7da0: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
7db0: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
7dc0: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
7dd0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
7de0: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
7df0: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
7e00: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
7e10: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
7e20: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
7e30: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
7e40: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
7e50: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
7e60: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
7e70: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
7e80: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
7e90: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
7ea0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
7eb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7ec0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7ed0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
7ee0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
7ef0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
7f00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
7f10: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
7f20: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
7f30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7f40: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7f50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f60: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
7f70: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
7f80: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
7f90: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
7fa0: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
7fb0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7fc0: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
7fd0: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
7fe0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7ff0: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
8000: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
8010: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
8020: 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69  tomicly..  */.#i
8030: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8040: 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
8050: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
8060: 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
8070: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  s;.    int needS
8080: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ync = 0;.    cha
8090: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
80a0: 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
80b0: 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
80c0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
80d0: 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
80e0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
80f0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
8100: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
8110: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
8120: 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
8130: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
8140: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
8150: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
8160: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
8170: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
8180: 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73   random;.      s
8190: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
81a0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
81b0: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
81c0: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
81d0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
81e0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
81f0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
8200: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
8210: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
8220: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
8230: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
8240: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8250: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8260: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
8270: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
8280: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
8290: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
82a0: 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  S) );..    /* Op
82b0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
82c0: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63  urnal. */.    rc
82d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
82e0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
82f0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
8300: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8310: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
8320: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
8330: 45 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  E|.        SQLIT
8340: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
8350: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
8360: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
8370: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
8380: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8390: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
83a0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
83b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
83c0: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
83d0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
83e0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
83f0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
8400: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
8410: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
8420: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
8430: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8440: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
8450: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
8460: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8470: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
8480: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
8490: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
84a0: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
84b0: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
84c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
84d0: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
84e0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
84f0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
8500: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
8510: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
8520: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8530: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
8540: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8550: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8560: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
8570: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
8580: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
8590: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
85a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
85b0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
85c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
85d0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
85e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
85f0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
8600: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
8610: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
8620: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
8630: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
8640: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
8650: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
8660: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
8670: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
8680: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
8690: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
86a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
86b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
86c0: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
86d0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c  strlen(zFile)+1,
86e0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
86f0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c    offset += strl
8700: 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  en(zFile)+1;.   
8710: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8730: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8740: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
8750: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8760: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
8770: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
8780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8790: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
87a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
87b0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
87c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
87d0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
87e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
87f0: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
8800: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
8810: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
8820: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
8830: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
8840: 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d  .    zMainFile =
8850: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8860: 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  Dirname(db->aDb[
8870: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  0].pBt);.    if(
8880: 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20   (needSync .    
8890: 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74 65 33   && (0==(sqlite3
88a0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
88b0: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
88c0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
88d0: 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20 20 20  QUENTIAL)).     
88e0: 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73  && (rc=sqlite3Os
88f0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
8900: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
8910: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  ))!=SQLITE_OK) )
8920: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
8930: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
8940: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8950: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
8960: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
8970: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8980: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
8990: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
89a0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
89b0: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
89c0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
89d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
89e0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
89f0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
8a00: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
8a10: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
8a20: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
8a30: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
8a40: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
8a50: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
8a60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8a70: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
8a80: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
8a90: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
8aa0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
8ab0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
8ac0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
8ad0: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
8ae0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
8af0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
8b00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8b10: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
8b20: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
8b30: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
8b40: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
8b50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8b60: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
8b70: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
8b80: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
8b90: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
8ba0: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  re occured..    
8bb0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
8bc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8bd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8be0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
8bf0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
8c00: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
8c10: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
8c20: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
8c30: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
8c40: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
8c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8c60: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
8c70: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
8c80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8c90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
8ca0: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8cb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8cc0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
8cd0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
8ce0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8cf0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
8d00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
8d10: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
8d20: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
8d30: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
8d40: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
8d50: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
8d60: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
8d70: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
8d80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
8d90: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
8da0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
8db0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
8dc0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
8dd0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
8de0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
8df0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8e00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
8e10: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
8e20: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
8e30: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
8e40: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
8e50: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
8e60: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
8e70: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
8e80: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
8e90: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
8ea0: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
8eb0: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
8ec0: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
8ed0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
8ee0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
8ef0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
8f00: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
8f10: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
8f20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
8f30: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
8f40: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
8f50: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
8f60: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
8f70: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
8f80: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
8f90: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
8fa0: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
8fb0: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
8fc0: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
8fd0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
8fe0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8ff0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
9000: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
9010: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
9020: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
9030: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9040: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9050: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9060: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e    }.    }.    en
9070: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
9080: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
9090: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
90a0: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
90b0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
90c0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
90d0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
90e0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
90f0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
9100: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
9110: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
9120: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
9130: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
9140: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
9150: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
9160: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
9170: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
9180: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
9190: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
91a0: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
91b0: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
91c0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
91d0: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
91e0: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
91f0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
9200: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
9210: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
9220: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
9230: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
9240: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
9250: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
9260: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
9270: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
9280: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9290: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
92a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
92b0: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
92c0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
92d0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
92e0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
92f0: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
9300: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  veVdbeCnt );.}.#
9310: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
9320: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
9330: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
9340: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
9350: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
9360: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
9370: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
9380: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
9390: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
93a0: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
93b0: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
93c0: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
93d0: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
93e0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
93f0: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
9400: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
9410: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
9420: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
9430: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
9440: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
9450: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
9460: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
9470: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
9480: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
9490: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
94a0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
94b0: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
94c0: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
94d0: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
94e0: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
94f0: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
9500: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
9510: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
9520: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
9530: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
9540: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
9550: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
9560: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
9570: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
9580: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
9590: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
95a0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
95b0: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
95c0: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
95d0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
95e0: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
95f0: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76  used again..*/.v
9600: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75  oid invalidateCu
9610: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
9620: 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64  trees(sqlite3 *d
9630: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  b){.  int i;.  f
9640: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
9650: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
9660: 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b  ee *p = db->aDb[
9670: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
9680: 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  p && sqlite3Btre
9690: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
96a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
96b0: 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
96c0: 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  s(p, SQLITE_ABOR
96d0: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
96e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
96f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
9700: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
9710: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
9720: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
9730: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
9740: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
9750: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
9760: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
9770: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
9780: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
9790: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
97a0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
97b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
97c0: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
97d0: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
97e0: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
97f0: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
9800: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
9810: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
9820: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
9830: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
9840: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
9850: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
9860: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
9870: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
9880: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
9890: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
98a0: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
98b0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
98c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
98d0: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
98e0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
98f0: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
9900: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
9910: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
9920: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
9930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
9940: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
9950: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9960: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
9970: 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
9980: 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b  Btree *pBt) = 0;
9990: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
99a0: 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74   call on each bt
99b0: 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  ree backend */. 
99c0: 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72   int isSpecialEr
99d0: 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
99e0: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
99f0: 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  f SQLITE_NOMEM o
9a00: 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a  r IOERR */..  /*
9a10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
9a20: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
9a30: 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
9a40: 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
9a50: 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
9a60: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
9a70: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
9a80: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
9a90: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
9aa0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
9ab0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
9ac0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
9ad0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
9ae0: 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
9af0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9b00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
9b10: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
9b20: 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
9b30: 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
9b40: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9b50: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
9b60: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
9b70: 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
9b80: 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
9b90: 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
9ba0: 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
9bb0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
9bc0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
9bd0: 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
9be0: 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
9bf0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
9c00: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
9c10: 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
9c20: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
9c30: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
9c40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9c50: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
9c60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9c70: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
9c80: 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74  rsExceptActiveVt
9c90: 61 62 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  abs(p);.  if( p-
9ca0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
9cb0: 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
9cc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9cd0: 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
9ce0: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
9cf0: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
9d00: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
9d10: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
9d20: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
9d30: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
9d40: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
9d50: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
9d60: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
9d70: 72 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  rc */..    /* Lo
9d80: 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
9d90: 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
9da0: 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
9db0: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
9dc0: 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65  yEnter(&p->aMute
9dd0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  x);..    /* Chec
9de0: 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
9df0: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
9e00: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
9e10: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
9e20: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
9e30: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
9e40: 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
9e50: 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
9e70: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
9e80: 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
9e90: 49 54 45 5f 46 55 4c 4c 20 3b 0a 20 20 20 20 69  ITE_FULL ;.    i
9ea0: 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
9eb0: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  r ){.      /* Th
9ec0: 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61  is loop does sta
9ed0: 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20  tic analysis of 
9ee0: 74 68 65 20 71 75 65 72 79 20 74 6f 20 73 65 65  the query to see
9ef0: 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20   which of the.  
9f00: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
9f10: 20 74 68 72 65 65 20 63 61 74 65 67 6f 72 69 65   three categorie
9f20: 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a  s it falls into:
9f30: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
9f40: 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79  **     Read-only
9f50: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75  .      **     Qu
9f60: 65 72 79 20 77 69 74 68 20 73 74 61 74 65 6d 65  ery with stateme
9f70: 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt journal.     
9f80: 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77 69   **     Query wi
9f90: 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20  thout statement 
9fa0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
9fb0: 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75  .      ** We cou
9fc0: 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ld do something 
9fd0: 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61  more elegant tha
9fe0: 6e 20 74 68 69 73 20 73 74 61 74 69 63 20 61 6e  n this static an
9ff0: 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20  alysis (i.e..   
a000: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
a010: 74 79 70 65 20 6f 66 20 71 75 65 72 79 20 61 73  type of query as
a020: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d   part of the com
a030: 70 6c 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c  pliation phase),
a040: 20 62 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68   but .      ** h
a050: 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29  andling malloc()
a060: 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69   or IO failure i
a070: 73 20 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75  s a fairly obscu
a080: 72 65 20 65 64 67 65 20 63 61 73 65 20 73 6f 20  re edge case so 
a090: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
a0a0: 73 20 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65  s probably easie
a0b0: 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62  r. Todo: Might b
a0c0: 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  e an opportunity
a0d0: 20 74 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20   to reduce .    
a0e0: 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61    ** code size a
a0f0: 20 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75   very small amou
a100: 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20  nt though....   
a110: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
a120: 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  notReadOnly = 0;
a130: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53 74 61  .      int isSta
a140: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
a150: 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70 20    assert(p->aOp 
a160: 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20  || p->nOp==0);. 
a170: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a180: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20  p->nOp; i++){ . 
a190: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
a1a0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20  ->aOp[i].opcode 
a1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
a1c0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
a1d0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f  :.            no
a1e0: 74 52 65 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e  tReadOnly |= p->
a1f0: 61 4f 70 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20  aOp[i].p2;.     
a200: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a210: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
a220: 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20  Statement:.     
a230: 20 20 20 20 20 20 20 69 73 53 74 61 74 65 6d 65         isStateme
a240: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
a250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a260: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
a270: 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
a280: 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
a290: 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64  -only, we need d
a2a0: 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74  o no rollback at
a2b0: 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c   all. Otherwise,
a2c0: 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65  .      ** procee
a2d0: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
a2e0: 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
a2f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
a300: 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  notReadOnly || m
a310: 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
a320: 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
a330: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a340: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
a350: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
a360: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
a370: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a380: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
a390: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
a3a0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
a3b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20       } else if( 
a3c0: 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
a3d0: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
a3e0: 45 5f 46 55 4c 4c 29 20 26 26 20 69 73 53 74 61  E_FULL) && isSta
a3f0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
a400: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
a410: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a420: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
a430: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
a440: 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
a450: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
a460: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
a470: 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
a480: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
a490: 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
a4a0: 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
a4b0: 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
a4c0: 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
a4d0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
a4e0: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
a4f0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
a500: 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
a510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a520: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
a530: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
a540: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
a550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a560: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
a570: 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
a580: 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
a590: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
a5a0: 6e 6c 79 20 61 63 74 69 76 65 20 76 64 62 65 2c  nly active vdbe,
a5b0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   then.    ** we 
a5c0: 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
a5d0: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
a5e0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
a5f0: 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
a600: 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
a610: 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
a620: 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
a630: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
a640: 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
a650: 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
a660: 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
a670: 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
a680: 6d 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76  mit && db->activ
a690: 65 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20  eVdbeCnt==1 ){. 
a6a0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
a6b0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
a6c0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
a6d0: 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
a6e0: 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
a6f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
a700: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
a710: 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64  true, and the vd
a720: 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a  be program was .
a730: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65          ** succe
a740: 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20  ssful or hit an 
a750: 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
a760: 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  aint. This means
a770: 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
a780: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
a790: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
a7a0: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76        int rc = v
a7b0: 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  dbeCommit(db);. 
a7c0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
a7d0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
a7e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
a7f0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
a800: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
a810: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a820: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
a830: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a840: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a850: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
a860: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
a870: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
a880: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
a890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a8a0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
a8b0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
a8c0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
a8d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a8e0: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
a8f0: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
a900: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
a910: 28 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20  ( !xFunc ){.    
a920: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a930: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
a940: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
a950: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
a960: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
a970: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a980: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a990: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b  BtreeCommitStmt;
a9a0: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
a9b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
a9c0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
a9d0: 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
a9e0: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
a9f0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
aa00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aa10: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
aa20: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
aa30: 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
aa40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
aa50: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
aa60: 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
aa70: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
aa80: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
aa90: 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f  * If xFunc is no
aaa0: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
aab0: 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65  is one of sqlite
aac0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
aad0: 6d 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  mt or.    ** sql
aae0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
aaf0: 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63  tmt. Call it onc
ab00: 65 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e  e on each backen
ab10: 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
ab20: 63 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64  ccurs.    ** and
ab30: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
ab40: 20 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45   is still SQLITE
ab50: 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74  _OK, set the ret
ab60: 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20  urn code to the 
ab70: 6e 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  new.    ** error
ab80: 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
ab90: 20 20 20 61 73 73 65 72 74 28 21 78 46 75 6e 63     assert(!xFunc
aba0: 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d   ||.      xFunc=
abb0: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d  =sqlite3BtreeCom
abc0: 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20  mitStmt ||.     
abd0: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
abe0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
abf0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28  .    );.    for(
ac00: 69 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c  i=0; xFunc && i<
ac10: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
ac20: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
ac30: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ac40: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ac50: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ac60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 78  {.        rc = x
ac70: 46 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20  Func(pBt);.     
ac80: 20 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d     if( rc && (p-
ac90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
aca0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
acb0: 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20  CONSTRAINT) ){. 
acc0: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
acd0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
ace0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
acf0: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b  &p->zErrMsg, 0);
ad00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ad10: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
ad20: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
ad30: 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
ad40: 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74   or DELETE and t
ad50: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  he statement was
ad60: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20   committed, .   
ad70: 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e   ** set the chan
ad80: 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge counter. .   
ad90: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
ada0: 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d  hangeCntOn && p-
adb0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
adc0: 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46  if( !xFunc || xF
add0: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
ade0: 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20  eCommitStmt ){. 
adf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae00: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
ae10: 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
ae20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
ae40: 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
ae50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ae60: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
ae70: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
ae80: 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ollback or commi
ae90: 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61  t any schema cha
aea0: 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72  nges that occurr
aeb0: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
aec0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
aed0: 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  && db->flags&SQL
aee0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
aef0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
af00: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
af10: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
af20: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
af30: 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c  (db->flags | SQL
af40: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
af50: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
af60: 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
af70: 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
af80: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
af90: 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
afa0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  x);.  }..  /* We
afb0: 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
afc0: 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
afd0: 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
afe0: 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
aff0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
b000: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74  0 ){.    db->act
b010: 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iveVdbeCnt--;.  
b020: 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
b030: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
b040: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
b050: 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
b060: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
b070: 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
b080: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
b090: 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
b0a0: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
b0b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b0c0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  OK;.}.../*.** Ea
b0d0: 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
b0e0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
b0f0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
b100: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
b110: 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
b120: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
b130: 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
b140: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
b150: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b160: 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
b170: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
b180: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
b190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
b1a0: 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
b1b0: 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
b1c0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
b1d0: 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
b1e0: 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
b1f0: 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
b200: 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
b210: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
b220: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
b230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b240: 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
b250: 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
b260: 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
b270: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
b280: 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
b290: 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
b2a0: 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
b2b0: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
b2c0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
b2d0: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
b2e0: 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
b2f0: 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
b300: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
b310: 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
b320: 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
b330: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
b340: 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
b350: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
b360: 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
b370: 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
b380: 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
b390: 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
b3a0: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
b3b0: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
b3c0: 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
b3d0: 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
b3e0: 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
b3f0: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20  3SafetyOn(db);. 
b400: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
b410: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 61  (p);.  sqlite3Sa
b420: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20  fetyOff(db);..  
b430: 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
b440: 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
b450: 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
b460: 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
b470: 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
b480: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
b490: 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
b4a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
b4b0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
b4c0: 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
b4d0: 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
b4e0: 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
b4f0: 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
b500: 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
b510: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
b520: 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
b530: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
b540: 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
b550: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
b560: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
b570: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
b580: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
b590: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
b5a0: 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e  (db->pErr,-1,p->
b5b0: 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55  zErrMsg,SQLITE_U
b5c0: 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72 65 65  TF8,sqlite3_free
b5d0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
b5e0: 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
b5f0: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
b600: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
b610: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
b620: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
b630: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
b640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b650: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
b660: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
b670: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
b680: 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
b690: 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
b6a0: 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
b6b0: 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
b6c0: 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
b6d0: 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
b6e0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
b6f0: 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
b700: 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
b710: 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
b720: 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
b730: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
b740: 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
b750: 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
b760: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
b770: 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
b780: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
b790: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
b7a0: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
b7b0: 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
b7c0: 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
b7d0: 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
b7e0: 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
b7f0: 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  E run..  */.  as
b800: 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70  sert( p->pTos<&p
b810: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30  ->aStack[p->pc<0
b820: 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d  ?0:p->pc] || !p-
b830: 3e 61 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65  >aStack );.#ifde
b840: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
b850: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
b860: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
b870: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
b880: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
b890: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
b8a0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
b8b0: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
b8c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b8d0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
b8e0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
b8f0: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
b900: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
b910: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
b920: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
b930: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
b940: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
b950: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
b960: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
b970: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
b980: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
b990: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
b9a0: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
b9b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
b9c0: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
b9d0: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
b9e0: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
b9f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
ba00: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
ba10: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
ba20: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
ba30: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
ba40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
ba50: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
ba60: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
ba70: 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d  ;.  p->aborted =
ba80: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   0;.  return p->
ba90: 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
baa0: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
bab0: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
bac0: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
bad0: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
bae0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
baf0: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
bb00: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
bb10: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
bb20: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
bb30: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
bb40: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
bb50: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
bb60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bb70: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
bb80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
bb90: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
bba0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
bbb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bbc0: 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
bbd0: 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
bbe0: 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
bbf0: 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  =rc );.  }else i
bc00: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
bc10: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
bc20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bc30: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
bc40: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
bc50: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
bc60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
bc70: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
bc80: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
bc90: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
bca0: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
bcb0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
bcc0: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
bcd0: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
bce0: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
bcf0: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
bd00: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
bd10: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
bd20: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
bd30: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
bd40: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
bd50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bd60: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
bd70: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
bd80: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
bd90: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
bda0: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
bdb0: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
bdc0: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
bdd0: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
bde0: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
bdf0: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
be00: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
be10: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
be20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
be30: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
be40: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
be50: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
be60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
be70: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
be80: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
be90: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
bea0: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
beb0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
bec0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
bed0: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
bee0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61  ) return;.  Clea
bef0: 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  nup(p);.  if( p-
bf00: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
bf10: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
bf20: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
bf30: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
bf40: 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ->db->pVdbe==p )
bf50: 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64  ;.    p->db->pVd
bf60: 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
bf70: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
bf80: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
bf90: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
bfa0: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
bfb0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72  ->aOp ){.    for
bfc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
bfd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a  i++){.      Op *
bfe0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
bff0: 3b 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 70  ;.      freeP3(p
c000: 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d  Op->p3type, pOp-
c010: 3e 70 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p3);.    }.    
c020: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c030: 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  aOp);.  }.  rele
c040: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
c050: 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
c060: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
c070: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  >aLabel);.  sqli
c080: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61  te3_free(p->aSta
c090: 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ck);.  releaseMe
c0a0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
c0b0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
c0c0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
c0d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c0e0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
c0f0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71  ite3_free(p->zSq
c100: 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  l);.  p->magic =
c110: 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
c120: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
c130: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  (p);.}../*.** If
c140: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
c150: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
c160: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
c170: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
c180: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
c190: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
c1a0: 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f   code.  If no Mo
c1b0: 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c  veTo is pending,
c1c0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
c1d0: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e   does nothing an
c1e0: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
c1f0: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
c200: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
c210: 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a  eto(Cursor *p){.
c220: 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
c230: 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
c240: 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
c250: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
c260: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
c270: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
c280: 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
c290: 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
c2a0: 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
c2b0: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
c2c0: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
c2d0: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
c2e0: 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
c2f0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c300: 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72  c;.    *p->pIncr
c310: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Key = 0;.    p->
c320: 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54  lastRowid = keyT
c330: 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61  oInt(p->movetoTa
c340: 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f  rget);.    p->ro
c350: 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73  widIsValid = res
c360: 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ==0;.    if( res
c370: 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
c380: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
c390: 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  t(p->pCursor, &r
c3a0: 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
c3b0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
c3c0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
c3d0: 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
c3e0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
c3f0: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
c400: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
c410: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
c420: 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
c430: 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65  _STALE;.  }.  re
c440: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c450: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
c460: 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
c470: 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
c480: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
c490: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
c4a0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
c4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c4c0: 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69  alRead().** sqli
c4d0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
c4e0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
c4f0: 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a  eSerialWrite().*
c500: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
c510: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
c520: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
c530: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
c540: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
c550: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
c560: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
c570: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
c580: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
c590: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
c5a0: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
c5b0: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
c5c0: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
c5d0: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
c5e0: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
c5f0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
c600: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
c610: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
c620: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
c630: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
c640: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
c650: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
c660: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
c670: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
c680: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
c690: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
c6a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
c6b0: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
c6c0: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
c6d0: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
c6e0: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
c6f0: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
c700: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
c710: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
c720: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
c730: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
c740: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
c750: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
c760: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
c770: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
c780: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
c790: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
c7a0: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
c7b0: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
c7e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
c7f0: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c810: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
c820: 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c840: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
c850: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
c860: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
c870: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
c880: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
c890: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
c8c0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
c8d0: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
c8f0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
c900: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
c910: 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
c920: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
c930: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c940: 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
c970: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
c980: 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
c990: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
c9a0: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
c9b0: 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
c9e0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
c9f0: 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
ca20: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
ca30: 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
ca60: 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
ca70: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
ca80: 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
ca90: 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
caa0: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
cab0: 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
cac0: 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
cad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
cae0: 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
caf0: 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
cb00: 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
cb10: 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
cb20: 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
cb30: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
cb40: 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
cb50: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
cb60: 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
cb70: 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
cb80: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
cb90: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
cba0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
cbb0: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
cbc0: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
cbd0: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
cbe0: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
cbf0: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
cc00: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
cc10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
cc20: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
cc30: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
cc40: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
cc50: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
cc60: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
cc70: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
cc80: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31   ((((i64)0x00001
cc90: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
cca0: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
ccb0: 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
ccc0: 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d     if( file_form
ccd0: 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d  at>=4 && (i&1)==
cce0: 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  i ){.      retur
ccf0: 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20  n 8+i;.    }.   
cd00: 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20   u = i<0 ? -i : 
cd10: 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32  i;.    if( u<=12
cd20: 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  7 ) return 1;.  
cd30: 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
cd40: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
cd50: 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
cd60: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
cd70: 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
cd80: 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
cd90: 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
cda0: 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
cdb0: 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
cdc0: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
cdd0: 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
cde0: 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
cdf0: 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  t( flags&(MEM_St
ce00: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
ce10: 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20   n = pMem->n;.  
ce20: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
ce30: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
ce40: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a   pMem->u.i;.  }.
ce50: 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
ce60: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
ce70: 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
ce80: 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
ce90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cea0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
ceb0: 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
cec0: 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
ced0: 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
cee0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cef0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
cf00: 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
cf10: 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
cf20: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
cf30: 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
cf40: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
cf50: 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
cf60: 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
cf70: 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
cf80: 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
cf90: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
cfa0: 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
cfb0: 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
cfc0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
cfd0: 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
cfe0: 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
cff0: 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
d000: 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
d010: 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
d020: 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
d030: 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
d040: 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
d050: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
d060: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
d070: 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
d080: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
d090: 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
d0a0: 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
d0b0: 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
d0c0: 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
d0d0: 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
d0e0: 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
d0f0: 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
d100: 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
d110: 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
d120: 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
d130: 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
d140: 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
d150: 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
d160: 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
d170: 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
d180: 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
d190: 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
d1a0: 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
d1b0: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
d1c0: 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
d1d0: 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
d1e0: 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
d1f0: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
d200: 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
d210: 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
d220: 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
d230: 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
d240: 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
d250: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
d260: 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
d270: 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
d280: 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
d290: 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
d2a0: 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
d2b0: 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
d2c0: 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
d2d0: 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
d2e0: 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
d2f0: 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
d300: 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
d310: 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
d320: 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
d330: 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
d340: 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
d350: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
d360: 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
d370: 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
d380: 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
d390: 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
d3a0: 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
d3b0: 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
d3c0: 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
d3d0: 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
d3e0: 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
d3f0: 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
d400: 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
d410: 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
d420: 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
d430: 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
d440: 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
d450: 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
d460: 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
d470: 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
d480: 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
d490: 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
d4a0: 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
d4b0: 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
d4c0: 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
d4d0: 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
d4e0: 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
d4f0: 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
d500: 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
d510: 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
d520: 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
d530: 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
d540: 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
d550: 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
d560: 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
d570: 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
d580: 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
d590: 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
d5a0: 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
d5b0: 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
d5c0: 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
d5d0: 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
d5e0: 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
d5f0: 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
d600: 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
d610: 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
d620: 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
d630: 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
d640: 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
d650: 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
d660: 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
d670: 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
d680: 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
d690: 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
d6a0: 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
d6b0: 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
d6c0: 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
d6d0: 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
d6e0: 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
d6f0: 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
d700: 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
d710: 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
d720: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
d730: 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
d740: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
d750: 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
d760: 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
d770: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
d780: 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
d790: 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
d7a0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
d7b0: 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
d7c0: 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
d7d0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
d7e0: 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
d7f0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
d800: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
d810: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
d820: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
d830: 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
d840: 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
d850: 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
d860: 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
d870: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
d880: 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
d890: 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
d8a0: 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
d8b0: 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
d8c0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
d8d0: 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
d8e0: 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
d8f0: 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
d900: 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
d910: 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
d920: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
d930: 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
d940: 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
d950: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
d960: 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
d970: 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
d980: 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
d990: 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
d9a0: 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
d9b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
d9c0: 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
d9d0: 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
d9e0: 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
d9f0: 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
da00: 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
da10: 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
da20: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
da30: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
da40: 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
da50: 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
da60: 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
da70: 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
da80: 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
da90: 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
daa0: 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
dab0: 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
dac0: 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
dad0: 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  ]..*/ .int sqlit
dae0: 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
daf0: 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
db00: 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
db10: 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
db20: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
db30: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
db40: 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
db50: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
db60: 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  int len;..  /* I
db70: 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
db80: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
db90: 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
dba0: 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
dbb0: 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69  u64 v;.    int i
dbc0: 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
dbd0: 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
dbe0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
dbf0: 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
dc00: 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
dc10: 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
dc20: 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
dc30: 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
dc40: 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
dc50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
dc60: 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
dc70: 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
dc80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
dc90: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
dca0: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
dcb0: 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29  ert( len<=nBuf )
dcc0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
dcd0: 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
dce0: 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20   = (v&0xFF);.   
dcf0: 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
dd00: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
dd10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
dd20: 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
dd30: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
dd40: 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
dd50: 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
dd60: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
dd70: 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69  _Zero)?pMem->u.i
dd80: 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
dd90: 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   == sqlite3VdbeS
dda0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
ddb0: 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
ddc0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
ddd0: 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65  <=nBuf );.    le
dde0: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
ddf0: 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
de00: 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
de10: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
de20: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
de30: 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d      len += pMem-
de40: 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20  >u.i;.      if( 
de50: 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20  len>nBuf ){.    
de60: 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a      len = nBuf;.
de70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
de80: 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
de90: 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
dea0: 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
deb0: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
dec0: 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
ded0: 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
dee0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
def0: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
df00: 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
df10: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
df20: 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
df30: 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
df40: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
df50: 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
df60: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
df70: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
df80: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
df90: 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
dfa0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
dfb0: 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
dfc0: 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
dfd0: 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
dfe0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
dff0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e000: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
e010: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
e020: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
e050: 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
e060: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
e070: 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
e080: 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
e090: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
e0a0: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
e0b0: 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
e0c0: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
e0d0: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
e0e0: 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
e0f0: 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
e100: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
e110: 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
e120: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e130: 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
e140: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
e150: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
e160: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
e170: 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
e180: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e190: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e1a0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
e1b0: 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
e1c0: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e1d0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
e1e0: 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
e1f0: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
e200: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
e210: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e220: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
e230: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
e240: 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
e250: 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
e260: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
e270: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
e280: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
e290: 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
e2a0: 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
e2b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e2c0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e2d0: 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
e2e0: 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
e2f0: 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
e300: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
e310: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
e320: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
e330: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
e340: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
e350: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
e360: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e370: 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
e380: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
e390: 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
e3a0: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
e3b0: 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
e3c0: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
e3d0: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
e3e0: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
e3f0: 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
e400: 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
e410: 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
e420: 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
e430: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
e440: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
e450: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
e460: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e470: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e480: 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
e490: 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
e4a0: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e4b0: 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
e4c0: 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
e4d0: 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
e4e0: 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
e4f0: 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
e500: 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
e510: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e520: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
e530: 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
e540: 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
e550: 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
e560: 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
e570: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
e580: 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
e590: 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
e5a0: 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
e5b0: 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
e5c0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
e5d0: 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
e5e0: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
e5f0: 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
e600: 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
e610: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
e620: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
e630: 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
e640: 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
e650: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e660: 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
e670: 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
e680: 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
e690: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
e6a0: 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
e6b0: 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
e6c0: 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
e6d0: 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
e6e0: 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
e6f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
e700: 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
e710: 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
e720: 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
e730: 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
e740: 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
e750: 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
e760: 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
e770: 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
e780: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
e790: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
e7a0: 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
e7b0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
e7c0: 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
e7d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e7e0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
e7f0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
e800: 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
e810: 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
e820: 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
e830: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
e840: 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
e850: 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
e860: 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
e870: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
e880: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61  >flags = MEM_Rea
e890: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
e8a0: 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
e8b0: 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
e8c0: 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
e8d0: 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
e8e0: 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
e8f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e900: 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
e910: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e920: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e930: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
e940: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
e950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20  {.      int len 
e960: 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
e970: 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
e980: 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
e990: 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
e9a0: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
e9b0: 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
e9c0: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
e9d0: 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
e9e0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e9f0: 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
ea00: 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
ea10: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
ea20: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
ea30: 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
ea40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
ea50: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
ea60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ea70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61  }../*.** The hea
ea80: 64 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20  der of a record 
ea90: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65  consists of a se
eaa0: 71 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d  quence variable-
eab0: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e  length integers.
eac0: 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65  .** These intege
ead0: 72 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c  rs are almost al
eae0: 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61  ways small and a
eaf0: 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20  re encoded as a 
eb00: 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20  single byte..** 
eb10: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
eb20: 63 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74  cro takes advant
eb30: 61 67 65 20 74 68 69 73 20 66 61 63 74 20 74 6f  age this fact to
eb40: 20 70 72 6f 76 69 64 65 20 61 20 66 61 73 74 20   provide a fast 
eb50: 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65  decode.** of the
eb60: 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72   integers in a r
eb70: 65 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49  ecord header.  I
eb80: 74 20 69 73 20 66 61 73 74 65 72 20 66 6f 72 20  t is faster for 
eb90: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a  the common case.
eba0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e 74  ** where the int
ebb0: 65 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65  eger is a single
ebc0: 20 62 79 74 65 2e 20 20 49 74 20 69 73 20 61 20   byte.  It is a 
ebd0: 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68  little slower wh
ebe0: 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65  en the.** intege
ebf0: 72 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  r is two or more
ec00: 20 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65   bytes.  But ove
ec10: 72 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65  rall it is faste
ec20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  r..**.** The fol
ec30: 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
ec40: 6e 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ns are equivalen
ec50: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d  t:.**.**     x =
ec60: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
ec70: 74 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a  t32( A, &B );.**
ec80: 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56  .**     x = GetV
ec90: 61 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a  arint( A, B );.*
eca0: 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74  *.*/.#define Get
ecb0: 56 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42  Varint(A,B)  ((B
ecc0: 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f   = *(A))<=0x7f ?
ecd0: 20 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56   1 : sqlite3GetV
ece0: 61 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a  arint32(A, &B)).
ecf0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ed00: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
ed10: 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
ed20: 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
ed30: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0a  s specified by .
ed40: 2a 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  ** {nKey1, pKey1
ed50: 7d 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b  } and {nKey2, pK
ed60: 65 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20  ey2}, returning 
ed70: 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
ed80: 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
ed90: 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79  integer if {nKey
eda0: 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73  1, pKey1} is les
edb0: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
edc0: 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
edd0: 74 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65  than {nKey2, pKe
ede0: 79 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20  y2}.  Both Key1 
edf0: 61 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65  and Key2 must be
ee00: 20 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a   byte strings.**
ee10: 20 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65   composed by the
ee20: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
ee30: 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
ee40: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
ee50: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
ee60: 72 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72  re(.  void *user
ee70: 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Data,.  int nKey
ee80: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
ee90: 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65  Key1, .  int nKe
eea0: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
eeb0: 70 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e  pKey2.){.  KeyIn
eec0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28  fo *pKeyInfo = (
eed0: 4b 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74  KeyInfo*)userDat
eee0: 61 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b  a;.  u32 d1, d2;
eef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ef00: 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
ef10: 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
ef20: 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
ef30: 78 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f  x1, idx2;      /
ef40: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
ef50: 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
ef60: 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
ef70: 20 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48   u32 szHdr1, szH
ef80: 64 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  dr2;  /* Number 
ef90: 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
efa0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
efb0: 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  0;.  int nField;
efc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
efd0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
efe0: 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
eff0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f000: 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f  ar *)pKey1;.  co
f010: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f020: 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73  r *aKey2 = (cons
f030: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f040: 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20  *)pKey2;..  Mem 
f050: 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32  mem1;.  Mem mem2
f060: 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
f070: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
f080: 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
f090: 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65  fo->db;.  mem2.e
f0a0: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
f0b0: 6e 63 3b 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20  nc;.  mem2.db = 
f0c0: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
f0d0: 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56 61 72  .  idx1 = GetVar
f0e0: 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  int(aKey1, szHdr
f0f0: 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  1);.  d1 = szHdr
f100: 31 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74 56  1;.  idx2 = GetV
f110: 61 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48  arint(aKey2, szH
f120: 64 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48  dr2);.  d2 = szH
f130: 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20  dr2;.  nField = 
f140: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
f150: 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
f160: 73 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c 73  szHdr1 && idx2<s
f170: 7a 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32  zHdr2 ){.    u32
f180: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20   serial_type1;. 
f190: 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
f1a0: 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe2;..    /* Rea
f1b0: 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
f1c0: 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
f1d0: 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
f1e0: 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
f1f0: 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61   += GetVarint( a
f200: 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
f210: 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69  l_type1 );.    i
f220: 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20  f( d1>=nKey1 && 
f230: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f240: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
f250: 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b  type1)>0 ) break
f260: 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47 65  ;.    idx2 += Ge
f270: 74 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b 69  tVarint( aKey2+i
f280: 64 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx2, serial_type
f290: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e  2 );.    if( d2>
f2a0: 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65  =nKey2 && sqlite
f2b0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
f2c0: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29  en(serial_type2)
f2d0: 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
f2e0: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
f2f0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
f300: 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
f310: 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
f320: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
f330: 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
f340: 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20  type1, &mem1);. 
f350: 20 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33     d2 += sqlite3
f360: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
f370: 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c  Key2[d2], serial
f380: 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a  _type2, &mem2);.
f390: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
f3a0: 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
f3b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f3c0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
f3d0: 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65  1, &mem2, i<nFie
f3e0: 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ld ? pKeyInfo->a
f3f0: 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
f400: 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73    if( mem1.flags
f410: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c   & MEM_Dyn ) sql
f420: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
f430: 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69  se(&mem1);.    i
f440: 66 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20  f( mem2.flags & 
f450: 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65  MEM_Dyn ) sqlite
f460: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
f470: 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20  &mem2);.    if( 
f480: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  rc!=0 ){.      b
f490: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f4a0: 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  i++;.  }..  /* O
f4b0: 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
f4c0: 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
f4d0: 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69  , but all the fi
f4e0: 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
f4f0: 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20  point.  ** were 
f500: 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e  equal. If the in
f510: 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72  crKey flag is tr
f520: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  ue, then the sec
f530: 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20  ond key is.  ** 
f540: 74 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65  treated as large
f550: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
f560: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
f570: 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79  KeyInfo->incrKey
f580: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d   ){.      rc = -
f590: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
f5a0: 20 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20   d1<nKey1 ){.   
f5b0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
f5c0: 65 6c 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79  else if( d2<nKey
f5d0: 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
f5e0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
f5f0: 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
f600: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c  aSortOrder && i<
f610: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
f620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f630: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
f640: 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
f650: 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a    rc = -rc;.  }.
f660: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f670: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
f680: 65 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ent is an index 
f690: 65 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75  entry composed u
f6a0: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
f6b0: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
f6c0: 2a 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79  * The last entry
f6d0: 20 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20   in this record 
f6e0: 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
f6f0: 65 67 65 72 20 28 73 70 65 63 69 66 69 63 61 6c  eger (specifical
f700: 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
f710: 20 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72   rowid).  This r
f720: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
f730: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
f740: 65 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e  es in.** that in
f750: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
f760: 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
f770: 64 4c 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61  dLen(const u8 *a
f780: 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64  Key){.  u32 szHd
f790: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
f7a0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
f7b0: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
f7c0: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
f7d0: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
f7e0: 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  id */..  sqlite3
f7f0: 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  GetVarint32(aKey
f800: 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c  , &szHdr);.  sql
f810: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
f820: 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20  &aKey[szHdr-1], 
f830: 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 72  &typeRowid);.  r
f840: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
f850: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
f860: 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a  ypeRowid);.}.  .
f870: 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
f880: 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
f890: 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
f8a0: 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
f8b0: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
f8c0: 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
f8d0: 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
f8e0: 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
f8f0: 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
f900: 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
f910: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
f920: 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
f930: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
f940: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
f950: 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
f960: 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
f970: 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
f980: 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
f990: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
f9a0: 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
f9b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f9c0: 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
f9d0: 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
f9e0: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
f9f0: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
fa00: 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
fa10: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
fa20: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
fa30: 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
fa40: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
fa50: 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
fa60: 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
fa70: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
fa80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fa90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
faa0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
fab0: 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
fac0: 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
fad0: 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
fae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
faf0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74    }.  sqlite3Get
fb00: 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
fb10: 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71  z, &szHdr);.  sq
fb20: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
fb30: 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
fb40: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
fb50: 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  ;.  lenRowid = s
fb60: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
fb70: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
fb80: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
fb90: 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
fba0: 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
fbb0: 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
fbc0: 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
fbd0: 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
fbe0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
fbf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fc00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fc10: 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
fc20: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
fc30: 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
fc40: 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
fc50: 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
fc60: 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
fc70: 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
fc80: 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
fc90: 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
fca0: 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
fcb0: 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
fcc0: 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
fcd0: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
fce0: 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
fcf0: 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
fd00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
fd10: 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
fd20: 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72  Key is either cr
fd30: 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
fd40: 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
fd50: 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
fd60: 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
fd70: 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
fd80: 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
fd90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
fda0: 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
fdb0: 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a  gnored as well..
fdc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
fdd0: 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
fde0: 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  .  Cursor *pC,  
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe00: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
fe10: 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
fe20: 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  */.  int nKey, c
fe30: 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20  onst u8 *pKey,  
fe40: 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63   /* The key to c
fe50: 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
fe60: 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
fe70: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
fe80: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
fe90: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
fea0: 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
feb0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
fec0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
fed0: 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
fee0: 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a    int lenRowid;.
fef0: 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69    Mem m;..  sqli
ff00: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
ff10: 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
ff20: 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
ff30: 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  <=0 ){.    *res 
ff40: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
ff50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
ff60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
ff70: 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
ff80: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43  ->pCursor, 0, nC
ff90: 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
ffa0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ffb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
ffc0: 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
ffd0: 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
ffe0: 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20  en((u8*)m.z);.  
fff0: 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
10000 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10010 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e  pC->pKeyInfo, m.
10020 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c  n-lenRowid, m.z,
10030 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
10040 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
10050 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
10060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10070 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10080 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
10090 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
100a0 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
100b0 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
100c0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
100d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
100e0 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
100f0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10100 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
10110 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
10120 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
10130 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10140 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
10150 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
10160 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
10170 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
10180 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
10190 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
101a0 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
101b0 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
101c0 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
101d0 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
101e0 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
101f0 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
10200 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
10210 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
10220 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
10230 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
10240 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
10250 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
10260 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10270 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
10280 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
10290 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
102a0 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
102b0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
102c0 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
102d0 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
102e0 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
102f0 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
10300 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
10310 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
10320 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
10330 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
10340 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
10350 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
10360 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
10370 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
10380 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
10390 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
103a0 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
103b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
103c0 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
103d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
103e0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
103f0 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
10400 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
10410 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
10420 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
10430 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
10440 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
10450 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
10460 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
10470 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
10480 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
10490 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
104a0 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
104b0 64 62 3b 0a 7d 0a                                db;.}.