/ Hex Artifact Content
Login

Artifact 99534543766eec8eb3727e6f9dc8ed64d95f1f2d:


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 0a 2a 2a 0a 2a 2a 20  elements..**.** 
0900: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
0910: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
0920: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
0930: 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64  the array,.** Vd
0940: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0950: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0960: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0970: 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e  is so that.** an
0980: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0990: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
09a0: 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  be correctly dea
09b0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
09c0: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
09d0: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
09e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
09f0: 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  izeOpArray(Vdbe 
0a00: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56 64  *p, int N){.  Vd
0a10: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0a20: 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e  t oldSize = p->n
0a30: 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70 4e 65 77 20  OpAlloc;.  pNew 
0a40: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0a50: 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  oc(p->db, p->aOp
0a60: 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  , N*sizeof(Op));
0a70: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
0a80: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
0a90: 20 4e 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d   N;.    p->aOp =
0aa0: 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 4e   pNew;.    if( N
0ab0: 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20  >oldSize ){.    
0ac0: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
0ad0: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 4e  [oldSize], 0, (N
0ae0: 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66  -oldSize)*sizeof
0af0: 28 4f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (Op));.    }.  }
0b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
0b10: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
0b20: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
0b30: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
0b40: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
0b50: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
0b60: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
0b70: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
0b80: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
0b90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
0ba0: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
0bb0: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
0bc0: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
0bd0: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
0be0: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
0bf0: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
0c00: 20 70 31 2c 20 70 32 20 20 20 20 20 20 20 20 20   p1, p2         
0c10: 20 46 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68   First two of th
0c20: 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
0c30: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   operands..**.**
0c40: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
0c50: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
0c60: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0c70: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0c80: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0c90: 56 64 62 65 43 68 61 6e 67 65 50 33 28 29 20 66  VdbeChangeP3() f
0ca0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0cb0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0cc0: 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P3.** operand
0cd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0ce0: 56 64 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a  VdbeAddOp(Vdbe *
0cf0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0d00: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  1, int p2){.  in
0d10: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
0d20: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
0d30: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
0d40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0d50: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0d70: 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  {.    resizeOpAr
0d80: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c  ray(p, p->nOpAll
0d90: 6f 63 2a 32 20 2b 20 31 30 30 29 3b 0a 20 20 20  oc*2 + 100);.   
0da0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
0db0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0dc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
0dd0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0de0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0df0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0e00: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0e10: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0e20: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0e30: 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p3 = 0;.  pOp->
0e40: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
0e50: 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  SED;.  p->expire
0e60: 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
0e70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
0e80: 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64   sqlite3_vdbe_ad
0e90: 64 6f 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69  dop_trace ) sqli
0ea0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
0eb0: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
0ec0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
0ed0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n i;.}../*.** Ad
0ee0: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
0ef0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 33   includes the p3
0f00: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73   value..*/.int s
0f10: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 56 64  qlite3VdbeOp3(Vd
0f20: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0f30: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 63  nt p1, int p2, c
0f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 69  onst char *zP3,i
0f50: 6e 74 20 70 33 74 79 70 65 29 7b 0a 20 20 69 6e  nt p3type){.  in
0f60: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
0f70: 56 64 62 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c  VdbeAddOp(p, op,
0f80: 20 70 31 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69   p1, p2);.  sqli
0f90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
0fa0: 70 2c 20 61 64 64 72 2c 20 7a 50 33 2c 20 70 33  p, addr, zP3, p3
0fb0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
0fc0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
0fd0: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
0fe0: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
0ff0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1000: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1010: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1020: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1030: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1040: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1050: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
1060: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
1070: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
1080: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
1090: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
10a0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
10b0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
10c0: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
10d0: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
10e0: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
10f0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1100: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1110: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1120: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1130: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1140: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1150: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
1160: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
1170: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
1180: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
1190: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
11a0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
11b0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
11c0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
11d0: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
11e0: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
11f0: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1200: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1210: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1220: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1230: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1240: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1250: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
1260: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
1270: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
1280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1290: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
12a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
12b0: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
12c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
12d0: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
12e0: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
12f0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1300: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1310: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1320: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1350: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
1360: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1370: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1380: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1390: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
13a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
13b0: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
13c0: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
13d0: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
13e0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
13f0: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
1400: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
1410: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1420: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1430: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1440: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1450: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1460: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
1470: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1480: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
1490: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
14a0: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
14b0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
14c0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
14d0: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
14e0: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
14f0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1500: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1510: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1520: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1530: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1540: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1550: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
1560: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
1570: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
1580: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
1590: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
15a0: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
15b0: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
15c0: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
15d0: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
15e0: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
15f0: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
1600: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
1610: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
1620: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
1630: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1640: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1650: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
1660: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
1670: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
1680: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
1690: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
16a0: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
16b0: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
16c0: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
16d0: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
16e0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
16f0: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
1700: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
1710: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
1720: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
1730: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1740: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1750: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1760: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
1770: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
1780: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
1790: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
17a0: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
17b0: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
17c0: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
17d0: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
17e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
17f0: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
1800: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
1810: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
1820: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
1830: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1840: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1850: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1860: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1870: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1880: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1890: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
18a0: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
18b0: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
18c0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
18d0: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
18e0: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
18f0: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
1900: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
1910: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
1920: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
1930: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1940: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1950: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1960: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1970: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1980: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1990: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
19a0: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
19b0: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
19c0: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 28 28 75  SH_MASK_0 + (((u
19d0: 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d  nsigned)NOPUSH_M
19e0: 41 53 4b 5f 31 29 3c 3c 31 36 29 2c 0a 20 20 20  ASK_1)<<16),.   
19f0: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20 2b   NOPUSH_MASK_2 +
1a00: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1a10: 55 53 48 5f 4d 41 53 4b 5f 33 29 3c 3c 31 36 29  USH_MASK_3)<<16)
1a20: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1a30: 4b 5f 34 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_4 + (((unsigne
1a40: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 29  d)NOPUSH_MASK_5)
1a50: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1a60: 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 28 28 75 6e  H_MASK_6 + (((un
1a70: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1a80: 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_7)<<16),.    
1a90: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1aa0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1ab0: 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c 31 36 29 0a  SH_MASK_9)<<16).
1ac0: 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f    };.  assert( o
1ad0: 70 3c 33 32 2a 35 20 29 3b 0a 20 20 72 65 74 75  p<32*5 );.  retu
1ae0: 72 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d  rn (masks[op>>5]
1af0: 20 26 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29   & (1<<(op&0x1F)
1b00: 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ));.}..#ifndef N
1b10: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1b20: 33 56 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73  3VdbeOpcodeNoPus
1b30: 68 28 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75  h(u8 op){.  retu
1b40: 72 6e 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28  rn opcodeNoPush(
1b50: 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  op);.}.#endif../
1b60: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
1b70: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
1b80: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
1b90: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
1ba0: 61 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73  ative..** Each s
1bb0: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1bc0: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1bd0: 68 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  he label by sett
1be0: 69 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61  ing the P2.** va
1bf0: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
1c00: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
1c10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1c20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1c30: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
1c40: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
1c50: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
1c60: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1c70: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1c80: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1c90: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1ca0: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1cb0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
1cc0: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
1cd0: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
1ce0: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
1cf0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
1d00: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
1d10: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
1d20: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
1d30: 54 68 65 20 69 6e 74 65 67 65 72 20 2a 70 4d 61  The integer *pMa
1d40: 78 53 74 61 63 6b 20 69 73 20 73 65 74 20 74 6f  xStack is set to
1d50: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
1d60: 62 65 72 20 6f 66 20 76 64 62 65 20 73 74 61 63  ber of vdbe stac
1d70: 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  k.** entries tha
1d80: 74 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  t static analysi
1d90: 73 20 72 65 76 65 61 6c 73 20 74 68 69 73 20 70  s reveals this p
1da0: 72 6f 67 72 61 6d 20 6d 69 67 68 74 20 6e 65 65  rogram might nee
1db0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1dc0: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
1dd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  the following op
1de0: 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20  timization:  It 
1df0: 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c  scans for.** Hal
1e00: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77  t instructions w
1e10: 68 65 72 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f  here P1==SQLITE_
1e20: 43 4f 4e 53 54 52 41 49 4e 54 20 6f 72 20 50 32  CONSTRAINT or P2
1e30: 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f  ==OE_Abort or fo
1e40: 72 0a 2a 2a 20 49 64 78 49 6e 73 65 72 74 20 69  r.** IdxInsert i
1e50: 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72  nstructions wher
1e60: 65 20 50 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20  e P2!=0.  If no 
1e70: 73 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  such instruction
1e80: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
1e90: 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65  en every Stateme
1ea0: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
1eb0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e  s changed to a N
1ec0: 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73  oop.  In.** this
1ed0: 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63   way, we avoid c
1ee0: 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61 74  reating the stat
1ef0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  ement journal fi
1f00: 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79  le unnecessarily
1f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f20: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
1f30: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
1f40: 4d 61 78 46 75 6e 63 41 72 67 73 2c 20 69 6e 74  MaxFuncArgs, int
1f50: 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20   *pMaxStack){.  
1f60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
1f70: 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74  xArgs = 0;.  int
1f80: 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e   nMaxStack = p->
1f90: 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  nOp;.  Op *pOp;.
1fa0: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
1fb0: 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74  p->aLabel;.  int
1fc0: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1fd0: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  llback = 0;.  in
1fe0: 74 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  t hasStatementBe
1ff0: 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  gin = 0;.  for(p
2000: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
2010: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
2020: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38  , pOp++){.    u8
2030: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
2040: 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20  pcode;..    if( 
2050: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
2060: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
2070: 50 5f 41 67 67 53 74 65 70 20 0a 23 69 66 6e 64  P_AggStep .#ifnd
2080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2090: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
20a0: 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f      || opcode==O
20b0: 50 5f 56 55 70 64 61 74 65 0a 23 65 6e 64 69 66  P_VUpdate.#endif
20c0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
20d0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
20e0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
20f0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 0a 20  pOp->p2;.    }. 
2100: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2110: 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20 20 20  P_Halt ){.      
2120: 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c  if( pOp->p1==SQL
2130: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
2140: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
2150: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ort ){.        d
2160: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
2170: 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  back = 1;.      
2180: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2190: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65  opcode==OP_State
21a0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61  ment ){.      ha
21b0: 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20  sStatementBegin 
21c0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
21d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
21e0: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
21f0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
2200: 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65  Update || opcode
2210: 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a  ==OP_VRename ){.
2220: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
2230: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
2240: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2250: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
2260: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
2270: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2280: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
2290: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22a0: 20 70 4f 70 5b 2d 32 5d 2e 6f 70 63 6f 64 65 3d   pOp[-2].opcode=
22b0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
22c0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 32 5d       n = pOp[-2]
22d0: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
22e0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
22f0: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
2300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
2310: 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f  pcodeNoPush(opco
2320: 64 65 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61  de) ){.      nMa
2330: 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a  xStack--;.    }.
2340: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
2350: 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
2360: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
2370: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
2380: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20   );.    pOp->p2 
2390: 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d  = aLabel[-1-pOp-
23a0: 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  >p2];.  }.  sqli
23b0: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62  te3_free(p->aLab
23c0: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
23d0: 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75   = 0;..  *pMaxFu
23e0: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
23f0: 73 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b 20  s;.  *pMaxStack 
2400: 3d 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20 20  = nMaxStack;..  
2410: 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72  /* If we never r
2420: 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
2430: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
2440: 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a   then statement.
2450: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2460: 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
2470: 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65  .  So change eve
2480: 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a  ry OP_Statement.
2490: 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f    ** opcode into
24a0: 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68   an OP_Noop.  Th
24b0: 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20  is avoid a call 
24c0: 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
24d0: 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a  Exclusive().  **
24e0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78   which can be ex
24f0: 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20  pensive on some 
2500: 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a  platforms..  */.
2510: 20 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65    if( hasStateme
2520: 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73  ntBegin && !does
2530: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
2540: 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70  k ){.    for(pOp
2550: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2560: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2570: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  pOp++){.      if
2580: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2590: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
25a0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
25b0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
25c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25e0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
25f0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2600: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
2610: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2620: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2630: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
2640: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
2650: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
2670: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
2680: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
2690: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
26a0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
26b0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  ck.  Return the.
26c0: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
26d0: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
26e0: 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20  n added..*/.int 
26f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2700: 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  List(Vdbe *p, in
2710: 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73  t nOp, VdbeOpLis
2720: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20  t const *aOp){. 
2730: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
2740: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2750: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2760: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
2770: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
2780: 6f 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  oc ){.    resize
2790: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
27a0: 70 2a 32 20 2b 20 6e 4f 70 29 3b 0a 20 20 7d 0a  p*2 + nOp);.  }.
27b0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
27c0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
27d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
27e0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   addr = p->nOp;.
27f0: 20 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20    if( nOp>0 ){. 
2800: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
2810: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
2820: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
2830: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
2840: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
2850: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
2860: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
2870: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
2880: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
2890: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
28a0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
28b0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
28c0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p1;.      pOut
28d0: 2d 3e 70 32 20 3d 20 70 32 3c 30 20 3f 20 61 64  ->p2 = p2<0 ? ad
28e0: 64 72 20 2b 20 41 44 44 52 28 70 32 29 20 3a 20  dr + ADDR(p2) : 
28f0: 70 32 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p2;.      pOut->
2900: 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20  p3 = pIn->p3;.  
2910: 20 20 20 20 70 4f 75 74 2d 3e 70 33 74 79 70 65      pOut->p3type
2920: 20 3d 20 70 49 6e 2d 3e 70 33 20 3f 20 50 33 5f   = pIn->p3 ? P3_
2930: 53 54 41 54 49 43 20 3a 20 50 33 5f 4e 4f 54 55  STATIC : P3_NOTU
2940: 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  SED;.#ifdef SQLI
2950: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
2960: 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  f( sqlite3_vdbe_
2970: 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a 20  addop_trace ){. 
2980: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2990: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61  bePrintOp(0, i+a
29a0: 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ddr, &p->aOp[i+a
29b0: 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ddr]);.      }.#
29c0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
29d0: 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20  p->nOp += nOp;. 
29e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
29f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
2a00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2a10: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f  he P1 operand fo
2a20: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2a30: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2a40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2a50: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
2a60: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
2a70: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
2a80: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
2a90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2aa0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
2ab0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
2ac0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
2ad0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
2ae0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2af0: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
2b00: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2b10: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2b20: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
2b30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2b40: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
2b50: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2b60: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
2b70: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2b80: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
2b90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2ba0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2bb0: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
2bc0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2bd0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2be0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2bf0: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
2c00: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
2c10: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
2c20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c30: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
2c40: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2c50: 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d  .  assert( val>=
2c60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c70: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2c80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2c90: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2ca0: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2cb0: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2cc0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2cd0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
2ce0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2cf0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
2d00: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
2d10: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
2d20: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
2d30: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2d40: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2d50: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
2d60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2d70: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
2d80: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
2d90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2da0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
2db0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
2dc0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
2dd0: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
2de0: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
2df0: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
2e00: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
2e10: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
2e20: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
2e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2e40: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2e50: 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a 70 44  tion(FuncDef *pD
2e60: 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20  ef){.  if( pDef 
2e70: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
2e80: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
2e90: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
2ea0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 66  qlite3_free(pDef
2eb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ec0: 44 65 6c 65 74 65 20 61 20 50 33 20 76 61 6c 75  Delete a P3 valu
2ed0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
2ee0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2ef0: 72 65 65 50 33 28 69 6e 74 20 70 33 74 79 70 65  reeP3(int p3type
2f00: 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69  , void *p3){.  i
2f10: 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69  f( p3 ){.    swi
2f20: 74 63 68 28 20 70 33 74 79 70 65 20 29 7b 0a 20  tch( p3type ){. 
2f30: 20 20 20 20 20 63 61 73 65 20 50 33 5f 44 59 4e       case P3_DYN
2f40: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
2f50: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P3_KEYINFO:.   
2f60: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
2f70: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
2f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2f90: 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20  ee(p3);.        
2fa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2fb0: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 50 52       case P3_MPR
2fc0: 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  INTF: {.        
2fd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29  sqlite3_free(p3)
2fe0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3000: 61 73 65 20 50 33 5f 56 44 42 45 46 55 4e 43 3a  ase P3_VDBEFUNC:
3010: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46   {.        VdbeF
3020: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d  unc *pVdbeFunc =
3030: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b   (VdbeFunc *)p3;
3040: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3050: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70  emeralFunction(p
3060: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
3070: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3080: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
3090: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
30a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30b0: 33 5f 66 72 65 65 28 70 56 64 62 65 46 75 6e 63  3_free(pVdbeFunc
30c0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
30d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30e0: 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a  case P3_FUNCDEF:
30f0: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
3100: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
3110: 28 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a  ((FuncDef*)p3);.
3120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3140: 65 20 50 33 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P3_MEM: {.    
3150: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
3160: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
3170: 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20  lue*)p3);.      
3180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
31a0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
31b0: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
31c0: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
31d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
31e0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
31f0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
3200: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
3210: 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29  f( p && p->aOp )
3220: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
3230: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3240: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  ];.    while( N-
3250: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
3260: 33 28 70 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70  3(pOp->p3type, p
3270: 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 6d  Op->p3);.      m
3280: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
3290: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
32a0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
32b0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
32c0: 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pOp++;.    }. 
32d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
32e0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
32f0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
3300: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3310: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3320: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3330: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3340: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3350: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3360: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3380: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3390: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
33a0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
33b0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
33c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
33d0: 68 65 6e 20 74 68 65 20 50 33 20 6f 70 65 72 61  hen the P3 opera
33e0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
33f0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
3400: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
3410: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
3420: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
3430: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3440: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
3450: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
3460: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
3470: 50 33 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P3 up to and inc
3480: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
3490: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
34a0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
34b0: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
34c0: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50  3..**.** If n==P
34d0: 33 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61  3_KEYINFO it mea
34e0: 6e 73 20 74 68 61 74 20 7a 50 33 20 69 73 20 61  ns that zP3 is a
34f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
3500: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  yInfo structure.
3510: 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61  .** A copy is ma
3520: 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66  de of the KeyInf
3530: 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f  o structure into
3540: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
3550: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
3560: 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66  _malloc, to be f
3570: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
3580: 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e  be is finalized.
3590: 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  .** n==P3_KEYINF
35a0: 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61  O_HANDOFF indica
35b0: 74 65 73 20 74 68 61 74 20 7a 50 33 20 70 6f 69  tes that zP3 poi
35c0: 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
35d0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74   structure.** st
35e0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74  ored in memory t
35f0: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
3600: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3610: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e   sqlite3_malloc.
3620: 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   The .** caller 
3630: 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20  should not free 
3640: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
3650: 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
3660: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
3670: 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a  s.** finalized..
3680: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
3690: 75 65 73 20 6f 66 20 6e 20 28 50 33 5f 53 54 41  ues of n (P3_STA
36a0: 54 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 20  TIC, P3_COLLSEQ 
36b0: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
36c0: 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a 2a  hat zP3 points.*
36d0: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
36e0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
36f0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
3700: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
3710: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
3720: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
3730: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
3740: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
3750: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
3760: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
3770: 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P3 on the most 
3780: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
3790: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
37a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
37b0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
37c0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
37d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69  nst char *zP3, i
37e0: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  ;.  assert( p==0
3800: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
3810: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3820: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
3830: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 64  ->aOp==0 || p->d
3840: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3850: 29 7b 0a 20 20 20 20 69 66 20 28 6e 20 21 3d 20  ){.    if (n != 
3860: 50 33 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20  P3_KEYINFO) {.  
3870: 20 20 20 20 66 72 65 65 50 33 28 6e 2c 20 28 76      freeP3(n, (v
3880: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
3890: 50 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P3);.    }.    r
38a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
38b0: 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e   addr<0 || addr>
38c0: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61  =p->nOp ){.    a
38d0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
38e0: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30  ;.    if( addr<0
38f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
3900: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
3910: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 33 28 70  ddr];.  freeP3(p
3920: 4f 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d  Op->p3type, pOp-
3930: 3e 70 33 29 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  >p3);.  pOp->p3 
3940: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 33 3d 3d  = 0;.  if( zP3==
3950: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  0 ){.    pOp->p3
3960: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
3970: 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53  3type = P3_NOTUS
3980: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
3990: 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P3_KEYINFO ){
39a0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
39b0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
39c0: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
39d0: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
39e0: 65 79 49 6e 66 6f 2a 29 7a 50 33 29 2d 3e 6e 46  eyInfo*)zP3)->nF
39f0: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
3a00: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
3a10: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
3a20: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
3a30: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
3a40: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
3a50: 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  fo = sqlite3_mal
3a60: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
3a70: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61    pOp->p3 = (cha
3a80: 72 2a 29 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  r*)pKeyInfo;.   
3a90: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
3aa0: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
3ab0: 63 68 61 72 20 2a 61 53 6f 72 74 4f 72 64 65 72  char *aSortOrder
3ac0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
3ad0: 4b 65 79 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42  KeyInfo, zP3, nB
3ae0: 79 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  yte);.      aSor
3af0: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
3b00: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
3b10: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
3b20: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
3b30: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3b40: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
3b50: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
3b60: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
3b70: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
3b80: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3b90: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
3ba0: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
3bb0: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  }.      pOp->p3t
3bc0: 79 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f  ype = P3_KEYINFO
3bd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3be0: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
3bf0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
3c00: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3c10: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P3_NOTUSED;.    
3c20: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
3c30: 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P3_KEYINFO_HAND
3c40: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
3c50: 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b  p3 = (char*)zP3;
3c60: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65  .    pOp->p3type
3c70: 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P3_KEYINFO;. 
3c80: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29   }else if( n<0 )
3c90: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  {.    pOp->p3 = 
3ca0: 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20  (char*)zP3;.    
3cb0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b  pOp->p3type = n;
3cc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3cd0: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72  ( n==0 ) n = str
3ce0: 6c 65 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f  len(zP3);.    pO
3cf0: 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 33 44  p->p3 = sqlite3D
3d00: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
3d10: 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP3, n);.    pOp
3d20: 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 44 59  ->p3type = P3_DY
3d30: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
3d40: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3d50: 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 50  ** Replace the P
3d60: 33 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  3 field of the m
3d70: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
3d80: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  ed instruction w
3d90: 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74  ith.** comment t
3da0: 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ext..*/.void sql
3db0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
3dc0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
3dd0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
3de0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
3e00: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
3e10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3e20: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
3e30: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 33 3d  Op[p->nOp-1].p3=
3e40: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
3e50: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 76  locFailed );.  v
3e60: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
3e70: 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mat);.  sqlite3V
3e80: 64 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 2d  dbeChangeP3(p, -
3e90: 31 2c 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e  1, sqlite3VMPrin
3ea0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
3eb0: 74 2c 20 61 70 29 2c 20 50 33 5f 44 59 4e 41 4d  t, ap), P3_DYNAM
3ec0: 49 43 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  IC);.  va_end(ap
3ed0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
3ee0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
3ef0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
3f00: 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62   address..*/.Vdb
3f10: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
3f20: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
3f30: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
3f40: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3f50: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3f60: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
3f70: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
3f80: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
3f90: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
3fa0: 72 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30  return ((addr>=0
3fb0: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
3fc0: 3f 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29  ?(&p->aOp[addr])
3fd0: 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  :0);.}..#if !def
3fe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3ff0: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
4000: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
4010: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
4020: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
4030: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4040: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
4050: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
4060: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
4070: 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P3 parameter fo
4080: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
4090: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
40a0: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
40b0: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
40c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
40d0: 72 20 2a 64 69 73 70 6c 61 79 50 33 28 4f 70 20  r *displayP3(Op 
40e0: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
40f0: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
4100: 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 61 73   char *zP3;.  as
4110: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
4120: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
4130: 2d 3e 70 33 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p3type ){.    
4140: 63 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a  case P3_KEYINFO:
4150: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
4160: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
4170: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65   *pKeyInfo = (Ke
4180: 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a  yInfo*)pOp->p3;.
4190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
41a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
41b0: 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64  emp, "keyinfo(%d
41c0: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
41d0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
41e0: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20  strlen(zTemp);. 
41f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4200: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4210: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4220: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
4230: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
4240: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
4250: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
4260: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
4270: 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  en(pColl->zName)
4280: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4290: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
42a0: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
42b0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
42c0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
42d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
42e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
42f0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
4300: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4310: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
4320: 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f  rder && pKeyInfo
4330: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
4340: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
4350: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
4360: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4370: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
4380: 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e  Temp[i], pColl->
4390: 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20  zName,n+1);.    
43a0: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
43b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
43c0: 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+4<nTemp-6 ){. 
43d0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
43e0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22  &zTemp[i],",nil"
43f0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,4);.          i
4400: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
4410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
4420: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
4430: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
4440: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
4450: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
4460: 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b      zP3 = zTemp;
4470: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4480: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33 5f    }.    case P3_
4490: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
44a0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
44b0: 3d 20 28 43 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d  = (CollSeq*)pOp-
44c0: 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >p3;.      sqlit
44d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
44e0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
44f0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
4500: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
4510: 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP3 = zTemp;.  
4520: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4530: 0a 20 20 20 20 63 61 73 65 20 50 33 5f 46 55 4e  .    case P3_FUN
4540: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75  CDEF: {.      Fu
4550: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 28 46  ncDef *pDef = (F
4560: 75 6e 63 44 65 66 2a 29 70 4f 70 2d 3e 70 33 3b  uncDef*)pOp->p3;
4570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4580: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4590: 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20  Temp, "%s(%d)", 
45a0: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
45b0: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
45c0: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
45d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
45e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
45f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4600: 0a 20 20 20 20 63 61 73 65 20 50 33 5f 56 54 41  .    case P3_VTA
4610: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
4620: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
4630: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
4640: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
4650: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4660: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76  nTemp, zTemp, "v
4670: 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61  tab:%p:%p", pVta
4680: 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b, pVtab->pModul
4690: 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  e);.      zP3 = 
46a0: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
46b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
46c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
46d0: 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d        zP3 = pOp-
46e0: 3e 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  >p3;.      if( z
46f0: 50 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70  P3==0 || pOp->op
4700: 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  code==OP_Noop ){
4710: 0a 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22  .        zP3 = "
4720: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
4730: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
4740: 50 33 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P3!=0 );.  retur
4750: 6e 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP3;.}.#endif.
4760: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
4770: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
4780: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
4790: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
47a0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f  s used..**.*/.vo
47b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  id sqlite3VdbeUs
47c0: 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c  esBtree(Vdbe *p,
47d0: 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d   int i){.  int m
47e0: 61 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ask;.  assert( i
47f0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
4800: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4810: 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72   i<sizeof(p->btr
4820: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d  eeMask)*8 );.  m
4830: 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20 69 66  ask = 1<<i;.  if
4840: 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
4850: 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
4860: 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c    p->btreeMask |
4870: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69  = mask;.    sqli
4880: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
4890: 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75  ayInsert(&p->aMu
48a0: 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b  tex, p->db->aDb[
48b0: 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  i].pBt);.  }.}..
48c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
48d0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
48e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
48f0: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
4900: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
4910: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
4920: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
4930: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
4940: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
4950: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
4960: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
4970: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b  p){.  char *zP3;
4980: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
4990: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
49a0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
49b0: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
49c0: 20 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66   %4d %s\n";.  if
49d0: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
49e0: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33   = stdout;.  zP3
49f0: 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70   = displayP3(pOp
4a00: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
4a10: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
4a20: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
4a30: 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74  .      pc, sqlit
4a40: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
4a50: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
4a60: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33  p1, pOp->p2, zP3
4a70: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
4a80: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
4a90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
4aa0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
4ab0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
4ac0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
4ad0: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
4ae0: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a   N){.  if( p ){.
4af0: 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30      while( N-->0
4b00: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
4b10: 28 20 4e 3c 32 20 7c 7c 20 70 5b 30 5d 2e 64 62  ( N<2 || p[0].db
4b20: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20  ==p[1].db );.   
4b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
4b40: 6d 52 65 6c 65 61 73 65 28 70 2b 2b 29 3b 0a 20  mRelease(p++);. 
4b50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
4b60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4b70: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
4b80: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
4b90: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
4ba0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
4bb0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
4bc0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
4bd0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
4be0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
4bf0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
4c00: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
4c10: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
4c20: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
4c30: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
4c40: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
4c50: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
4c60: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
4c70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4c80: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
4c90: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4ca0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
4cb0: 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  E */.){.  sqlite
4cc0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
4cd0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
4ce0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
4cf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
4d00: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ain );.  if( p->
4d10: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
4d20: 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53  C_RUN ) return S
4d30: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
4d40: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69  assert( db->magi
4d50: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
4d60: 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74  BUSY );.  assert
4d70: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
4d80: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
4d90: 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f  ITE_BUSY );..  /
4da0: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
4db0: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
4dc0: 6f 74 20 70 75 74 20 64 79 6e 61 6d 69 63 20 73  ot put dynamic s
4dd0: 74 72 69 6e 67 73 20 6f 6e 74 6f 20 74 68 65 0a  trings onto the.
4de0: 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 2c 20    ** the stack, 
4df0: 74 68 65 79 20 6d 61 79 20 62 65 63 6f 6d 65 20  they may become 
4e00: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
4e10: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
4e20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4e30: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
4e40: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
4e50: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
4e60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
4e70: 70 54 6f 73 3d 3d 26 70 2d 3e 61 53 74 61 63 6b  pTos==&p->aStack
4e80: 5b 34 5d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  [4] ){.    relea
4e90: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
4ea0: 74 61 63 6b 2c 20 35 29 3b 0a 20 20 7d 0a 20 20  tack, 5);.  }.  
4eb0: 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20  p->resOnStack = 
4ec0: 30 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20  0;..  do{.    i 
4ed0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
4ee0: 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26  ile( i<p->nOp &&
4ef0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
4f00: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
4f10: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
4f20: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f  ;.  if( i>=p->nO
4f30: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  p ){.    p->rc =
4f40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4f50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
4f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
4f70: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
4f80: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
4f90: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
4fa0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
4fb0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
4fc0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
4fd0: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
4fe0: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
4ff0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
5000: 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70  }else{.    Op *p
5010: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
5020: 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
5030: 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20   p->aStack;.    
5040: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5050: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
5060: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
5070: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
5080: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
50b0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
50c0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
50d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
50e0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
50f0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
5100: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
5110: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
5120: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
5130: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
5140: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
5150: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65  >z!=0 );.    pMe
5160: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
5170: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
5180: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5190: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
51a0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
51b0: 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  8;.    pMem++;..
51c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
51d0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
51e0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
51f0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5210: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
5220: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5230: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5240: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
5250: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5260: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
5270: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
52a0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
52b0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    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 45 70  ->flags = MEM_Ep
52e0: 68 65 6d 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  hem|MEM_Str|MEM_
52f0: 54 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f  Term;   /* P3 */
5300: 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64  .    pMem->z = d
5310: 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d  isplayP3(pOp, pM
5320: 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65  em->zShort, size
5330: 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29  of(pMem->zShort)
5340: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5350: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
5360: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
5370: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
5380: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5390: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
53a0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
53b0: 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e  _UTF8;..    p->n
53c0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20  ResColumn = 5 - 
53d0: 32 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  2*(p->explain-1)
53e0: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
53f0: 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  pMem;.    p->rc 
5400: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5410: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
5420: 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
5430: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
5440: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
5450: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5460: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
5470: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5480: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
5490: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
54a0: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
54b0: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
54c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
54d0: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
54e0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
54f0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
5500: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
5510: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
5520: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
5530: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
5540: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
5550: 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20  p && pOp->p3!=0 
5560: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
5570: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  r *z = pOp->p3;.
5580: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
5590: 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b  ce(*(u8*)z) ) z+
55a0: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
55b0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
55c0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
55d0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
55e0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
55f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5600: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
5610: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
5620: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
5630: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
5640: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
5650: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
5660: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
5670: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
5680: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
5690: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6f    if( sqlite3_io
56a0: 5f 74 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  _trace==0 ) retu
56b0: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
56c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
56d0: 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d  = &p->aOp[nOp-1]
56e0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
56f0: 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20  ode==OP_Noop && 
5700: 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20  pOp->p3!=0 ){.  
5710: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
5720: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
5730: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
5740: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
5750: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 33 29 3b   "%s", pOp->p3);
5760: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73  .    for(i=0; is
5770: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
5780: 63 68 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29  char)z[i]); i++)
5790: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
57a0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
57b0: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 28 75    if( isspace((u
57c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
57d0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
57e0: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
57f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
5800: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
5810: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5820: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
5830: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
5840: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
5850: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  0;.    sqlite3_i
5860: 6f 5f 74 72 61 63 65 28 22 53 51 4c 20 25 73 5c  o_trace("SQL %s\
5870: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
5880: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
5890: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
58a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
58b0: 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50  ACE */.../*.** P
58c0: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
58d0: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
58e0: 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e  cution.  This in
58f0: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
5900: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
5910: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
5920: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
5930: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
5940: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
5950: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
5960: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
5970: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
5980: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
5990: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
59a0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
59b0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
59c0: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20  y way to move a 
59d0: 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d  VDBE from VDBE_M
59e0: 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20  AGIC_INIT to.** 
59f0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a  VDBE_MAGIC_RUN..
5a00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5a10: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
5a20: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a40: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
5a50: 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20  int nVar,       
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20  * Number of '?' 
5a80: 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73  see in the SQL s
5a90: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
5aa0: 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20  t nMem,         
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79  Number of memory
5ad0: 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61   cells to alloca
5ae0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  te */.  int nCur
5af0: 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  sor,            
5b00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5b10: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61   of cursors to a
5b20: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
5b30: 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20   isExplain      
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5b50: 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41  rue if the EXPLA
5b60: 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70  IN keywords is p
5b70: 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  resent */.){.  i
5b80: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
5b90: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
5ba0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
5bb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5bc0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5bd0: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
5be0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
5bf0: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
5c00: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
5c10: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
5c20: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
5c30: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
5c40: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
5c50: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69   than later. Thi
5c60: 73 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73  s.   * is becaus
5c70: 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65  e the call to re
5c80: 73 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65  sizeOpArray() be
5c90: 6c 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74  low may shrink t
5ca0: 68 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d  he.   * p->aOp[]
5cb0: 20 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d   array to save m
5cc0: 65 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20  emory if called 
5cd0: 77 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47  when in VDBE_MAG
5ce0: 49 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61  IC_RUN .   * sta
5cf0: 74 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d  te..   */.  p->m
5d00: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
5d10: 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  C_RUN;..  /* No 
5d20: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72  instruction ever
5d30: 20 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61   pushes more tha
5d40: 6e 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  n a single eleme
5d50: 6e 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nt onto the.  **
5d60: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65   stack.  And the
5d70: 20 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f   stack never gro
5d80: 77 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65  ws on successive
5d90: 20 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74   executions of t
5da0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f  he.  ** same loo
5db0: 70 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c  p.  So the total
5dc0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72   number of instr
5dd0: 75 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70  uctions is an up
5de0: 70 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f  per bound.  ** o
5df0: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74  n the maximum st
5e00: 61 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72  ack depth requir
5e10: 65 64 2e 20 20 28 41 64 64 65 64 20 6c 61 74 65  ed.  (Added late
5e20: 72 3a 29 20 20 54 68 65 0a 20 20 2a 2a 20 72 65  r:)  The.  ** re
5e30: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 29 20  solveP2Values() 
5e40: 63 61 6c 6c 20 63 6f 6d 70 75 74 65 73 20 61 20  call computes a 
5e50: 74 69 67 68 74 65 72 20 75 70 70 65 72 20 62 6f  tighter upper bo
5e60: 75 6e 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  und on the.  ** 
5e70: 73 74 61 63 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a  stack size..  **
5e80: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
5e90: 20 61 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73   all the stack s
5ea0: 70 61 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65  pace we will eve
5eb0: 72 20 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  r need..  */.  i
5ec0: 66 28 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20  f( p->aStack==0 
5ed0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
5ee0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
5ef0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  m number of args
5f00: 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65   passed to a use
5f10: 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  r function. */. 
5f20: 20 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20     int nStack;  
5f30: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
5f40: 6d 62 65 72 20 6f 66 20 73 74 61 63 6b 20 65 6e  mber of stack en
5f50: 74 72 69 65 73 20 72 65 71 75 69 72 65 64 20 2a  tries required *
5f60: 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56  /.    resolveP2V
5f70: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 2c 20  alues(p, &nArg, 
5f80: 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 72 65  &nStack);.    re
5f90: 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70  sizeOpArray(p, p
5fa0: 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65  ->nOp);.    asse
5fb0: 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20  rt( nVar>=0 );. 
5fc0: 20 20 20 61 73 73 65 72 74 28 20 6e 53 74 61 63     assert( nStac
5fd0: 6b 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20  k<p->nOp );.    
5fe0: 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20 29 7b  if( isExplain ){
5ff0: 0a 20 20 20 20 20 20 6e 53 74 61 63 6b 20 3d 20  .      nStack = 
6000: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  10;.    }.    p-
6010: 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65  >aStack = sqlite
6020: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6030: 2c 0a 20 20 20 20 20 20 20 20 6e 53 74 61 63 6b  ,.        nStack
6040: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 53 74 61 63  *sizeof(p->aStac
6050: 6b 5b 30 5d 29 20 20 20 20 2f 2a 20 61 53 74 61  k[0])    /* aSta
6060: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41  ck */.      + nA
6070: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20  rg*sizeof(Mem*) 
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6090: 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b  apArg */.      +
60a0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
60b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
60c0: 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20  /* aVar */.     
60d0: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63   + nVar*sizeof(c
60e0: 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20  har*)           
60f0: 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20    /* azVar */.  
6100: 20 20 20 20 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f      + nMem*sizeo
6110: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
6120: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a       /* aMem */.
6130: 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a        + nCursor*
6140: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20  sizeof(Cursor*) 
6150: 20 20 20 20 20 20 20 2f 2a 20 61 70 43 73 72 20         /* apCsr 
6160: 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  */.    );.    if
6170: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
6180: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  led ){.      p->
6190: 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63  aMem = &p->aStac
61a0: 6b 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20  k[nStack];.     
61b0: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
61c0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  .      p->aVar =
61d0: 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b   &p->aMem[nMem];
61e0: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  .      p->nVar =
61f0: 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e   nVar;.      p->
6200: 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20  okVar = 0;.     
6210: 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d   p->apArg = (Mem
6220: 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72  **)&p->aVar[nVar
6230: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61  ];.      p->azVa
6240: 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e  r = (char**)&p->
6250: 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20  apArg[nArg];.   
6260: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43     p->apCsr = (C
6270: 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61  ursor**)&p->azVa
6280: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
6290: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
62a0: 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e  sor;.      for(n
62b0: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
62c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61  {.        p->aVa
62d0: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
62e0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
62f0: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
6300: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  b;.      }.     
6310: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 53 74 61   for(n=0; n<nSta
6320: 63 6b 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ck; n++){.      
6330: 20 20 70 2d 3e 61 53 74 61 63 6b 5b 6e 5d 2e 64    p->aStack[n].d
6340: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
6350: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
6360: 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20  n=0; n<p->nMem; 
6370: 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  n++){.    p->aMe
6380: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
6390: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 2d 3e 61 4d  _Null;.    p->aM
63a0: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
63b0: 20 7d 0a 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20   }..  p->pTos = 
63c0: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
63d0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
63e0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
63f0: 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e  K;.  p->uniqueCn
6400: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75  t = 0;.  p->retu
6410: 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  rnDepth = 0;.  p
6420: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
6430: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70  OE_Abort;.  p->p
6440: 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20  opStack =  0;.  
6450: 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73  p->explain |= is
6460: 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61  Explain;.  p->ma
6470: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
6480: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
6490: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
64a0: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
64b0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
64c0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f  at = 255;.  p->o
64d0: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d  penedStatement =
64e0: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
64f0: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
6500: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
6510: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
6520: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
6530: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
6540: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
6550: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
6560: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
6570: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
6580: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
6590: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
65a0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
65b0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 74 6f 20 68   happens.** to h
65c0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
65d0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
65e0: 6f 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73  or(Vdbe *p, Curs
65f0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
6600: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
6610: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6620: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
6630: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6640: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
6650: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >pCursor);.  }. 
6660: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
6670: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
6680: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
6690: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
66a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
66b0: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
66c0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
66d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
66e0: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
66f0: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
6700: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
6710: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
6720: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
6730: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
6740: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
6750: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
6760: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
6770: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
6780: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
6790: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  r);.    sqlite3S
67a0: 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a  afetyOn(p->db);.
67b0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
67c0: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
67d0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
67e0: 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a  ee(pCx->pData);.
67f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6800: 43 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71  Cx->aType);.  sq
6810: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 29 3b  lite3_free(pCx);
6820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6830: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
6840: 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73  pt for VTab curs
6850: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ors that are cur
6860: 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65  rently.** in use
6870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6880: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
6890: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
68a0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
68b0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
68c0: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
68d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
68e0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
68f0: 20 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d      Cursor *pC =
6900: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
6910: 20 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d    if( pC && (!p-
6920: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c  >inVtabMethod ||
6930: 20 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f   !pC->pVtabCurso
6940: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
6950: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
6960: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
6970: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
6980: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
6990: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
69a0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
69b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
69c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
69d0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
69e0: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
69f0: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
6a00: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
6a10: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
6a20: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
6a30: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
6a40: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
6a50: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
6a60: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
6a70: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
6a80: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
6a90: 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65  aStack ){.    re
6aa0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
6ab0: 3e 61 53 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d  >aStack, 1 + (p-
6ac0: 3e 70 54 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63  >pTos - p->aStac
6ad0: 6b 29 29 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  k));.    p->pTos
6ae0: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31   = &p->aStack[-1
6af0: 5d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  ];.  }.  closeAl
6b00: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
6b10: 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20  tiveVtabs(p);.  
6b20: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6b30: 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
6b40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6b50: 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46  FifoClear(&p->sF
6b60: 69 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63  ifo);.  if( p->c
6b70: 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20  ontextStack ){. 
6b80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
6b90: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
6ba0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6bb0: 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65  lite3VdbeFifoCle
6bc0: 61 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ar(&p->contextSt
6bd0: 61 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20  ack[i].sFifo);. 
6be0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6bf0: 5f 66 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74  _free(p->context
6c00: 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d  Stack);.  }.  p-
6c10: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20  >contextStack = 
6c20: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
6c30: 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20  tackDepth = 0;. 
6c40: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6c50: 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Top = 0;.  sqlit
6c60: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d  e3_free(p->zErrM
6c70: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
6c80: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 73 4f  g = 0;.  p->resO
6c90: 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f  nStack = 0;.}../
6ca0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
6cb0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
6cc0: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
6cd0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
6ce0: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
6cf0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
6d00: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
6d10: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
6d20: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
6d30: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
6d40: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
6d50: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
6d60: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
6d70: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
6d80: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
6d90: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
6da0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
6db0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
6dc0: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
6dd0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
6de0: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
6df0: 20 69 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61   int n;..  relea
6e00: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
6e10: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
6e20: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
6e30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
6e40: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20  (p->aColName);. 
6e50: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
6e60: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
6e70: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  nResColumn = nRe
6e80: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
6e90: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
6ea0: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
6eb0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d  3DbMallocZero(p-
6ec0: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  >db, sizeof(Mem)
6ed0: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
6ee0: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
6ef0: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
6f00: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
6f10: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
6f20: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
6f30: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
6f40: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
6f50: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
6f60: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
6f70: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
6f80: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
6f90: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
6fa0: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
6fb0: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
6fc0: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
6fd0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
6fe0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
6ff0: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
7000: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
7010: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
7020: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d  ()..**.** If N==
7030: 50 33 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65  P3_STATIC  it me
7040: 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69  ans that zName i
7050: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
7060: 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63   constant static
7070: 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77  .** string and w
7080: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
7090: 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20  the pointer. If 
70a0: 69 74 20 69 73 20 50 33 5f 44 59 4e 41 4d 49 43  it is P3_DYNAMIC
70b0: 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73  , then .** the s
70c0: 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20 75  tring is freed u
70d0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
70e0: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
70f0: 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69  e is finished wi
7100: 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77  th.** it. Otherw
7110: 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20  ise, N bytes of 
7120: 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64  zName are copied
7130: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7140: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56  VdbeSetColName(V
7150: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  dbe *p, int idx,
7160: 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20   int var, const 
7170: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
7180: 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   N){.  int rc;. 
7190: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
71a0: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
71b0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
71c0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
71d0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
71e0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
71f0: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
7200: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73  ITE_NOMEM;.  ass
7210: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
7220: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
7230: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
7240: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
7250: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28  sColumn]);.  if(
7260: 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 7c   N==P3_DYNAMIC |
7270: 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 29  | N==P3_STATIC )
7280: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7290: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
72a0: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
72b0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
72c0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
72d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
72e0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
72f0: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
7300: 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c  e, zName, N, SQL
7310: 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f  ITE_UTF8,SQLITE_
7320: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
7330: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7340: 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f 44 59 4e  _OK && N==P3_DYN
7350: 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c  AMIC ){.    pCol
7360: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 28 70  Name->flags = (p
7370: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 28  ColName->flags&(
7380: 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29 7c 4d 45  ~MEM_Static))|ME
7390: 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e  M_Dyn;.    pColN
73a0: 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  ame->xDel = 0;. 
73b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
73c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
73d0: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
73e0: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
73f0: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
7400: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7410: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
7420: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
7430: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
7440: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
7450: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7460: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
7470: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
7480: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
7490: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
74a0: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
74b0: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
74c0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
74d0: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
74e0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
74f0: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
7500: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
7510: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
7520: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
7530: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
7540: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7550: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
7560: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20  dXcommit = 0;.. 
7570: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
7580: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
7590: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
75a0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
75b0: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
75c0: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
75d0: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
75e0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
75f0: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
7600: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
7610: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
7620: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7630: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
7640: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
7650: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
7660: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
7670: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
7680: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
7690: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
76a0: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
76b0: 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20 72  db, rc);.  if( r
76c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
76d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
76e0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f   }..  /* This lo
76f0: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
7700: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
7710: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
7720: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
7730: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
7740: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
7750: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
7760: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
7770: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
7780: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
7790: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
77a0: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
77b0: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
77c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
77d0: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
77e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
77f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
7800: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
7810: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
7820: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
7830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
7840: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
7850: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7860: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7870: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
7880: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
7890: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58  ) ){.      needX
78a0: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
78b0: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72    if( i!=1 ) nTr
78c0: 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ans++;.    }.  }
78d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
78e0: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
78f0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
7900: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
7910: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
7920: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
7930: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
7940: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  lback ){.    sql
7950: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
7960: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  );.    rc = db->
7970: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
7980: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
7990: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
79a0: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
79b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
79c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
79d0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
79e0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
79f0: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
7a00: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
7a10: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
7a20: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
7a30: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
7a40: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
7a50: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
7a60: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
7a70: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
7a80: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
7a90: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
7aa0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
7ab0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
7ac0: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
7ad0: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
7ae0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
7af0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
7b00: 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68  :memory:.  In th
7b10: 61 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20  at case we do.  
7b20: 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  ** not support a
7b30: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
7b40: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
7b50: 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   the simple case
7b60: 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a   then.  ** too..
7b70: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74    */.  if( 0==st
7b80: 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  rlen(sqlite3Btre
7b90: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
7ba0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c  >aDb[0].pBt)) ||
7bb0: 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20   nTrans<=1 ){.  
7bc0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
7bd0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
7be0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
7bf0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
7c00: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7c10: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
7c20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
7c30: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
7c40: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
7c50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7c60: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
7c70: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
7c80: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
7c90: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
7ca0: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
7cb0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
7cc0: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
7cd0: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
7ce0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
7cf0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
7d00: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
7d10: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
7d20: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
7d30: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
7d40: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
7d50: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
7d60: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
7d70: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
7d80: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
7d90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
7da0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
7db0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
7dc0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
7dd0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
7de0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
7df0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
7e00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7e10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
7e20: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
7e30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7e40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7e50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7e60: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
7e70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
7e80: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
7e90: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
7ea0: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
7eb0: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
7ec0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
7ed0: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
7ee0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
7ef0: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
7f00: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
7f10: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
7f20: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
7f30: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
7f40: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
7f50: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
7f60: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
7f70: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
7f80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
7f90: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
7fa0: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
7fb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
7fc0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
7fd0: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
7fe0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
7ff0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
8000: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
8010: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
8020: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
8030: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  set = 0;..    /*
8040: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
8050: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8060: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
8070: 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b       u32 random;
8080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8090: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
80a0: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
80b0: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e  mness(sizeof(ran
80c0: 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a  dom), &random);.
80d0: 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20        zMaster = 
80e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
80f0: 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20  b, "%s-mj%08X", 
8100: 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f  zMainFile, rando
8110: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
8120: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
8130: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
8140: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  ;.      }.    }w
8160: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73 41  hile( sqlite3OsA
8170: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
8180: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
8190: 53 53 5f 45 58 49 53 54 53 29 20 29 3b 0a 0a 20  SS_EXISTS) );.. 
81a0: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
81b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
81c0: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
81d0: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
81e0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
81f0: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
8200: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
8210: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
8220: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
8230: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
8240: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
8250: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
8260: 4e 41 4c 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  NAL, 0.    );.  
8270: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8280: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
8290: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
82a0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
82b0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
82c0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
82d0: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
82e0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
82f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
8300: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
8310: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8320: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
8330: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
8340: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
8350: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
8360: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8370: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
8380: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
8390: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
83a0: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
83b0: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
83c0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
83d0: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
83e0: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
83f0: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
8400: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
8410: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
8420: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
8430: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
8440: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
8450: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
8460: 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  f( i==1 ) contin
8470: 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  ue;   /* Ignore 
8480: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
8490: 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  e */.      if( s
84a0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
84b0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
84c0: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
84d0: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
84e0: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
84f0: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
8500: 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
8510: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
8520: 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79  * Ignore :memory
8530: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
8540: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
8550: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
8560: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
8570: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
8580: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
8590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
85a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
85b0: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
85c0: 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a   zFile, strlen(z
85d0: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
85e0: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
85f0: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65   += strlen(zFile
8600: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
8610: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8620: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8630: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
8640: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
8650: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
8660: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
8670: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
8680: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
8690: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
86a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
86b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
86c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
86d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
86e0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
86f0: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
8700: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
8710: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
8720: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
8730: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
8740: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
8750: 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
8760: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
8770: 0a 20 20 20 20 69 66 28 20 28 6e 65 65 64 53 79  .    if( (needSy
8780: 6e 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d  nc .     && (0==
8790: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
87a0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
87b0: 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
87c0: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
87d0: 29 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73  )).     && (rc=s
87e0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
87f0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
8800: 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49  C_NORMAL))!=SQLI
8810: 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
8820: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
8830: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
8840: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
8850: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
8860: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8870: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8880: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8890: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
88a0: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
88b0: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
88c0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
88d0: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
88e0: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
88f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8900: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
8910: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
8920: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
8930: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8940: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
8950: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
8960: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
8970: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
8980: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
8990: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
89a0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
89b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
89c0: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
89d0: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
89e0: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
89f0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
8a00: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
8a10: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
8a20: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
8a30: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
8a40: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8a50: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
8a60: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
8a70: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
8a80: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
8a90: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
8aa0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
8ab0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
8ac0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
8ad0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
8ae0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8af0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8b00: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
8b10: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8b20: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
8b30: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
8b40: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
8b50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
8b60: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
8b70: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
8b80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8ba0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
8bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8bc0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
8bd0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8be0: 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
8bf0: 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
8c00: 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
8c10: 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
8c20: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
8c30: 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
8c40: 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
8c50: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
8c60: 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
8c70: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
8c80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8c90: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
8ca0: 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
8cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
8cc0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
8cd0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
8ce0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
8cf0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
8d00: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
8d10: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
8d20: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
8d30: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
8d40: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
8d50: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
8d60: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8d70: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
8d80: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
8d90: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
8da0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
8db0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
8dc0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
8dd0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
8de0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
8df0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
8e00: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
8e10: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
8e20: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
8e30: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
8e40: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
8e50: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
8e60: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
8e70: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
8e80: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
8e90: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
8ea0: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
8eb0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
8ec0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
8ed0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 66 6f 72 28  rors();.    for(
8ee0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
8ef0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
8f00: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8f10: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
8f20: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
8f30: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
8f40: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
8f50: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8f60: 7d 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  }.    enable_sim
8f70: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
8f80: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
8f90: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
8fa0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
8fb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
8fc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8fd0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
8fe0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
8ff0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
9000: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
9010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
9020: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
9030: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
9040: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
9050: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
9060: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
9070: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
9080: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
9090: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
90a0: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
90b0: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
90c0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
90d0: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
90e0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
90f0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
9100: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
9110: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
9120: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
9130: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
9140: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9150: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
9160: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  cnt = 0;.  p = d
9170: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
9180: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
9190: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
91a0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
91b0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
91c0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t++;.    }.    p
91d0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
91e0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
91f0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
9200: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
9210: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
9220: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
9230: 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  f../*.** For eve
9240: 72 79 20 42 74 72 65 65 20 74 68 61 74 20 69 6e  ry Btree that in
9250: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9260: 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a  tion db which .*
9270: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
9280: 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69  ied, "trip" or i
9290: 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68 20 63  nvalidate each c
92a0: 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74  ursor in.** that
92b0: 20 42 74 72 65 65 20 6d 69 67 68 74 20 68 61 76   Btree might hav
92c0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
92d0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 75 72 73  so that the curs
92e0: 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20  or.** can never 
92f0: 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20  be used again.  
9300: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
9310: 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a  n a rollback.***
9320: 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61 76   occurs.  We hav
9330: 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68  e to trip all th
9340: 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c  e other cursors,
9350: 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20   even.** cursor 
9360: 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69  from other VMs i
9370: 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61  n different data
9380: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
9390: 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e  ,.** so that non
93a0: 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f  e of them try to
93b0: 20 75 73 65 20 74 68 65 20 64 61 74 61 20 61 74   use the data at
93c0: 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77   which they.** w
93d0: 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64  ere pointing and
93e0: 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68   which now may h
93f0: 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64  ave been changed
9400: 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72   due.** to the r
9410: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  ollback..**.** R
9420: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 72  emember that a r
9430: 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65  ollback can dele
9440: 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65  te tables comple
9450: 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65  te and.** reorde
9460: 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f  r rootpages.  So
9470: 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
9480: 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61  cient just to sa
9490: 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ve.** the state 
94a0: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
94b0: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c  We have to inval
94c0: 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  idate the cursor
94d0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69  .** so that it i
94e0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 67 61  s never used aga
94f0: 69 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 69 6e 76 61  in..*/.void inva
9500: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
9510: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71  odifiedBtrees(sq
9520: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
9530: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
9540: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9550: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
9560: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
9570: 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c      if( p && sql
9580: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
9590: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ns(p) ){.      s
95a0: 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
95b0: 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c  llCursors(p, SQL
95c0: 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  ITE_ABORT);.    
95d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
95e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
95f0: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
9600: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
9610: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
9620: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
9630: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
9640: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
9650: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
9660: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
9670: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
9680: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
9690: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
96a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
96b0: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
96c0: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
96d0: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
96e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
96f0: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
9700: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
9710: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
9720: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
9730: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
9740: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
9750: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
9760: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
9770: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
9780: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
9790: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
97a0: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
97b0: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
97c0: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
97d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
97e0: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
97f0: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
9800: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
9810: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
9820: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
9830: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
9840: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
9850: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
9860: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28    int i;.  int (
9870: 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70  *xFunc)(Btree *p
9880: 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e  Bt) = 0;  /* Fun
9890: 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e  ction to call on
98a0: 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b   each btree back
98b0: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  end */.  int isS
98c0: 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
98d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
98e0: 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45  o true if SQLITE
98f0: 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20  _NOMEM or IOERR 
9900: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
9910: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
9920: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
9930: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
9940: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
9950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
9960: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
9970: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
9980: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
9990: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
99a0: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
99b0: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
99c0: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
99d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
99e0: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
99f0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
9a00: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
9a10: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
9a20: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
9a30: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
9a40: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
9a50: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
9a60: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
9a70: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
9a80: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
9a90: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
9aa0: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
9ab0: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
9ac0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
9ad0: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
9ae0: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
9af0: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
9b00: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
9b10: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
9b20: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
9b30: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
9b40: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
9b50: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
9b60: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
9b70: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
9b80: 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a  ActiveVtabs(p);.
9b90: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
9ba0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
9bb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9bc0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
9bd0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
9be0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
9bf0: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
9c00: 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
9c10: 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
9c20: 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  arted */.  if( p
9c30: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69  ->pc>=0 ){.    i
9c40: 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
9c50: 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
9c60: 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20  from p->rc */.. 
9c70: 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
9c80: 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
9c90: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
9ca0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
9cb0: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26  utexArrayEnter(&
9cc0: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20  p->aMutex);..   
9cd0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
9ce0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
9cf0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
9d00: 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
9d10: 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
9d20: 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
9d30: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
9d40: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
9d70: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
9d80: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
9d90: 20 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65   ;.    if( isSpe
9da0: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
9db0: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
9dc0: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
9dd0: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
9de0: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
9df0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
9e00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
9e10: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
9e20: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
9e30: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
9e40: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
9e50: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
9e60: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9e70: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  al.      **     
9e80: 51 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74  Query without st
9e90: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
9ea0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
9eb0: 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f  * We could do so
9ec0: 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65  mething more ele
9ed0: 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73  gant than this s
9ee0: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28  tatic analysis (
9ef0: 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  i.e..      ** st
9f00: 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ore the type of 
9f10: 71 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66  query as part of
9f20: 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e   the compliation
9f30: 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20   phase), but .  
9f40: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20      ** handling 
9f50: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
9f60: 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72  ailure is a fair
9f70: 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20  ly obscure edge 
9f80: 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a  case so .      *
9f90: 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62  * this is probab
9fa0: 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a  ly easier. Todo:
9fb0: 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70   Might be an opp
9fc0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75  ortunity to redu
9fd0: 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ce .      ** cod
9fe0: 65 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d  e size a very sm
9ff0: 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67  all amount thoug
a000: 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  h....      */.  
a010: 20 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f      int notReadO
a020: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  nly = 0;.      i
a030: 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d  nt isStatement =
a040: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
a050: 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f  (p->aOp || p->nO
a060: 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p==0);.      for
a070: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
a080: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73  i++){ .        s
a090: 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d  witch( p->aOp[i]
a0a0: 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  .opcode ){.     
a0b0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
a0c0: 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20  nsaction:.      
a0d0: 20 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c        notReadOnl
a0e0: 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  y |= p->aOp[i].p
a0f0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  2;.            b
a100: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a110: 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e  case OP_Statemen
a120: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t:.            i
a130: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a  sStatement = 1;.
a140: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a150: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
a160: 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20     }..   .      
a170: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
a180: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
a190: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
a1a0: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
a1b0: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
a1c0: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
a1d0: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
a1e0: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
a1f0: 20 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f      if( notReadO
a200: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
a210: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
a220: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
a230: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
a240: 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61  BLOCKED && isSta
a250: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
a260: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
a270: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a280: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
a290: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
a2a0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
a2b0: 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51  lse if( (mrc==SQ
a2c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
a2d0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
a2e0: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
a2f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
a300: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a310: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
a320: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a330: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
a340: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
a350: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
a360: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
a370: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
a380: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
a390: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
a3a0: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
a3b0: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
a3c0: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
a3d0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
a3e0: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
a3f0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
a400: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
a410: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a420: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
a430: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
a440: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
a450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a460: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
a470: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
a480: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
a490: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
a4a0: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
a4b0: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
a4c0: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
a4d0: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
a4e0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
a4f0: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
a500: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
a510: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
a520: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
a530: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
a540: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
a550: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
a560: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
a570: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
a580: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
a590: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
a5a0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
a5b0: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
a5c0: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
a5d0: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
a5e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
a5f0: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
a600: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
a610: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
a620: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
a630: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
a640: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
a650: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
a660: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
a670: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
a680: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
a690: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
a6a0: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
a6b0: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  t(db);.        i
a6c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
a6d0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
a6e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
a6f0: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
a700: 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
a710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a720: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
a730: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
a740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a750: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
a760: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a770: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
a780: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a790: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a7a0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
a7b0: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
a7c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a7d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a7e0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
a7f0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
a800: 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63  }else if( !xFunc
a810: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
a820: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
a830: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
a840: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
a850: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
a860: 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  edStatement ){. 
a870: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
a880: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
a890: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  mitStmt;.       
a8a0: 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   } .      }else 
a8b0: 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
a8c0: 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
a8d0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
a8e0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
a8f0: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
a900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a910: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
a920: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
a930: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
a940: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
a950: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
a960: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
a970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a980: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
a990: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
a9a0: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
a9b0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
a9c0: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
a9d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
a9e0: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
a9f0: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
aa00: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
aa10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
aa20: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
aa30: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
aa40: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
aa50: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
aa60: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
aa70: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
aa80: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
aa90: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
aaa0: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
aab0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
aac0: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
aad0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
aae0: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
aaf0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
ab00: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
ab10: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
ab20: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
ab30: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ab40: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ab50: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ab60: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
ab70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ab80: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
ab90: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
aba0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
abb0: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
abc0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
abd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
abe0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
abf0: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
ac00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ac10: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
ac20: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
ac30: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
ac40: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
ac50: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
ac60: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
ac70: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
ac80: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
ac90: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
aca0: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
acb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
acc0: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
acd0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
ace0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
acf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
ad00: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
ad10: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
ad20: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ad30: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
ad40: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
ad50: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
ad60: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
ad70: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
ad80: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
ad90: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
ada0: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
adb0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
adc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
add0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
ade0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
adf0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
ae00: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
ae10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
ae20: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
ae30: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
ae40: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
ae50: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
ae60: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
ae70: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
ae80: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
ae90: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
aea0: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
aeb0: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
aec0: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
aed0: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
aee0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
aef0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
af00: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
af10: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
af20: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
af30: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
af40: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
af50: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
af60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
af70: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
af80: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
af90: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
afa0: 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e  t(db);..  return
afb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
afc0: 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
afd0: 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
afe0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
aff0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
b000: 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
b010: 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
b020: 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
b030: 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
b040: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
b050: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
b060: 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
b070: 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
b080: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b090: 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
b0a0: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
b0b0: 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
b0c0: 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
b0d0: 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
b0e0: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
b0f0: 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
b100: 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
b110: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
b120: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
b130: 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
b140: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
b150: 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
b160: 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
b170: 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
b180: 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
b190: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
b1a0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
b1b0: 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
b1c0: 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
b1d0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
b1e0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
b1f0: 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
b200: 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
b210: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
b220: 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
b230: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
b240: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
b250: 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
b260: 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
b270: 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
b280: 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
b290: 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
b2a0: 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
b2b0: 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
b2c0: 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
b2d0: 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
b2e0: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
b2f0: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
b300: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 73  VdbeHalt(p);.  s
b310: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
b320: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
b330: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
b340: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
b350: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
b360: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
b370: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
b380: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
b390: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
b3a0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
b3b0: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
b3c0: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
b3d0: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
b3e0: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
b3f0: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
b400: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
b410: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
b420: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
b430: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
b440: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
b450: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
b460: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
b470: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
b480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
b490: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
b4a0: 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
b4b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69  SQLITE_UTF8,sqli
b4c0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20  te3_free);.     
b4d0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
b4e0: 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ->rc;.      p->z
b4f0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
b500: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
b510: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b520: 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
b530: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
b540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b550: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
b560: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
b570: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
b580: 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
b590: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
b5a0: 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
b5b0: 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
b5c0: 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
b5d0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
b5e0: 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
b5f0: 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
b600: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
b610: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
b620: 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
b630: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
b640: 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
b650: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
b660: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
b670: 3e 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  >rc, 0);.  }..  
b680: 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
b690: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
b6a0: 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
b6b0: 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
b6c0: 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
b6d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
b6e0: 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
b6f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b700: 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b  >pTos<&p->aStack
b710: 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63  [p->pc<0?0:p->pc
b720: 5d 20 7c 7c 20 21 70 2d 3e 61 53 74 61 63 6b 20  ] || !p->aStack 
b730: 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  );.#ifdef VDBE_P
b740: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
b750: 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
b760: 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
b770: 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
b780: 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
b790: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
b7a0: 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
b7b0: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
b7c0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
b7d0: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
b7e0: 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
b7f0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
b800: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b810: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
b820: 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  n");.      for(i
b830: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
b840: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
b850: 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31  ntf(out, "%6d %1
b860: 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20  0lld %8lld ",.  
b870: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
b880: 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
b890: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
b8a0: 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
b8b0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
b8c0: 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
b8d0: 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
b8e0: 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
b8f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b900: 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
b910: 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
b920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
b930: 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
b940: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
b950: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
b960: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61  GIC_INIT;.  p->a
b970: 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72 65  borted = 0;.  re
b980: 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
b990: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
b9a0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
b9b0: 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
b9c0: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
b9d0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
b9e0: 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
b9f0: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
ba00: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
ba10: 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
ba20: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
ba30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
ba40: 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
ba50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ba60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
ba70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
ba80: 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
ba90: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
baa0: 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
bab0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
bac0: 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
bad0: 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
bae0: 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
baf0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61   }else if( p->ma
bb00: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
bb10: 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  INIT ){.    retu
bb20: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
bb30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
bb40: 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
bb50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bb60: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
bb70: 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
bb80: 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
bb90: 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
bba0: 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
bbb0: 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
bbc0: 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
bbd0: 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
bbe0: 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
bbf0: 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
bc00: 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
bc10: 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
bc20: 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
bc30: 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
bc40: 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
bc50: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
bc60: 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
bc70: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
bc80: 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
bc90: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
bca0: 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
bcb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
bcc0: 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
bcd0: 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
bce0: 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
bcf0: 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
bd00: 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78  (1<<i))) && pAux
bd10: 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20  ->pAux ){.      
bd20: 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
bd30: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
bd40: 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
bd50: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
bd60: 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78        pAux->pAux
bd70: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
bd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
bd90: 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
bda0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
bdb0: 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
bdc0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
bdd0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
bde0: 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  ;.  Cleanup(p);.
bdf0: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
be00: 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
be10: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
be20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
be30: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56  ssert( p->db->pV
be40: 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d  dbe==p );.    p-
be50: 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e  >db->pVdbe = p->
be60: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
be70: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
be80: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
be90: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
bea0: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
beb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bec0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
bed0: 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70      Op *pOp = &p
bee0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20  ->aOp[i];.      
bef0: 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79  freeP3(pOp->p3ty
bf00: 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  pe, pOp->p3);.  
bf10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
bf20: 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  free(p->aOp);.  
bf30: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
bf40: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
bf50: 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  nVar);.  sqlite3
bf60: 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29  _free(p->aLabel)
bf70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
bf80: 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72  (p->aStack);.  r
bf90: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
bfa0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
bfb0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
bfc0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_N);.  sqlite3_
bfd0: 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  free(p->aColName
bfe0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
bff0: 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d  e(p->zSql);.  p-
c000: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
c010: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
c020: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
c030: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
c040: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
c050: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
c060: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
c070: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
c080: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
c090: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
c0a0: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
c0b0: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
c0c0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
c0d0: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
c0e0: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
c0f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
c100: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
c110: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
c120: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
c130: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
c140: 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
c150: 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
c160: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
c170: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
c180: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
c190: 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
c1a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c1b0: 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72  eeMoveto(p->pCur
c1c0: 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
c1d0: 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
c1e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c1f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a  return rc;.    *
c200: 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b  p->pIncrKey = 0;
c210: 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
c220: 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e  d = keyToInt(p->
c230: 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20  movetoTarget);. 
c240: 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
c250: 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20  id = res==0;.   
c260: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
c270: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c280: 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75  BtreeNext(p->pCu
c290: 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
c2a0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
c2b0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66  rn rc;.    }.#if
c2c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
c2d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
c2e0: 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
c2f0: 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
c300: 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
c310: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
c320: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
c330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c340: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c350: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
c360: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
c370: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c380: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
c390: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
c3a0: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
c3b0: 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29  VdbeSerialRead()
c3c0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c3d0: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
c3e0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57  lite3VdbeSerialW
c3f0: 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  rite().**.** enc
c400: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
c410: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
c420: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
c430: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
c440: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
c450: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
c460: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
c470: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
c480: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
c490: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
c4a0: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
c4b0: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
c4c0: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
c4d0: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
c4e0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
c4f0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
c500: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
c510: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
c520: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
c530: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
c540: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
c550: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
c560: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
c570: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
c580: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
c590: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
c5a0: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
c5b0: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
c5c0: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
c5d0: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
c5e0: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
c5f0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
c600: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
c610: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
c620: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
c630: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
c640: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
c650: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
c660: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
c670: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
c680: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
c690: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
c6a0: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
c6b0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
c6c0: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
c6d0: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
c6f0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
c700: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
c710: 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
c720: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
c730: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
c740: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c750: 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
c780: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
c790: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
c7a0: 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
c7b0: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
c7c0: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
c7f0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
c800: 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
c820: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
c830: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
c840: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
c850: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
c860: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
c870: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
c8a0: 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
c8b0: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
c8c0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
c8d0: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
c8e0: 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
c8f0: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
c900: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
c910: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
c920: 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
c930: 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
c960: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
c970: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
c980: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
c990: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
c9a0: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
c9b0: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
c9c0: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
c9d0: 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
c9e0: 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
c9f0: 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
ca00: 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
ca10: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
ca20: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
ca30: 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
ca40: 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
ca50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
ca60: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
ca70: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
ca80: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
ca90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
caa0: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
cab0: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
cac0: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
cad0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
cae0: 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  int n;..  if( fl
caf0: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
cb00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cb10: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
cb20: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
cb30: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
cb40: 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
cb50: 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
cb60: 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
cb70: 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
cb80: 29 30 78 30 30 30 30 31 30 30 30 29 3c 3c 33 32  )0x00001000)<<32
cb90: 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
cba0: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
cbb0: 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66  u64 u;.    if( f
cbc0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26  ile_format>=4 &&
cbd0: 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20   (i&1)==i ){.   
cbe0: 20 20 20 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20     return 8+i;. 
cbf0: 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30     }.    u = i<0
cc00: 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69   ? -i : i;.    i
cc10: 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75  f( u<=127 ) retu
cc20: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 1;.    if( u<
cc30: 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20  =32767 ) return 
cc40: 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33  2;.    if( u<=83
cc50: 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33  88607 ) return 3
cc60: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  ;.    if( u<=214
cc70: 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e  7483647 ) return
cc80: 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d   4;.    if( u<=M
cc90: 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72  AX_6BYTE ) retur
cca0: 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 5;.    return 
ccb0: 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
ccc0: 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
ccd0: 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
cce0: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
ccf0: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
cd00: 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
cd10: 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
cd20: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
cd30: 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
cd40: 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  .i;.  }.  assert
cd50: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( n>=0 );.  retu
cd60: 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
cd70: 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
cd80: 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
cd90: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
cda0: 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
cdb0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
cdc0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
cdd0: 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74  ial-type..*/.int
cde0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
cdf0: 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
ce00: 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
ce10: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
ce20: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
ce30: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
ce40: 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
ce50: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
ce60: 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
ce70: 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
ce80: 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
ce90: 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
cea0: 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
ceb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
cec0: 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
ced0: 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
cee0: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
cef0: 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
cf00: 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
cf10: 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
cf20: 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
cf30: 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
cf40: 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
cf50: 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
cf60: 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
cf70: 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
cf80: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
cf90: 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
cfa0: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
cfb0: 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
cfc0: 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
cfd0: 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
cfe0: 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
cff0: 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
d000: 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
d010: 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
d020: 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
d030: 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
d040: 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
d050: 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
d060: 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
d070: 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
d080: 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
d090: 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
d0a0: 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
d0b0: 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
d0c0: 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
d0d0: 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
d0e0: 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
d0f0: 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
d100: 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
d110: 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
d120: 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
d130: 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
d140: 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
d150: 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
d160: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
d170: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
d180: 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
d190: 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
d1a0: 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
d1b0: 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
d1c0: 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
d1d0: 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
d1e0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
d1f0: 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
d200: 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
d210: 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
d220: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
d230: 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
d240: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
d250: 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
d260: 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
d270: 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
d280: 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
d290: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
d2a0: 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
d2b0: 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
d2c0: 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
d2d0: 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
d2e0: 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
d2f0: 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
d300: 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
d310: 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
d320: 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
d330: 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
d340: 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
d350: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
d360: 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
d370: 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
d380: 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
d390: 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
d3a0: 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
d3b0: 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
d3c0: 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
d3d0: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
d3e0: 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
d3f0: 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
d400: 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
d410: 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
d420: 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
d430: 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
d440: 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
d450: 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
d460: 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
d470: 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
d480: 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
d490: 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
d4a0: 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
d4b0: 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
d4c0: 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
d4d0: 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
d4e0: 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
d4f0: 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
d500: 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
d510: 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
d520: 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
d530: 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
d540: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
d550: 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
d560: 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
d570: 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
d580: 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
d590: 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
d5a0: 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
d5b0: 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
d5c0: 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
d5d0: 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
d5e0: 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
d5f0: 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
d600: 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
d610: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
d620: 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
d630: 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
d640: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
d650: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
d660: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
d670: 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
d680: 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
d690: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
d6a0: 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
d6b0: 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
d6c0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
d6d0: 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
d6e0: 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
d6f0: 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
d700: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
d710: 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
d720: 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
d730: 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
d740: 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
d750: 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79   nBuf must alway
d760: 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e  s be.** large en
d770: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
d780: 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20   entire field.  
d790: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66  Except, if the f
d7a0: 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f  ield is.** a blo
d7b0: 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69  b with a zero-fi
d7c0: 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20  lled tail, then 
d7d0: 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a  buf[] might be j
d7e0: 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a  ust the right.**
d7f0: 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76   size to hold ev
d800: 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20  erything except 
d810: 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c  for the zero-fil
d820: 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75  led tail.  If bu
d830: 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62  f[].** is only b
d840: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
d850: 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70  d the non-zero p
d860: 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79  refix, then only
d870: 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70   write that.** p
d880: 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d  refix into buf[]
d890: 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20  .  But if buf[] 
d8a0: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
d8b0: 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
d8c0: 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74  .** prefix and t
d8d0: 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69  he tail then wri
d8e0: 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e  te the prefix an
d8f0: 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74  d set the tail t
d900: 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a  o all.** zeros..
d910: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
d920: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d930: 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
d940: 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
d950: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
d960: 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
d970: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
d980: 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
d990: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
d9a0: 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
d9b0: 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
d9c0: 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69   in buf[]..*/ .i
d9d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
d9e0: 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
d9f0: 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a   int nBuf, Mem *
da00: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
da10: 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65  ormat){.  u32 se
da20: 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
da30: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
da40: 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72  e(pMem, file_for
da50: 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  mat);.  int len;
da60: 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
da70: 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
da80: 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
da90: 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
daa0: 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
dab0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
dac0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
dad0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
dae0: 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
daf0: 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a  eof(pMem->r) );.
db00: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
db10: 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f   &pMem->r, sizeo
db20: 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
db30: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
db40: 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
db50: 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
db60: 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
db70: 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
db80: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
db90: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
dba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e  .    assert( len
dbb0: 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68  <=nBuf );.    wh
dbc0: 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
dbd0: 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78    buf[i] = (v&0x
dbe0: 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
dbf0: 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
dc00: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
dc10: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
dc20: 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
dc30: 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
dc40: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
dc50: 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
dc60: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
dc70: 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20 20 20  Mem->u.i:0).    
dc80: 20 20 20 20 20 20 20 20 20 3d 3d 20 73 71 6c 69           == sqli
dc90: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
dca0: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
dcb0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
dcc0: 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29   pMem->n<=nBuf )
dcd0: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
dce0: 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
dcf0: 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
dd00: 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  n);.    if( pMem
dd10: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
dd20: 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20  ro ){.      len 
dd30: 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20  += pMem->u.i;.  
dd40: 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66      if( len>nBuf
dd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
dd60: 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a  = nBuf;.      }.
dd70: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75        memset(&bu
dd80: 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c  f[pMem->n], 0, l
dd90: 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20  en-pMem->n);.   
dda0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
ddb0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
ddc0: 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
ddd0: 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
dde0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
ddf0: 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
de00: 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
de10: 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
de20: 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
de30: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
de40: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
de50: 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
de60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
de70: 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20  s read..*/ .int 
de80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
de90: 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
dea0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
deb0: 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
dec0: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
ded0: 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
dee0: 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
def0: 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
df00: 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
df10: 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
df20: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
df30: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
df40: 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
df50: 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
df60: 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
df70: 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
df80: 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
df90: 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
dfa0: 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
dfb0: 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
dfc0: 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
dfd0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
dfe0: 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
dff0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e000: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
e010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e020: 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
e030: 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
e040: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
e050: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e  Mem->u.i = (sign
e060: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
e070: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e080: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e090: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
e0a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
e0b0: 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
e0c0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e0d0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
e0e0: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
e0f0: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
e100: 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
e110: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
e120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
e130: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e140: 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
e150: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
e160: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
e170: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
e180: 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
e190: 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
e1a0: 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
e1b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e1c0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
e1d0: 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
e1e0: 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
e1f0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
e200: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
e210: 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32  u.i = (buf[0]<<2
e220: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
e230: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
e240: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
e250: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e260: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
e270: 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
e280: 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
e290: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
e2a0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  ger */.      u64
e2b0: 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63   x = (((signed c
e2c0: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
e2d0: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
e2e0: 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c  u32 y = (buf[2]<
e2f0: 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c  <24) | (buf[3]<<
e300: 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38  16) | (buf[4]<<8
e310: 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20  ) | buf[5];.    
e320: 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
e330: 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  y;.      pMem->u
e340: 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
e350: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e360: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e370: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
e380: 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
e390: 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
e3a0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e3b0: 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
e3c0: 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
e3d0: 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  t */.      u64 x
e3e0: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23  ;.      u32 y;.#
e3f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
e400: 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
e410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
e420: 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
e430: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
e440: 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
e450: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
e460: 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
e470: 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  .      ** byte o
e480: 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
e490: 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
e4a0: 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
e4b0: 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  AT is.      ** d
e4c0: 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
e4d0: 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
e4e0: 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
e4f0: 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20  are mixed.      
e500: 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20  ** endian..     
e510: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
e520: 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
e530: 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
e540: 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61  )<<32;.      sta
e550: 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
e560: 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20   r1 = 1.0;.     
e570: 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
e580: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
e590: 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
e5a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e5b0: 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
e5c0: 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
e5d0: 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
e5e0: 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
e5f0: 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b  .      x = (buf[
e600: 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
e610: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
e620: 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
e630: 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d       y = (buf[4]
e640: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c  <<24) | (buf[5]<
e650: 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c  <16) | (buf[6]<<
e660: 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20  8) | buf[7];.   
e670: 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
e680: 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   y;.      if( se
e690: 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
e6a0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e          pMem->u.
e6b0: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
e6c0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
e6d0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6f0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e700: 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
e710: 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b  f(pMem->r)==8 );
e720: 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78  .        swapMix
e730: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
e740: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
e750: 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73  (&pMem->r, &x, s
e760: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
e770: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e780: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
e790: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
e7a0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  8;.    }.    cas
e7b0: 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
e7c0: 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
e7d0: 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
e7e0: 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  r 1 */.      pMe
e7f0: 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
e800: 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
e810: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e820: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e830: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
e840: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
e850: 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61  int len = (seria
e860: 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
e870: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
e880: 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20  har *)buf;.     
e890: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a   pMem->n = len;.
e8a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c        pMem->xDel
e8b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
e8c0: 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31  serial_type&0x01
e8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
e8e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
e8f0: 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  r | MEM_Ephem;. 
e900: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e910: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e920: 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d  = MEM_Blob | MEM
e930: 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  _Ephem;.      }.
e940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e        return len
e950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e960: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e970: 20 54 68 65 20 68 65 61 64 65 72 20 6f 66 20 61   The header of a
e980: 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73   record consists
e990: 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20 76   of a sequence v
e9a0: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
e9b0: 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73  ntegers..** Thes
e9c0: 65 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 61  e integers are a
e9d0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d 61  lmost always sma
e9e0: 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f 64  ll and are encod
e9f0: 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62  ed as a single b
ea00: 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  yte..** The foll
ea10: 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65  owing macro take
ea20: 73 20 61 64 76 61 6e 74 61 67 65 20 74 68 69 73  s advantage this
ea30: 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64 65   fact to provide
ea40: 20 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a 2a   a fast decode.*
ea50: 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  * of the integer
ea60: 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68 65  s in a record he
ea70: 61 64 65 72 2e 20 20 49 74 20 69 73 20 66 61 73  ader.  It is fas
ea80: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
ea90: 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65  on case.** where
eaa0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   the integer is 
eab0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20 20  a single byte.  
eac0: 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73  It is a little s
ead0: 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a 2a  lower when the.*
eae0: 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74 77 6f  * integer is two
eaf0: 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e 20   or more bytes. 
eb00: 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74 20   But overall it 
eb10: 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  is faster..**.**
eb20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   The following e
eb30: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65  xpressions are e
eb40: 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a  quivalent:.**.**
eb50: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
eb60: 47 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c 20  GetVarint32( A, 
eb70: 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20  &B );.**.**     
eb80: 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20 41  x = GetVarint( A
eb90: 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65  , B );.**.*/.#de
eba0: 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28 41  fine GetVarint(A
ebb0: 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29 29  ,B)  ((B = *(A))
ebc0: 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71 6c  <=0x7f ? 1 : sql
ebd0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
ebe0: 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  A, &B))../*.** T
ebf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
ec00: 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
ec10: 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
ec20: 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66  x records specif
ec30: 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79  ied by .** {nKey
ec40: 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e  1, pKey1} and {n
ec50: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65  Key2, pKey2}, re
ec60: 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69  turning a negati
ec70: 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
ec80: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
ec90: 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
eca0: 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
ecb0: 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
ecc0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b  greater than {nK
ecd0: 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f  ey2, pKey2}.  Bo
ece0: 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  th Key1 and Key2
ecf0: 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74   must be byte st
ed00: 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65  rings.** compose
ed10: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
ed20: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
ed30: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e   the VDBE..*/.in
ed40: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
ed50: 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  ordCompare(.  vo
ed60: 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20  id *userData,.  
ed70: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
ed80: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
ed90: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
eda0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
edb0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
edc0: 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a  Info = (KeyInfo*
edd0: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32  )userData;.  u32
ede0: 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20   d1, d2;        
edf0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
ee00: 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
ee10: 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
ee20: 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32    u32 idx1, idx2
ee30: 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  ;      /* Offset
ee40: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
ee50: 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
ee60: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
ee70: 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a  dr1, szHdr2;  /*
ee80: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ee90: 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
eea0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
eeb0: 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
eec0: 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
eed0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
eee0: 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
eef0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
ef00: 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  y1;.  const unsi
ef10: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32  gned char *aKey2
ef20: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
ef30: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b  ed char *)pKey2;
ef40: 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20  ..  Mem mem1;.  
ef50: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31  Mem mem2;.  mem1
ef60: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
ef70: 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
ef80: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
ef90: 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20 70 4b 65    mem2.enc = pKe
efa0: 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
efb0: 6d 32 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m2.db = pKeyInfo
efc0: 2d 3e 64 62 3b 0a 20 20 0a 20 20 69 64 78 31 20  ->db;.  .  idx1 
efd0: 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79  = GetVarint(aKey
efe0: 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31  1, szHdr1);.  d1
eff0: 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 64 78   = szHdr1;.  idx
f000: 32 20 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b  2 = GetVarint(aK
f010: 65 79 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20  ey2, szHdr2);.  
f020: 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e  d2 = szHdr2;.  n
f030: 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
f040: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
f050: 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
f060: 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b  & idx2<szHdr2 ){
f070: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
f080: 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73  type1;.    u32 s
f090: 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20  erial_type2;..  
f0a0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
f0b0: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
f0c0: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
f0d0: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
f0e0: 20 20 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56      idx1 += GetV
f0f0: 61 72 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78  arint( aKey1+idx
f100: 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
f110: 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e  );.    if( d1>=n
f120: 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56  Key1 && sqlite3V
f130: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f140: 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30  (serial_type1)>0
f150: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64   ) break;.    id
f160: 78 32 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28  x2 += GetVarint(
f170: 20 61 4b 65 79 32 2b 69 64 78 32 2c 20 73 65 72   aKey2+idx2, ser
f180: 69 61 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20  ial_type2 );.   
f190: 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26   if( d2>=nKey2 &
f1a0: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
f1b0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
f1c0: 6c 5f 74 79 70 65 32 29 3e 30 20 29 20 62 72 65  l_type2)>0 ) bre
f1d0: 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  ak;..    /* Extr
f1e0: 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
f1f0: 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
f200: 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
f210: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f220: 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
f230: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
f240: 6d 65 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d  mem1);.    d2 +=
f250: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
f260: 61 6c 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d  alGet(&aKey2[d2]
f270: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20  , serial_type2, 
f280: 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem2);..    /* 
f290: 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
f2a0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
f2b0: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
f2c0: 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32  are(&mem1, &mem2
f2d0: 2c 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65  , i<nField ? pKe
f2e0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
f2f0: 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65  : 0);.    if( me
f300: 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  m1.flags & MEM_D
f310: 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  yn ) sqlite3Vdbe
f320: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
f330: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e  );.    if( mem2.
f340: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
f350: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
f360: 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a  Release(&mem2);.
f370: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
f380: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f390: 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
f3a0: 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ..  /* One of th
f3b0: 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
f3c0: 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c  f fields, but al
f3d0: 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
f3e0: 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20  to that point.  
f3f0: 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  ** were equal. I
f400: 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c  f the incrKey fl
f410: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
f420: 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20   the second key 
f430: 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20  is.  ** treated 
f440: 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a  as larger..  */.
f450: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
f460: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
f470: 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20  >incrKey ){.    
f480: 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d    rc = -1;.    }
f490: 65 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79  else if( d1<nKey
f4a0: 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
f4b0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
f4c0: 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20   d2<nKey2 ){.   
f4d0: 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
f4e0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b  }.  }else if( pK
f4f0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
f500: 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f  er && i<pKeyInfo
f510: 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20  ->nField.       
f520: 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49          && pKeyI
f530: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
f540: 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d  i] ){.    rc = -
f550: 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
f560: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
f570: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
f580: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f  n index entry co
f590: 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65  mposed using the
f5a0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
f5b0: 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61  pcode..** The la
f5c0: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  st entry in this
f5d0: 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
f5e0: 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70  e an integer (sp
f5f0: 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e  ecifically.** an
f600: 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e   integer rowid).
f610: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
f620: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
f630: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a  r of bytes in.**
f640: 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a   that integer..*
f650: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f660: 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e  eIdxRowidLen(con
f670: 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
f680: 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
f690: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f6a0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
f6b0: 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
f6c0: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
f6d0: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20   the rowid */.. 
f6e0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
f6f0: 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72  t32(aKey, &szHdr
f700: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56  );.  sqlite3GetV
f710: 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a  arint32(&aKey[sz
f720: 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77  Hdr-1], &typeRow
f730: 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  id);.  return sq
f740: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
f750: 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
f760: 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  );.}.  ../*.** p
f770: 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
f780: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
f790: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
f7a0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
f7b0: 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
f7c0: 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
f7d0: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
f7e0: 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
f7f0: 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
f800: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f810: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
f820: 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
f830: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
f840: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f850: 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
f860: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
f870: 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
f880: 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
f890: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
f8a0: 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
f8b0: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
f8c0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
f8d0: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
f8e0: 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
f8f0: 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
f900: 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
f910: 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
f920: 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
f930: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
f940: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
f950: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
f960: 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
f970: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f980: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f990: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f9a0: 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
f9b0: 65 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  e(pCur, 0, nCell
f9c0: 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
f9d0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
f9e0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71  urn rc;.  }.  sq
f9f0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
fa00: 28 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64  ((u8*)m.z, &szHd
fa10: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
fa20: 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
fa30: 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79  .z[szHdr-1], &ty
fa40: 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52  peRowid);.  lenR
fa50: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
fa60: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
fa70: 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71  typeRowid);.  sq
fa80: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
fa90: 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
faa0: 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
fab0: 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
fac0: 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
fad0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
fae0: 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
faf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fb00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
fb10: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
fb20: 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
fb30: 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
fb40: 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  nt to against.**
fb50: 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
fb60: 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67  in pKey (of leng
fb70: 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65  th nKey).  Write
fb80: 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
fb90: 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
fba0: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
fbb0: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
fbc0: 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
fbd0: 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
fbe0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65  greater than pKe
fbf0: 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
fc00: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
fc10: 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65  .**.** pKey is e
fc20: 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
fc30: 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
fc40: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
fc50: 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
fc60: 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
fc70: 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
fc80: 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
fc90: 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
fca0: 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
fcb0: 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  s well..*/.int s
fcc0: 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
fcd0: 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f  Compare(.  Curso
fce0: 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
fcf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
fd00: 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
fd10: 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
fd20: 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20   nKey, const u8 
fd30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
fd40: 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  key to compare *
fd50: 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
fd80: 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
fd90: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
fda0: 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
fdb0: 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
fdc0: 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
fdd0: 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65  Cursor;.  int le
fde0: 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b  nRowid;.  Mem m;
fdf0: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
fe00: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
fe10: 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
fe20: 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
fe30: 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
fe40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fe50: 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  K;.  }.  rc = sq
fe60: 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
fe70: 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
fe80: 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
fe90: 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
fea0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
feb0: 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  c;.  }.  lenRowi
fec0: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  d = sqlite3VdbeI
fed0: 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29  dxRowidLen((u8*)
fee0: 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73  m.z);.  *res = s
fef0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
ff00: 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79  Compare(pC->pKey
ff10: 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77  Info, m.n-lenRow
ff20: 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70  id, m.z, nKey, p
ff30: 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Key);.  sqlite3V
ff40: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
ff50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ff60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ff70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
ff80: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
ff90: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
ffa0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
ffb0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
ffc0: 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
ffd0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
ffe0: 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
fff0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
10000 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
10010 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
10020 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10030 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
10040 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
10050 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
10060 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
10070 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
10080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
10090 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
100a0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
100b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
100c0 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
100d0 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
100e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
100f0 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
10100 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
10110 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
10120 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
10130 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
10140 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
10150 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
10160 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
10170 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
10180 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
10190 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
101a0 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
101b0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
101c0 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
101d0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
101e0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
101f0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
10200 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
10210 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
10220 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
10230 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
10240 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
10250 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
10260 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
10270 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
10280 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
10290 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
102a0 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
102b0 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
102c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
102d0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
102e0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
102f0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
10300 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
10310 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
10320 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
10330 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
10340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
10360 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10370 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
10380 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
10390 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
103a0 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.