/ Hex Artifact Content
Login

Artifact 4b6fb200f3f35fb5983f39ee8527025a372aaa88:


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 52 45 41       case P3_REA
2f40: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 33  L:.      case P3
2f50: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61  _INT64:.      ca
2f60: 73 65 20 50 33 5f 4d 50 52 49 4e 54 46 3a 0a 20  se P3_MPRINTF:. 
2f70: 20 20 20 20 20 63 61 73 65 20 50 33 5f 44 59 4e       case P3_DYN
2f80: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
2f90: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P3_KEYINFO:.   
2fa0: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
2fb0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
2fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2fd0: 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20  ee(p3);.        
2fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2ff0: 20 20 20 20 20 63 61 73 65 20 50 33 5f 56 44 42       case P3_VDB
3000: 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20  EFUNC: {.       
3010: 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65   VdbeFunc *pVdbe
3020: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
3030: 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20 20 66   *)p3;.        f
3040: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
3050: 74 69 6f 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e  tion(pVdbeFunc->
3060: 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  pFunc);.        
3070: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
3080: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
3090: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
30a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 64  sqlite3_free(pVd
30b0: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
30c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
30d0: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 46 55        case P3_FU
30e0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
30f0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3100: 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a  nction((FuncDef*
3110: 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p3);.        br
3120: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3130: 20 20 20 63 61 73 65 20 50 33 5f 4d 45 4d 3a 20     case P3_MEM: 
3140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3150: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
3160: 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a  te3_value*)p3);.
3170: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3190: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  .}.../*.** Chang
31a0: 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72  e N opcodes star
31b0: 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20  ting at addr to 
31c0: 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20  No-ops..*/.void 
31d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
31e0: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
31f0: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e   int addr, int N
3200: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
3210: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
3220: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
3230: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 77 68 69  p[addr];.    whi
3240: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20  le( N-- ){.     
3250: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3260: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3270: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
3280: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
3290: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
32a0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
32b0: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
32c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
32d0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
32e0: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
32f0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
3300: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
3310: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3320: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
3330: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
3340: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
3350: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
3360: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
3370: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
3380: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
3390: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
33a0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
33b0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
33c0: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33  n>=0 then the P3
33d0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
33e0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
33f0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
3400: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
3410: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
3420: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
3430: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
3440: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
3450: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
3460: 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61  s of zP3 up to a
3470: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
3480: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
3490: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
34a0: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
34b0: 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49   of zP3..**.** I
34c0: 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20  f n==P3_KEYINFO 
34d0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
34e0: 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  3 is a pointer t
34f0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
3500: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
3510: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
3520: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3530: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
3540: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
3550: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
3560: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
3570: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
3580: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f  lized..** n==P3_
3590: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
35a0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
35b0: 50 33 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P3 points to a K
35c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
35d0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
35e0: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
35f0: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
3600: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
3610: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
3620: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
3630: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
3640: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
3650: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3660: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3670: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3680: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3690: 50 33 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f  P3_STATIC, P3_CO
36a0: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
36b0: 63 61 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f  cate that zP3 po
36c0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
36d0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
36e0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
36f0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
3700: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3710: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
3720: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
3730: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
3740: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
3750: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3760: 63 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65  change P3 on the
3770: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3780: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3790: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
37a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
37b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
37c0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
37d0: 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP3, int n){.  O
37e0: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
37f0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
3800: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3810: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
3820: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
3830: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
3840: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
3850: 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f  (n != P3_KEYINFO
3860: 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 33  ) {.      freeP3
3870: 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61  (n, (void*)*(cha
3880: 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d  r**)&zP3);.    }
3890: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
38a0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c  .  if( addr<0 ||
38b0: 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b   addr>=p->nOp ){
38c0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
38d0: 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  Op - 1;.    if( 
38e0: 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b  addr<0 ) return;
38f0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
3900: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
3910: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
3920: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 70 4f  , pOp->p3);.  pO
3930: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 69 66 28  p->p3 = 0;.  if(
3940: 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP3==0 ){.    p
3950: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
3960: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
3970: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73  _NOTUSED;.  }els
3980: 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49  e if( n==P3_KEYI
3990: 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  NFO ){.    KeyIn
39a0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
39b0: 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42    int nField, nB
39c0: 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64  yte;..    nField
39d0: 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50   = ((KeyInfo*)zP
39e0: 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20  3)->nField;.    
39f0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
3a00: 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69  pKeyInfo) + (nFi
3a10: 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b  eld-1)*sizeof(pK
3a20: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
3a30: 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  ) + nField;.    
3a40: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
3a50: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
3a60: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   );.    pOp->p3 
3a70: 3d 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  = (char*)pKeyInf
3a80: 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  o;.    if( pKeyI
3a90: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 6e 73  nfo ){.      uns
3aa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 53 6f 72  igned char *aSor
3ab0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65  tOrder;.      me
3ac0: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a  mcpy(pKeyInfo, z
3ad0: 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  P3, nByte);.    
3ae0: 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    aSortOrder = p
3af0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3b00: 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61  der;.      if( a
3b10: 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  SortOrder ){.   
3b20: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
3b30: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73  SortOrder = (uns
3b40: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65  igned char*)&pKe
3b50: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69  yInfo->aColl[nFi
3b60: 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  eld];.        me
3b70: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  mcpy(pKeyInfo->a
3b80: 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74  SortOrder, aSort
3b90: 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a  Order, nField);.
3ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3bb0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b  p->p3type = P3_K
3bc0: 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73  EYINFO;.    }els
3bd0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e  e{.      p->db->
3be0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
3bf0: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  ;.      pOp->p3t
3c00: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
3c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
3c20: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
3c30: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
3c40: 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72   pOp->p3 = (char
3c50: 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP3;.    pOp->
3c60: 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49  p3type = P3_KEYI
3c70: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
3c80: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
3c90: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
3ca0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3cb0: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
3cc0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
3cd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 3b 0a   = strlen(zP3);.
3ce0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71      pOp->p3 = sq
3cf0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
3d00: 2d 3e 64 62 2c 20 7a 50 33 2c 20 6e 29 3b 0a 20  ->db, zP3, n);. 
3d10: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3d20: 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P3_DYNAMIC;.  }
3d30: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
3d40: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UG./*.** Replace
3d50: 20 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66   the P3 field of
3d60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3d70: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
3d80: 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d  tion with.** com
3d90: 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f  ment text..*/.vo
3da0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
3db0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
3dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3dd0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
3de0: 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74  ist ap;.  assert
3df0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
3e00: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
3e10: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
3e20: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
3e30: 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 70 2d 3e 64  1].p3==0 || p->d
3e40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3e50: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
3e60: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71  , zFormat);.  sq
3e70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3e80: 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  3(p, -1, sqlite3
3e90: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
3ea0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33  zFormat, ap), P3
3eb0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f  _DYNAMIC);.  va_
3ec0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69  end(ap);.}.#endi
3ed0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
3ee0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
3ef0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
3f00: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
3f10: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
3f20: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3f30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3f40: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3f50: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
3f60: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
3f70: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
3f80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3f90: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61   );.  return ((a
3fa0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
3fb0: 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b  ->nOp)?(&p->aOp[
3fc0: 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69  addr]):0);.}..#i
3fd0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3fe0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
3ff0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
4000: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
4010: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
4020: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
4030: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4040: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
4050: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
4060: 65 73 20 74 68 65 20 50 33 20 70 61 72 61 6d 65  es the P3 parame
4070: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
4080: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
4090: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
40a0: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
40b0: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
40c0: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
40d0: 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P3(Op *pOp, char
40e0: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
40f0: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33  mp){.  char *zP3
4100: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
4110: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
4120: 68 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 29  h( pOp->p3type )
4130: 7b 0a 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45  {.    case P3_KE
4140: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
4150: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
4160: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
4170: 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70   = (KeyInfo*)pOp
4180: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->p3;.      sqli
4190: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
41a0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69  mp, zTemp, "keyi
41b0: 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66  nfo(%d", pKeyInf
41c0: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
41d0: 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65    i = strlen(zTe
41e0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
41f0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
4200: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
4210: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
4220: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
4230: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
4240: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
4250: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
4260: 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e  = strlen(pColl->
4270: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4280: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
4290: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  6 ){.           
42a0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
42b0: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
42c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
42d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
42e0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
42f0: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
4300: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
4310: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b  aSortOrder && pK
4320: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
4330: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
4340: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4350: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20  = '-';.         
4360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
4370: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70  cpy(&zTemp[i], p
4380: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29  Coll->zName,n+1)
4390: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
43a0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
43b0: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
43c0: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
43d0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
43e0: 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20  ",nil",4);.     
43f0: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4410: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4420: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
4430: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
4440: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
4450: 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20   );.      zP3 = 
4460: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
4470: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4480: 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P3_COLLSEQ: {
4490: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
44a0: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
44b0: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
44c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
44d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
44e0: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
44f0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
4500: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
4510: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
4520: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4530: 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P3_FUNCDEF: {.  
4540: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
4550: 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f  f = (FuncDef*)pO
4560: 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c  p->p3;.      sql
4570: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4580: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
4590: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
45a0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
45b0: 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d        zP3 = zTem
45c0: 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
45d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
45e0: 33 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  3_INT64: {.     
45f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4600: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4610: 22 25 6c 6c 64 22 2c 20 2a 28 73 71 6c 69 74 65  "%lld", *(sqlite
4620: 33 5f 69 6e 74 36 34 2a 29 70 4f 70 2d 3e 70 33  3_int64*)pOp->p3
4630: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
4640: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4650: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4660: 65 20 50 33 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P3_REAL: {.   
4670: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4680: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4690: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 28 64 6f 75  , "%.16g", *(dou
46a0: 62 6c 65 2a 29 70 4f 70 2d 3e 70 33 29 3b 0a 20  ble*)pOp->p3);. 
46b0: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
46c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
46d0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
46e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
46f0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
4700: 33 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  3_VTAB: {.      
4710: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
4720: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
4730: 74 61 62 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  tab*)pOp->p3;.  
4740: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4750: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4760: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
4770: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
4780: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 7a  Module);.      z
4790: 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P3 = zTemp;.    
47a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
47b0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
47c0: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d  t: {.      zP3 =
47d0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
47e0: 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f  if( zP3==0 || pO
47f0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f  p->opcode==OP_No
4800: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  op ){.        zP
4810: 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a  3 = "";.      }.
4820: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
4830: 72 74 28 20 7a 50 33 21 3d 30 20 29 3b 0a 20 20  rt( zP3!=0 );.  
4840: 72 65 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65  return zP3;.}.#e
4850: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
4860: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
4870: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
4880: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
4890: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
48a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
48b0: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
48c0: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
48d0: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
48e0: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
48f0: 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
4900: 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70  sert( i<sizeof(p
4910: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
4920: 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b  ;.  mask = 1<<i;
4930: 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65  .  if( (p->btree
4940: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
4950: 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d  ){.    p->btreeM
4960: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
4970: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
4980: 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70  exArrayInsert(&p
4990: 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d  ->aMutex, p->db-
49a0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
49b0: 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  }.}...#if define
49c0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
49d0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
49e0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
49f0: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
4a00: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
4a10: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4a20: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
4a30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4a40: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
4a50: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
4a60: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
4a70: 2a 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP3;.  char zPt
4a80: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
4a90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
4aa0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
4ab0: 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22 3b  s %4d %4d %s\n";
4ac0: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
4ad0: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
4ae0: 20 20 7a 50 33 20 3d 20 64 69 73 70 6c 61 79 50    zP3 = displayP
4af0: 33 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  3(pOp, zPtr, siz
4b00: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70  eof(zPtr));.  fp
4b10: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
4b20: 6d 61 74 31 2c 0a 20 20 20 20 20 20 70 63 2c 20  mat1,.      pc, 
4b30: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
4b40: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
4b50: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
4b60: 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c 75 73 68  , zP3);.  fflush
4b70: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
4b80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4b90: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
4ba0: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
4bb0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
4bc0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
4bd0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
4be0: 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  p ){.    while( 
4bf0: 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  N-->0 ){.      a
4c00: 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b  ssert( N<2 || p[
4c10: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
4c20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4c30: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b  dbeMemRelease(p+
4c40: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  +);.    }.  }.}.
4c50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4c60: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
4c70: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
4c80: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
4c90: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
4ca0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
4cb0: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
4cc0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
4cd0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
4ce0: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
4cf0: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
4d00: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
4d10: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
4d20: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
4d30: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
4d40: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
4d50: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
4d60: 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  LAIN"..*/.int sq
4d70: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
4d80: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
4d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4da0: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73  e VDBE */.){.  s
4db0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
4dc0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
4dd0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4de0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  K;..  assert( p-
4df0: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  >explain );.  if
4e00: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
4e10: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74  _MAGIC_RUN ) ret
4e20: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
4e30: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  E;.  assert( db-
4e40: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
4e50: 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61  AGIC_BUSY );.  a
4e60: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
4e70: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
4e80: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  ==SQLITE_BUSY );
4e90: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
4ea0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
4eb0: 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61  oes not put dyna
4ec0: 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f  mic strings onto
4ed0: 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   the.  ** the st
4ee0: 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65  ack, they may be
4ef0: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
4f00: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
4f10: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
4f20: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
4f30: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
4f40: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
4f50: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  oding..  */.  if
4f60: 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61  ( p->pTos==&p->a
4f70: 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20  Stack[4] ){.    
4f80: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4f90: 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20  p->aStack, 5);. 
4fa0: 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61   }.  p->resOnSta
4fb0: 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a 20  ck = 0;..  do{. 
4fc0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
4fd0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e    }while( i<p->n
4fe0: 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  Op && p->explain
4ff0: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
5000: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
5010: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
5020: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->nOp ){.    p-
5030: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
5040: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5050: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
5060: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
5070: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
5080: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
5090: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
50a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
50b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
50c0: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
50d0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
50e0: 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30  p->rc), (char*)0
50f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5100: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
5110: 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70  p[i];.    Mem *p
5120: 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b  Mem = p->aStack;
5130: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
5140: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
5150: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5160: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
5170: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
51b0: 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  r */.    pMem++;
51c0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
51d0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
51e0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
51f0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28  .    pMem->z = (
5200: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
5210: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
5220: 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65  ode);  /* Opcode
5230: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
5240: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
5250: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c    pMem->n = strl
5260: 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  en(pMem->z);.   
5270: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5280: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
5290: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
52a0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d  E_UTF8;.    pMem
52b0: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
52c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
52d0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
52e0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
5310: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5320: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
5330: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
5340: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
5350: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
5360: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
5390: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
53a0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
53b0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
53c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
53d0: 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72  EM_Ephem|MEM_Str
53e0: 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20  |MEM_Term;   /* 
53f0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P3 */.    pMem->
5400: 7a 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f  z = displayP3(pO
5410: 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c  p, pMem->zShort,
5420: 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53   sizeof(pMem->zS
5430: 68 6f 72 74 29 29 3b 0a 20 20 20 20 61 73 73 65  hort));.    asse
5440: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5450: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20  ;.    pMem->n = 
5460: 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b  strlen(pMem->z);
5470: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
5480: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5490: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
54a0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20  QLITE_UTF8;..   
54b0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
54c0: 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61   5 - 2*(p->expla
54d0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54  in-1);.    p->pT
54e0: 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70  os = pMem;.    p
54f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
5500: 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74  ;.    p->resOnSt
5510: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  ack = 1;.    rc 
5520: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
5530: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5540: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5550: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
5560: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
5570: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
5580: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
5590: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
55a0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
55b0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
55c0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
55d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
55e0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
55f0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
5600: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
5610: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
5620: 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66  aOp[nOp-1];.  if
5630: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
5640: 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70  P_Noop && pOp->p
5650: 33 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  3!=0 ){.    cons
5660: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
5670: 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  >p3;.    while( 
5680: 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29  isspace(*(u8*)z)
5690: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
56a0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
56b0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
56c0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
56d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
56e0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
56f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
5700: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
5710: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
5720: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
5730: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
5740: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
5750: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
5760: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
5770: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
5780: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
5790: 65 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29  e3_io_trace==0 )
57a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
57b0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
57c0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
57d0: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
57e0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
57f0: 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20  p && pOp->p3!=0 
5800: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
5810: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
5820: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
5830: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5840: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
5850: 3e 70 33 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >p3);.    for(i=
5860: 30 3b 20 69 73 73 70 61 63 65 28 28 75 6e 73 69  0; isspace((unsi
5870: 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b  gned char)z[i]);
5880: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
5890: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
58a0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 73 70 61  .      if( isspa
58b0: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
58c0: 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  r)z[i]) ){.     
58d0: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
58e0: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
58f0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
5900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5910: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
5920: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
5930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
5940: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
5950: 74 65 33 5f 69 6f 5f 74 72 61 63 65 28 22 53 51  te3_io_trace("SQ
5960: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
5970: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
5980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
5990: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
59a0: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a  _IOTRACE */.../*
59b0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
59c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
59d0: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
59e0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
59f0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
5a00: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
5a10: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
5a20: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
5a30: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
5a40: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
5a50: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
5a60: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
5a70: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
5a80: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
5a90: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
5aa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
5ab0: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
5ac0: 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56  ve a VDBE from V
5ad0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74  DBE_MAGIC_INIT t
5ae0: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
5af0: 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RUN..*/.void sql
5b00: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
5b10: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
5b40: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20  */.  int nVar,  
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5b70: 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20   '?' see in the 
5b80: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
5b90: 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20  .  int nMem,    
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
5bc0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61  emory cells to a
5bd0: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
5be0: 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   nCursor,       
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5c00: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
5c10: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
5c20: 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20    int isExplain 
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5c50: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73  EXPLAIN keywords
5c60: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29   is present */.)
5c70: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
5c80: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5c90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
5ca0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5cb0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
5cc0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
5cd0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
5ce0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
5cf0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
5d00: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
5d10: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
5d20: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
5d30: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
5d40: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
5d50: 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62  . This.   * is b
5d60: 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
5d70: 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  to resizeOpArray
5d80: 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72  () below may shr
5d90: 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e  ink the.   * p->
5da0: 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73  aOp[] array to s
5db0: 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61  ave memory if ca
5dc0: 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42  lled when in VDB
5dd0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20  E_MAGIC_RUN .   
5de0: 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20  * state..   */. 
5df0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
5e00: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f  _MAGIC_RUN;..  /
5e10: 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  * No instruction
5e20: 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72   ever pushes mor
5e30: 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20  e than a single 
5e40: 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65  element onto the
5e50: 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e  .  ** stack.  An
5e60: 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65  d the stack neve
5e70: 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65  r grows on succe
5e80: 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73  ssive executions
5e90: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   of the.  ** sam
5ea0: 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20  e loop.  So the 
5eb0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
5ec0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20  instructions is 
5ed0: 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  an upper bound. 
5ee0: 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d   ** on the maxim
5ef0: 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20 72  um stack depth r
5f00: 65 71 75 69 72 65 64 2e 20 20 28 41 64 64 65 64  equired.  (Added
5f10: 20 6c 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20   later:)  The.  
5f20: 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  ** resolveP2Valu
5f30: 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74  es() call comput
5f40: 65 73 20 61 20 74 69 67 68 74 65 72 20 75 70 70  es a tighter upp
5f50: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a  er bound on the.
5f60: 20 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e    ** stack size.
5f70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  **.  ** Alloc
5f80: 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74  ation all the st
5f90: 61 63 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c  ack space we wil
5fa0: 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a  l ever need..  *
5fb0: 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  /.  if( p->aStac
5fc0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  k==0 ){.    int 
5fd0: 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  nArg;       /* M
5fe0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
5ff0: 20 61 72 67 73 20 70 61 73 73 65 64 20 74 6f 20   args passed to 
6000: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e  a user function.
6010: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61   */.    int nSta
6020: 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  ck;     /* Maxim
6030: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61  um number of sta
6040: 63 6b 20 65 6e 74 72 69 65 73 20 72 65 71 75 69  ck entries requi
6050: 72 65 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c  red */.    resol
6060: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
6070: 41 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20  Arg, &nStack);. 
6080: 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79     resizeOpArray
6090: 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20  (p, p->nOp);.   
60a0: 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30   assert( nVar>=0
60b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
60c0: 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b  nStack<p->nOp );
60d0: 0a 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61  .    if( isExpla
60e0: 69 6e 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 61  in ){.      nSta
60f0: 63 6b 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20  ck = 10;.    }. 
6100: 20 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73     p->aStack = s
6110: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6120: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e  ro(db,.        n
6130: 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e  Stack*sizeof(p->
6140: 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a  aStack[0])    /*
6150: 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20   aStack */.     
6160: 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d   + nArg*sizeof(M
6170: 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  em*)            
6180: 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20    /* apArg */.  
6190: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
61a0: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
61b0: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
61c0: 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a        + nVar*siz
61d0: 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20 20  eof(char*)      
61e0: 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20         /* azVar 
61f0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a  */.      + nMem*
6200: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
6210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
6220: 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75  m */.      + nCu
6230: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73  rsor*sizeof(Curs
6240: 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61  or*)        /* a
6250: 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  pCsr */.    );. 
6260: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
6270: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6280: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e    p->aMem = &p->
6290: 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b 5d 3b 0a  aStack[nStack];.
62a0: 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
62b0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nMem;.      p->a
62c0: 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e  Var = &p->aMem[n
62d0: 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  Mem];.      p->n
62e0: 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20  Var = nVar;.    
62f0: 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a    p->okVar = 0;.
6300: 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
6310: 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72   (Mem**)&p->aVar
6320: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
6330: 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a  >azVar = (char**
6340: 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d  )&p->apArg[nArg]
6350: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
6360: 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d   = (Cursor**)&p-
6370: 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20  >azVar[nVar];.  
6380: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
6390: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   nCursor;.      
63a0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
63b0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
63c0: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
63d0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
63e0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
63f0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
6400: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
6410: 3c 6e 53 74 61 63 6b 3b 20 6e 2b 2b 29 7b 0a 20  <nStack; n++){. 
6420: 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
6430: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
6440: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6450: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e   for(n=0; n<p->n
6460: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70  Mem; n++){.    p
6470: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
6480: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
6490: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
64a0: 64 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 54  db;.  }..  p->pT
64b0: 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  os = &p->aStack[
64c0: 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  -1];.  p->pc = -
64d0: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
64e0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69  ITE_OK;.  p->uni
64f0: 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  queCnt = 0;.  p-
6500: 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30  >returnDepth = 0
6510: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
6520: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
6530: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20   p->popStack =  
6540: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
6550: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
6560: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
6570: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
6580: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
6590: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
65a0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
65b0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
65c0: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
65d0: 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ent = 0;.#ifdef 
65e0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
65f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6600: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
6610: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
6620: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
6630: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
6640: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
6650: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
6660: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
6670: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
6680: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
6690: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
66a0: 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a  ursor happens.**
66b0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
66c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
66d0: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
66e0: 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20   Cursor *pCx){. 
66f0: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
6700: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6710: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
6720: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
6730: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
6740: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
6750: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
6760: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
6770: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
6780: 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  >pBt);.  }.#ifnd
6790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
67a0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
67b0: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
67c0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
67d0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
67e0: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
67f0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
6800: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
6810: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
6820: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
6830: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
6840: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  thod = 1;.    sq
6850: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70  lite3SafetyOff(p
6860: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75  ->db);.    pModu
6870: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
6880: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
6890: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e  ite3SafetyOn(p->
68a0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  db);.    p->inVt
68b0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
68c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
68d0: 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61  e3_free(pCx->pDa
68e0: 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta);.  sqlite3_f
68f0: 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b  ree(pCx->aType);
6900: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6910: 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pCx);.}../*.** C
6920: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
6930: 20 65 78 63 65 70 74 20 66 6f 72 20 56 54 61 62   except for VTab
6940: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
6950: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69  e currently.** i
6960: 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
6970: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
6980: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
6990: 65 56 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b  eVtabs(Vdbe *p){
69a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
69b0: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65  p->apCsr==0 ) re
69c0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
69d0: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
69e0: 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73 6f 72 20  ++){.    Cursor 
69f0: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
6a00: 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26  ];.    if( pC &&
6a10: 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68   (!p->inVtabMeth
6a20: 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62  od || !pC->pVtab
6a30: 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
6a40: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
6a50: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
6a60: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
6a70: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
6a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
6a90: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
6aa0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
6ab0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
6ac0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
6ad0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
6ae0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
6af0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
6b00: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
6b10: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
6b20: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
6b30: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
6b40: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
6b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b60: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
6b70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
6b80: 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20  ( p->aStack ){. 
6b90: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
6ba0: 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 31 20  ay(p->aStack, 1 
6bb0: 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e  + (p->pTos - p->
6bc0: 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 70 2d  aStack));.    p-
6bd0: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
6be0: 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c  ck[-1];.  }.  cl
6bf0: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63  oseAllCursorsExc
6c00: 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28 70  eptActiveVtabs(p
6c10: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
6c20: 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
6c30: 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >nMem);.  sqlite
6c40: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
6c50: 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66 28  p->sFifo);.  if(
6c60: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6c70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6c80: 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61   i<p->contextSta
6c90: 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ckTop; i++){.   
6ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69     sqlite3VdbeFi
6cb0: 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e 74  foClear(&p->cont
6cc0: 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69 66  extStack[i].sFif
6cd0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  o);.    }.    sq
6ce0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 63 6f  lite3_free(p->co
6cf0: 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d  ntextStack);.  }
6d00: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
6d10: 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e  ck = 0;.  p->con
6d20: 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d  textStackDepth =
6d30: 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74   0;.  p->context
6d40: 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20  StackTop = 0;.  
6d50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
6d60: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
6d70: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
6d80: 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b  >resOnStack = 0;
6d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
6da0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
6db0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
6dc0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
6dd0: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
6de0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
6df0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
6e00: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
6e10: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
6e20: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
6e30: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
6e40: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
6e50: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
6e60: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
6e70: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
6e80: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
6e90: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
6ea0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
6eb0: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
6ec0: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
6ed0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
6ee0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  me;.  int n;..  
6ef0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6f00: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
6f10: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
6f20: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
6f30: 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d  _free(p->aColNam
6f40: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
6f50: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
6f60: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
6f70: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  = nResColumn;.  
6f80: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
6f90: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
6fa0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6fb0: 72 6f 28 70 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  ro(p->db, sizeof
6fc0: 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28  (Mem)*n );.  if(
6fd0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20   p->aColName==0 
6fe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
6ff0: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
7000: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
7010: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
7020: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d    pColName->db =
7030: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c   p->db;.    pCol
7040: 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Name++;.  }.}../
7050: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
7060: 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
7070: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
7080: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
7090: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
70a0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
70b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
70c0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
70d0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
70e0: 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
70f0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
7100: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
7110: 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  mCols()..**.** I
7120: 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20  f N==P3_STATIC  
7130: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e  it means that zN
7140: 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ame is a pointer
7150: 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73   to a constant s
7160: 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20  tatic.** string 
7170: 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20  and we can just 
7180: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
7190: 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44 59  . If it is P3_DY
71a0: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20  NAMIC, then .** 
71b0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66 72  the string is fr
71c0: 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
71d0: 33 5f 66 72 65 65 28 29 20 77 68 65 6e 20 74 68  3_free() when th
71e0: 65 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68  e vdbe is finish
71f0: 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f  ed with.** it. O
7200: 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65  therwise, N byte
7210: 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63  s of zName are c
7220: 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  opied..*/.int sq
7230: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7240: 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ame(Vdbe *p, int
7250: 20 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63   idx, int var, c
7260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7270: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  , int N){.  int 
7280: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
7290: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
72a0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
72b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
72c0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
72d0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
72e0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
72f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7300: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
7310: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
7320: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
7330: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
7340: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
7350: 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41    if( N==P3_DYNA
7360: 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41  MIC || N==P3_STA
7370: 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TIC ){.    rc = 
7380: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
7390: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
73a0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
73b0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
73c0: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
73d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
73e0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
73f0: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e  olName, zName, N
7400: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51  , SQLITE_UTF8,SQ
7410: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7420: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7430: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50  QLITE_OK && N==P
7440: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
7450: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
7460: 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c   = (pColName->fl
7470: 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63  ags&(~MEM_Static
7480: 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20  ))|MEM_Dyn;.    
7490: 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d  pColName->xDel =
74a0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
74b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
74c0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
74d0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
74e0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
74f0: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
7500: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
7510: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
7520: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
7530: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
7540: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
7550: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
7560: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
7570: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
7580: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
7590: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
75a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
75b0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
75c0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
75d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
75e0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
75f0: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
7600: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
7610: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
7620: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
7630: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
7640: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
7650: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
7660: 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  0;..  /* Before 
7670: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
7680: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
7690: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
76a0: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
76b0: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
76c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
76d0: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
76e0: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
76f0: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
7700: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
7710: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
7720: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
7730: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
7740: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
7750: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
7760: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
7770: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
7780: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
7790: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
77a0: 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20  Sync(db, rc);.  
77b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
77c0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
77d0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
77e0: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
77f0: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
7800: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
7810: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
7820: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
7830: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
7840: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
7850: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
7860: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
7870: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
7880: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
7890: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
78a0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
78b0: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
78c0: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
78d0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
78e0: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
78f0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
7900: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
7910: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
7920: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
7930: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7940: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
7950: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
7960: 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
7970: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7980: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
7990: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
79a0: 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
79b0: 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
79c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
79d0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
79e0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
79f0: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
7a00: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
7a10: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
7a20: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
7a30: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
7a40: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
7a50: 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ff(db);.    rc =
7a60: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
7a70: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
7a80: 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
7a90: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20  3SafetyOn(db);. 
7aa0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
7ab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7ac0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
7ad0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
7ae0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
7af0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
7b00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
7b10: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
7b20: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
7b30: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
7b40: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
7b50: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
7b60: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
7b70: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
7b80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
7b90: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
7ba0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
7bb0: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
7bc0: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
7bd0: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
7be0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7bf0: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20  e is :memory:.  
7c00: 49 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  In that case we 
7c10: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70  do.  ** not supp
7c20: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
7c30: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
7c40: 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65  o use the simple
7c50: 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20   case then.  ** 
7c60: 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
7c70: 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65  0==strlen(sqlite
7c80: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
7c90: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
7ca0: 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20  )) || nTrans<=1 
7cb0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
7cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7cd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7ce0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
7cf0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
7d00: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
7d10: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
7d20: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
7d30: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
7d40: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
7d50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
7d60: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
7d70: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
7d80: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
7d90: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
7da0: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
7db0: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
7dc0: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
7dd0: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
7de0: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
7df0: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
7e00: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
7e10: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
7e20: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
7e30: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
7e40: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
7e50: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
7e60: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
7e70: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
7e80: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
7e90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
7ea0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
7eb0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
7ec0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
7ed0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7ee0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
7ef0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
7f00: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
7f10: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
7f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7f30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7f40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
7f50: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
7f60: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
7f70: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
7f80: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
7f90: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
7fa0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
7fb0: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
7fc0: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
7fd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7fe0: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
7ff0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
8000: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
8010: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
8020: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8030: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
8040: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
8050: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
8060: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
8070: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
8080: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
8090: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
80a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
80b0: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
80c0: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
80d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
80e0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
80f0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
8100: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
8110: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
8120: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  4 offset = 0;.. 
8130: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
8140: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8150: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64  le name */.    d
8160: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61  o {.      u32 ra
8170: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ndom;.      sqli
8180: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
81a0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
81b0: 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64  f(random), &rand
81c0: 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74  om);.      zMast
81d0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
81e0: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30  ntf(db, "%s-mj%0
81f0: 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20  8X", zMainFile, 
8200: 72 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66  random&0x7ffffff
8210: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  f);.      if( !z
8220: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
8230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8240: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
8250: 20 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74     }while( sqlit
8260: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
8270: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
8280: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20  _ACCESS_EXISTS) 
8290: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
82a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
82b0: 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  al. */.    rc = 
82c0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
82d0: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
82e0: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
82f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
8300: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
8310: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
8320: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8330: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
8340: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
8350: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
8360: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8380: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8390: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
83a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
83b0: 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
83c0: 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
83d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
83e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
83f0: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
8400: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
8410: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
8420: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
8430: 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
8440: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
8450: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8460: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
8470: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
8480: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
8490: 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
84a0: 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
84b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
84c0: 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
84d0: 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
84e0: 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
84f0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
8500: 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
8510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8520: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
8530: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8540: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8550: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
8560: 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67  ontinue;   /* Ig
8570: 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  nore the TEMP da
8580: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
8590: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
85a0: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
85b0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
85c0: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
85d0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
85e0: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
85f0: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
8600: 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [0]==0 ) continu
8610: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d  e;  /* Ignore :m
8620: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
8630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
8640: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
8650: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
8660: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
8670: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
8680: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
8690: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
86a0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
86b0: 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72  ster, zFile, str
86c0: 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  len(zFile)+1, of
86d0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
86e0: 66 66 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28  ffset += strlen(
86f0: 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
8700: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8710: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
8720: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
8730: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
8740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
8750: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
8760: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
8770: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8780: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
87a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
87b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
87c0: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
87d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
87e0: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
87f0: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
8800: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
8810: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
8820: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
8830: 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    zMainFile = sq
8840: 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
8850: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
8860: 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e  pBt);.    if( (n
8870: 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
8880: 20 28 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44   (0==(sqlite3OsD
8890: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
88a0: 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
88b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
88c0: 4e 54 49 41 4c 29 29 0a 20 20 20 20 20 26 26 20  NTIAL)).     && 
88d0: 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e  (rc=sqlite3OsSyn
88e0: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
88f0: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 21  E_SYNC_NORMAL))!
8900: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
8910: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8920: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
8930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8940: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
8950: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
8960: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
8970: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
8980: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
8990: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
89a0: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
89b0: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
89c0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
89d0: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
89e0: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
89f0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
8a00: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
8a10: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
8a20: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
8a30: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
8a40: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
8a50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8a60: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
8a70: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
8a80: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
8a90: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
8aa0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
8ab0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
8ac0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
8ad0: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
8ae0: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
8af0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
8b00: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
8b10: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
8b20: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
8b30: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
8b40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
8b50: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
8b60: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8b70: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
8b80: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
8b90: 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  occured..    */.
8ba0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
8bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
8bc0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
8bd0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8be0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8bf0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
8c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8c10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8c20: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
8c30: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
8c40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8c50: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
8c60: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  pMaster);.    if
8c70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8c80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8c90: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
8ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8cb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
8cc0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8cd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
8ce0: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
8cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
8d00: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
8d10: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
8d20: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
8d30: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
8d40: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
8d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
8d60: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
8d70: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
8d80: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8d90: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
8da0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
8db0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8dc0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
8dd0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
8de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8df0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
8e00: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
8e10: 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
8e20: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
8e30: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
8e40: 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
8e50: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
8e60: 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
8e70: 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
8e80: 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
8e90: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
8ea0: 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
8eb0: 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
8ec0: 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
8ed0: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
8ee0: 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
8ef0: 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
8f00: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
8f10: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
8f20: 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
8f30: 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
8f40: 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
8f50: 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
8f60: 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
8f70: 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
8f80: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
8f90: 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
8fa0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
8fb0: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
8fc0: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
8fd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8fe0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
8ff0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
9000: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9010: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
9020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
9030: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
9040: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
9050: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 61 62 6c  .    }.    enabl
9060: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
9070: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
9080: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
9090: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
90a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
90b0: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
90c0: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
90d0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
90e0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
90f0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
9100: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
9110: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
9120: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
9130: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
9140: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
9150: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
9160: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
9170: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
9180: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
9190: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
91a0: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
91b0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
91c0: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
91d0: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
91e0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
91f0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
9200: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
9210: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
9220: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
9230: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
9240: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
9250: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
9260: 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
9270: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
9280: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
9290: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
92a0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
92b0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
92c0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
92d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
92e0: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
92f0: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
9300: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
9310: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
9320: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
9330: 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68  r every Btree th
9340: 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  at in database c
9350: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69  onnection db whi
9360: 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ch .** has been 
9370: 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22  modified, "trip"
9380: 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65   or invalidate e
9390: 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a  ach cursor in.**
93a0: 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68   that Btree migh
93b0: 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  t have been modi
93c0: 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  fied so that the
93d0: 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e   cursor.** can n
93e0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61  ever be used aga
93f0: 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  in.  This happen
9400: 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  s when a rollbac
9410: 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57  k.*** occurs.  W
9420: 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61  e have to trip a
9430: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72  ll the other cur
9440: 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75  sors, even.** cu
9450: 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20  rsor from other 
9460: 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  VMs in different
9470: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9480: 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61  tions,.** so tha
9490: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74  t none of them t
94a0: 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61  ry to use the da
94b0: 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79  ta at which they
94c0: 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e  .** were pointin
94d0: 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20  g and which now 
94e0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68  may have been ch
94f0: 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20  anged due.** to 
9500: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
9510: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
9520: 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e  t a rollback can
9530: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63   delete tables c
9540: 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72  omplete and.** r
9550: 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73  eorder rootpages
9560: 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20  .  So it is not 
9570: 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20  sufficient just 
9580: 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73  to save.** the s
9590: 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
95a0: 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  or.  We have to 
95b0: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
95c0: 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74  ursor.** so that
95d0: 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65   it is never use
95e0: 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f 69 64  d again..*/.void
95f0: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
9600: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
9610: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
9620: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
9630: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
9640: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
9650: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
9660: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26  pBt;.    if( p &
9670: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
9680: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
9690: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
96a0: 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
96b0: 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b  , SQLITE_ABORT);
96c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
96d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
96e0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
96f0: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
9700: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
9710: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
9720: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
9730: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
9740: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
9750: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
9760: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
9770: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
9780: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
9790: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
97a0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
97b0: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
97c0: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
97d0: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
97e0: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
97f0: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
9800: 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
9810: 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
9820: 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
9830: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
9840: 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
9850: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
9860: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
9870: 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
9880: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
9890: 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
98a0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
98b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
98c0: 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
98d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
98e0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
98f0: 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
9900: 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
9910: 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
9920: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
9930: 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
9940: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
9950: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
9960: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72  int (*xFunc)(Btr
9970: 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f  ee *pBt) = 0;  /
9980: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
9990: 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65  ll on each btree
99a0: 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e   backend */.  in
99b0: 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
99c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
99d0: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53  Set to true if S
99e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49  QLITE_NOMEM or I
99f0: 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  OERR */..  /* Th
9a00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
9a10: 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
9a20: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
9a30: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
9a40: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
9a50: 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
9a60: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
9a70: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
9a80: 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
9a90: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
9aa0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
9ab0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20   **.  ** If any 
9ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9ad0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20   errors occur:. 
9ae0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c   **.  **     SQL
9af0: 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20  ITE_NOMEM.  **  
9b00: 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a     SQLITE_IOERR.
9b10: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
9b20: 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51  FULL.  **     SQ
9b30: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20  LITE_INTERRUPT. 
9b40: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
9b50: 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
9b60: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
9b70: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
9b80: 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74  nsistent.  ** st
9b90: 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ate.  We need to
9ba0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
9bb0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
9bc0: 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73  ion, if there is
9bd0: 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68  .  ** one, or th
9be0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73  e complete trans
9bf0: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
9c00: 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  is no statement 
9c10: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
9c20: 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  /..  if( p->db->
9c30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9c40: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9c50: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9c60: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
9c70: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
9c80: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
9c90: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
9ca0: 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
9cb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9cc0: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
9cd0: 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
9ce0: 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
9cf0: 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
9d00: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
9d10: 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  er started */.  
9d20: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
9d30: 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
9d40: 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
9d50: 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
9d60: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
9d70: 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
9d80: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
9d90: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
9da0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e  treeMutexArrayEn
9db0: 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ter(&p->aMutex);
9dc0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
9dd0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
9de0: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a  ecial errors */.
9df0: 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20      mrc = p->rc 
9e00: 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70  & 0xff;.    isSp
9e10: 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63  ecialError = mrc
9e20: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
9e30: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
9e40: 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERR.            
9e50: 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d           || mrc=
9e60: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
9e70: 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  T || mrc==SQLITE
9e80: 5f 46 55 4c 4c 20 3b 0a 20 20 20 20 69 66 28 20  _FULL ;.    if( 
9e90: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
9ea0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
9eb0: 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63  loop does static
9ec0: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65   analysis of the
9ed0: 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77 68   query to see wh
9ee0: 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ich of the.     
9ef0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
9f00: 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20 69  ree categories i
9f10: 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20  t falls into:.  
9f20: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9f30: 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20      Read-only.  
9f40: 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79      **     Query
9f50: 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20   with statement 
9f60: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
9f70: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 6f       Query witho
9f80: 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ut statement jou
9f90: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rnal.      **.  
9fa0: 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20      ** We could 
9fb0: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72  do something mor
9fc0: 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74  e elegant than t
9fd0: 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  his static analy
9fe0: 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20  sis (i.e..      
9ff0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79 70  ** store the typ
a000: 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70 61  e of query as pa
a010: 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69  rt of the compli
a020: 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75  ation phase), bu
a030: 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  t .      ** hand
a040: 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  ling malloc() or
a050: 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61   IO failure is a
a060: 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
a070: 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20  edge case so .  
a080: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70      ** this is p
a090: 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20  robably easier. 
a0a0: 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61  Todo: Might be a
a0b0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
a0c0: 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a   reduce .      *
a0d0: 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65  * code size a ve
a0e0: 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20  ry small amount 
a0f0: 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20  though....      
a100: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74  */.      int not
a110: 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  ReadOnly = 0;.  
a120: 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d      int isStatem
a130: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ent = 0;.      a
a140: 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20  ssert(p->aOp || 
a150: 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20  p->nOp==0);.    
a160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a170: 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nOp; i++){ .    
a180: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61      switch( p->a
a190: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a  Op[i].opcode ){.
a1a0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
a1b0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  P_Transaction:. 
a1c0: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65             notRe
a1d0: 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70  adOnly |= p->aOp
a1e0: 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20  [i].p2;.        
a1f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a200: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
a210: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
a220: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
a230: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
a240: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a250: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20  }.      }..   . 
a260: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
a270: 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
a280: 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e  ly, we need do n
a290: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c  o rollback at al
a2a0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
a2b0: 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77      ** proceed w
a2c0: 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
a2d0: 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20  handling..      
a2e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74  */.      if( not
a2f0: 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  ReadOnly || mrc!
a300: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
a310: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
a320: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49   p->rc==SQLITE_I
a330: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20  OERR_BLOCKED && 
a340: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
a350: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
a360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a370: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
a380: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
a390: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
a3a0: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72    } else if( (mr
a3b0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a3c0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
a3d0: 55 4c 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d  ULL) && isStatem
a3e0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a3f0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a400: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a410: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
a420: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
a430: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
a440: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
a450: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
a460: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
a470: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
a480: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
a490: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
a4a0: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
a4b0: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
a4c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a4d0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
a4e0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
a4f0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
a500: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
a510: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
a520: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
a530: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
a540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a550: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
a560: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
a570: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
a580: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
a590: 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74 68   active vdbe, th
a5a0: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  en.    ** we do 
a5b0: 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
a5c0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
a5d0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
a5e0: 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
a5f0: 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
a600: 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
a610: 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
a620: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
a630: 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
a640: 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65 64  bove has occured
a650: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
a660: 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
a670: 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64   && db->activeVd
a680: 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  beCnt==1 ){.    
a690: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a6a0: 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
a6b0: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
a6c0: 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
a6d0: 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
a6e0: 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
a6f0: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
a700: 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20  e, and the vdbe 
a710: 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20  program was .   
a720: 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66       ** successf
a730: 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ul or hit an 'OR
a740: 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
a750: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  t. This means a 
a760: 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
a770: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ** is required..
a780: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a790: 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65     int rc = vdbe
a7a0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
a7b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a7c0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
a7d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
a7e0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
a7f0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
a800: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a810: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
a830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a840: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
a850: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
a860: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
a870: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
a880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a890: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
a8a0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
a8b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a8d0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
a8e0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
a8f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
a900: 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  xFunc ){.      i
a910: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
a920: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
a930: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
a940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
a950: 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
a960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
a970: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
a980: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20  eeCommitStmt;.  
a990: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
a9a0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
a9b0: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
a9c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75  t ){.        xFu
a9d0: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
a9e0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
a9f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa00: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
aa10: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
aa20: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
aa30: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
aa40: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
aa50: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
aa60: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
aa70: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
aa80: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
aa90: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
aaa0: 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  one of sqlite3Bt
aab0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20  reeRollbackStmt 
aac0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
aad0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
aae0: 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f  . Call it once o
aaf0: 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20  n each backend. 
ab00: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ab10: 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  rs.    ** and th
ab20: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
ab30: 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b   still SQLITE_OK
ab40: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
ab50: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
ab60: 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61  .    ** error va
ab70: 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
ab80: 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c  assert(!xFunc ||
ab90: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
aba0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
abb0: 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46  Stmt ||.      xF
abc0: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
abd0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20  eRollbackStmt.  
abe0: 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30    );.    for(i=0
abf0: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
ac00: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
ac10: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
ac20: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
ac30: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ac40: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ac50: 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e         rc = xFun
ac60: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  c(pBt);.        
ac70: 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63  if( rc && (p->rc
ac80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
ac90: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->rc==SQLITE_CON
aca0: 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20  STRAINT) ){.    
acb0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
acc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
acd0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
ace0: 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20  >zErrMsg, 0);.  
acf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ad00: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
ad10: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
ad20: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
ad30: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
ad40: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f  statement was co
ad50: 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a  mmitted, .    **
ad60: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
ad70: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
ad80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
ad90: 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63  geCntOn && p->pc
ada0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
adb0: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
adc0: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
add0: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
ade0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
adf0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
ae00: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
ae10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ae20: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
ae30: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
ae40: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
ae50: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
ae60: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
ae70: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
ae80: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
ae90: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
aea0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
aeb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
aec0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
aed0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
aee0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
aef0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
af00: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
af10: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
af20: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
af30: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
af40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
af50: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
af60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
af70: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
af80: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
af90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
afa0: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
afb0: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
afc0: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
afd0: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
afe0: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
aff0: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
b000: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20  VdbeCnt--;.  }. 
b010: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b020: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
b030: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b040: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
b050: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b060: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b070: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b080: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
b090: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72  dbeCnt(db);..  r
b0a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b0b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
b0c0: 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
b0d0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
b0e0: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
b0f0: 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
b100: 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
b110: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
b120: 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
b130: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
b140: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
b150: 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
b160: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
b170: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
b180: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
b190: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
b1a0: 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
b1b0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
b1c0: 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
b1d0: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
b1e0: 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
b1f0: 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
b200: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
b210: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
b220: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
b230: 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
b240: 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
b250: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
b260: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
b270: 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
b280: 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
b290: 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
b2a0: 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
b2b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
b2c0: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
b2d0: 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
b2e0: 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
b2f0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
b300: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
b310: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
b320: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
b330: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
b340: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
b350: 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
b360: 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
b370: 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
b380: 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
b390: 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
b3a0: 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
b3b0: 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
b3c0: 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
b3d0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 61    */.  sqlite3Sa
b3e0: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71  fetyOn(db);.  sq
b3f0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
b400: 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  ;.  sqlite3Safet
b410: 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  yOff(db);..  /* 
b420: 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
b430: 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
b440: 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
b450: 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
b460: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
b470: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
b480: 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
b490: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
b4a0: 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
b4b0: 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
b4c0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
b4d0: 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
b4e0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
b4f0: 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
b500: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
b510: 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
b520: 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
b530: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
b540: 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
b550: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
b560: 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73     if( p->zErrMs
b570: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
b580: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
b590: 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
b5a0: 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
b5b0: 2c 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a  ,sqlite3_free);.
b5c0: 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
b5d0: 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
b5e0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
b5f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b600: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
b610: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
b620: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
b630: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b640: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b650: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
b660: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
b670: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
b680: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
b690: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
b6a0: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
b6b0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b6c0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
b6d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
b6e0: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
b6f0: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
b700: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
b710: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
b720: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
b730: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
b740: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
b750: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
b760: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
b770: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
b780: 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
b790: 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
b7a0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69  QLITE_UTF8, sqli
b7b0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 70  te3_free);.    p
b7c0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
b7d0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
b7e0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
b7f0: 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
b800: 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
b810: 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
b820: 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
b830: 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
b840: 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  run..  */.  asse
b850: 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e  rt( p->pTos<&p->
b860: 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30  aStack[p->pc<0?0
b870: 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61  :p->pc] || !p->a
b880: 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20  Stack );.#ifdef 
b890: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
b8a0: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
b8b0: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
b8c0: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
b8d0: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
b8e0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
b8f0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
b900: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
b910: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
b920: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
b930: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
b940: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
b950: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
b960: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
b970: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
b980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b990: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
b9a0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
b9b0: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
b9c0: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
b9d0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
b9e0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
b9f0: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
ba00: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
ba10: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
ba20: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
ba30: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
ba40: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
ba50: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
ba60: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
ba70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
ba80: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
ba90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
baa0: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
bab0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
bac0: 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30    p->aborted = 0
bad0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
bae0: 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
baf0: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
bb00: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
bb10: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
bb20: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
bb30: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bb40: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
bb50: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
bb60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
bb70: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
bb80: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
bb90: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
bba0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
bbb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bbc0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
bbd0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
bbe0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
bbf0: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
bc00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
bc10: 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
bc20: 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
bc30: 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
bc40: 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c );.  }else if(
bc50: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
bc60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
bc70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bc80: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
bc90: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
bca0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
bcb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
bcc0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
bcd0: 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
bce0: 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
bcf0: 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
bd00: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
bd10: 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
bd20: 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
bd30: 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
bd40: 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
bd50: 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
bd60: 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
bd70: 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
bd80: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
bd90: 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
bda0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
bdb0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
bdc0: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
bdd0: 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
bde0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
bdf0: 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
be00: 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
be10: 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
be20: 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
be30: 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
be40: 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
be50: 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26  (mask&(1<<i))) &
be60: 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
be70: 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
be80: 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
be90: 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
bea0: 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
beb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
bec0: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
bed0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
bee0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
bef0: 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
bf00: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
bf10: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
bf20: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
bf30: 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75  return;.  Cleanu
bf40: 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  p(p);.  if( p->p
bf50: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
bf60: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
bf70: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
bf80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
bf90: 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
bfa0: 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65      p->db->pVdbe
bfb0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
bfc0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
bfd0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
bfe0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
bff0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  v;.  }.  if( p->
c000: 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  aOp ){.    for(i
c010: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
c020: 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f  +){.      Op *pO
c030: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
c040: 20 20 20 20 20 20 66 72 65 65 50 33 28 70 4f 70        freeP3(pOp
c050: 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p3type, pOp->p
c060: 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  3);.    }.    sq
c070: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f  lite3_free(p->aO
c080: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  p);.  }.  releas
c090: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
c0a0: 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73  r, p->nVar);.  s
c0b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c0c0: 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
c0d0: 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b  3_free(p->aStack
c0e0: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
c0f0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
c100: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
c110: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
c120: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43  lite3_free(p->aC
c130: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
c140: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29  e3_free(p->zSql)
c150: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
c160: 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
c170: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  );.}../*.** If a
c190: 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
c1a0: 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
c1b0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
c1c0: 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
c1d0: 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52  * MoveTo now.  R
c1e0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
c1f0: 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65  ode.  If no Move
c200: 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74  To is pending, t
c210: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
c220: 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20  oes nothing and 
c230: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
c240: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
c250: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
c260: 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  o(Cursor *p){.  
c270: 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
c280: 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
c290: 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
c2a0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
c2b0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
c2c0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
c2d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
c2e0: 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
c2f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c300: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
c310: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
c320: 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
c330: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
c340: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
c350: 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65  .    *p->pIncrKe
c360: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61  y = 0;.    p->la
c370: 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49  stRowid = keyToI
c380: 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  nt(p->movetoTarg
c390: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  et);.    p->rowi
c3a0: 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  dIsValid = res==
c3b0: 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  0;.    if( res<0
c3c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
c3d0: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
c3e0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  p->pCursor, &res
c3f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
c400: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c410: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
c420: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
c430: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
c440: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e  ;.#endif.    p->
c450: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
c460: 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
c470: 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
c480: 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  TALE;.  }.  retu
c490: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c4a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
c4b0: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
c4c0: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
c4d0: 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
c4e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c4f0: 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
c500: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
c510: 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Read().** sqlite
c520: 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
c530: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
c540: 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a  erialWrite().**.
c550: 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
c560: 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
c570: 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
c580: 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
c590: 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
c5a0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
c5b0: 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
c5c0: 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
c5d0: 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
c5e0: 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
c5f0: 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
c600: 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
c610: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
c620: 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
c630: 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
c640: 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
c650: 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
c660: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
c670: 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
c680: 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
c690: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
c6a0: 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
c6b0: 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
c6c0: 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
c6d0: 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
c6e0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
c6f0: 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
c700: 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
c710: 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
c720: 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
c730: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
c740: 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
c750: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
c760: 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
c770: 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72   data blob seper
c780: 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
c790: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
c7a0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
c7b0: 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
c7c0: 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
c7d0: 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
c7e0: 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
c7f0: 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
c800: 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
c810: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
c840: 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
c860: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
c870: 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
c890: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
c8a0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
c8b0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
c8c0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
c8d0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
c8e0: 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
c910: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
c920: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
c930: 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
c940: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
c950: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
c980: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
c990: 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
c9c0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
c9d0: 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
c9e0: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
c9f0: 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
ca00: 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
ca30: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
ca40: 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
ca60: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
ca70: 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
ca80: 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
cab0: 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
cac0: 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
cad0: 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
cae0: 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
caf0: 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
cb00: 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
cb10: 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
cb20: 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
cb30: 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
cb40: 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
cb50: 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
cb60: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
cb70: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
cb80: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
cb90: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
cba0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
cbb0: 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
cbc0: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
cbd0: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
cbe0: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
cbf0: 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
cc00: 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
cc10: 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
cc20: 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
cc30: 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
cc40: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
cc50: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
cc60: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
cc70: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
cc80: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
cc90: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
cca0: 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
ccb0: 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
ccc0: 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
ccd0: 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30  (((i64)0x0000100
cce0: 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
ccf0: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
cd00: 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
cd10: 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
cd20: 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
cd30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cd40: 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  8+i;.    }.    u
cd50: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
cd60: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
cd70: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
cd80: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
cd90: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
cda0: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
cdb0: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
cdc0: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
cdd0: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
cde0: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
cdf0: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
ce00: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
ce10: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
ce20: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
ce30: 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
ce40: 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
ce50: 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
ce60: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
ce70: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
ce80: 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
ce90: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20  Mem->u.i;.  }.  
cea0: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
ceb0: 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
cec0: 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
ced0: 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
cee0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
cef0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
cf00: 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
cf10: 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
cf20: 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
cf30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
cf40: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
cf50: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
cf60: 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
cf70: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
cf80: 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
cf90: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
cfa0: 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
cfb0: 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
cfc0: 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
cfd0: 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
cfe0: 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
cff0: 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
d000: 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
d010: 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
d020: 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
d030: 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
d040: 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
d050: 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
d060: 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
d070: 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
d080: 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
d090: 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
d0a0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
d0b0: 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
d0c0: 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
d0d0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
d0e0: 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
d0f0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
d100: 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
d110: 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
d120: 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
d130: 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
d140: 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
d150: 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
d160: 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
d170: 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
d180: 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
d190: 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
d1a0: 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
d1b0: 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
d1c0: 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
d1d0: 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
d1e0: 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
d1f0: 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
d200: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
d210: 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
d220: 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
d230: 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
d240: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
d250: 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
d260: 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
d270: 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
d280: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
d290: 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
d2a0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
d2b0: 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
d2c0: 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
d2d0: 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
d2e0: 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
d2f0: 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
d300: 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
d310: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
d320: 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
d330: 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
d340: 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
d350: 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
d360: 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
d370: 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
d380: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
d390: 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
d3a0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
d3b0: 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
d3c0: 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
d3d0: 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
d3e0: 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
d3f0: 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
d400: 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
d410: 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
d420: 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
d430: 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
d440: 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
d450: 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
d460: 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
d470: 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
d480: 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
d490: 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
d4a0: 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
d4b0: 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
d4c0: 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
d4d0: 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
d4e0: 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
d4f0: 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
d500: 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
d510: 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
d520: 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
d530: 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
d540: 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
d550: 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
d560: 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
d570: 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
d580: 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
d590: 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
d5a0: 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
d5b0: 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
d5c0: 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
d5d0: 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
d5e0: 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
d5f0: 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
d600: 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
d610: 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
d620: 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
d630: 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
d640: 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
d650: 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
d660: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
d670: 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
d680: 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
d690: 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
d6a0: 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
d6b0: 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
d6c0: 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
d6d0: 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
d6e0: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
d6f0: 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
d700: 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
d710: 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
d720: 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
d730: 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
d740: 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
d750: 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
d760: 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
d770: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
d780: 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
d790: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
d7a0: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
d7b0: 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
d7c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
d7d0: 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
d7e0: 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
d7f0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
d800: 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
d810: 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
d820: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
d830: 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
d840: 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
d850: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d860: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
d870: 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
d880: 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
d890: 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
d8a0: 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74  uf[].  nBuf must
d8b0: 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61   always be.** la
d8c0: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
d8d0: 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
d8e0: 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  eld.  Except, if
d8f0: 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a   the field is.**
d900: 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a   a blob with a z
d910: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c  ero-filled tail,
d920: 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68   then buf[] migh
d930: 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69  t be just the ri
d940: 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68  ght.** size to h
d950: 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  old everything e
d960: 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65  xcept for the ze
d970: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20  ro-filled tail. 
d980: 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20   If buf[].** is 
d990: 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20  only big enough 
d9a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d  to hold the non-
d9b0: 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65  zero prefix, the
d9c0: 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61  n only write tha
d9d0: 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f  t.** prefix into
d9e0: 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20   buf[].  But if 
d9f0: 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65  buf[] is large e
da00: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f  nough to hold bo
da10: 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  th the.** prefix
da20: 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68   and the tail th
da30: 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65  en write the pre
da40: 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20  fix and set the 
da50: 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a  tail to all.** z
da60: 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eros..**.** Retu
da70: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
da80: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
da90: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
daa0: 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
dab0: 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
dac0: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
dad0: 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
dae0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
daf0: 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
db00: 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
db10: 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
db20: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
db30: 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
db40: 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c   *buf, int nBuf,
db50: 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
db60: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
db70: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
db80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
db90: 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
dba0: 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e  le_format);.  in
dbb0: 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  t len;..  /* Int
dbc0: 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
dbd0: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
dbe0: 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
dbf0: 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
dc00: 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  4 v;.    int i;.
dc10: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
dc20: 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
dc30: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
dc40: 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
dc50: 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
dc60: 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
dc70: 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
dc80: 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
dc90: 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
dca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
dcb0: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
dcc0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
dcd0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
dce0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
dcf0: 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
dd00: 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a  t( len<=nBuf );.
dd10: 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
dd20: 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
dd30: 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20   (v&0xFF);.     
dd40: 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
dd50: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
dd60: 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
dd70: 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
dd80: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
dd90: 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
dda0: 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
ddb0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
ddc0: 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30  ero)?pMem->u.i:0
ddd0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
dde0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
ddf0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
de00: 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
de10: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
de20: 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
de30: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
de40: 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
de50: 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
de60: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
de70: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
de80: 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
de90: 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  .i;.      if( le
dea0: 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  n>nBuf ){.      
deb0: 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20    len = nBuf;.  
dec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
ded0: 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
dee0: 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
def0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
df00: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
df10: 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
df20: 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
df30: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
df40: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
df50: 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
df60: 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
df70: 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
df80: 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
df90: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
dfa0: 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
dfb0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
dfc0: 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
dfd0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
dfe0: 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
dff0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
e000: 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
e010: 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
e020: 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
e030: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e050: 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
e060: 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
e070: 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e090: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
e0a0: 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
e0b0: 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
e0c0: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
e0d0: 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
e0e0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
e0f0: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
e100: 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
e110: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
e120: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
e130: 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
e140: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
e150: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
e160: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e170: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
e180: 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
e190: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
e1a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e1b0: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
e1c0: 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
e1d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e1e0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
e1f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
e200: 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
e210: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
e220: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
e230: 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
e240: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
e250: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
e260: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e270: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
e280: 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
e290: 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
e2a0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
e2b0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
e2c0: 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
e2d0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
e2e0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
e2f0: 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
e300: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e310: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e320: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
e330: 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
e340: 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
e350: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
e360: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
e370: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
e380: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
e390: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
e3a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e3b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e3c0: 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
e3d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
e3e0: 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
e3f0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
e400: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
e410: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
e420: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
e430: 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
e440: 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
e450: 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
e460: 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
e470: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
e480: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
e490: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
e4a0: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
e4b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e4c0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
e4d0: 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
e4e0: 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
e4f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
e500: 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
e510: 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
e520: 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
e530: 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
e540: 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
e550: 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
e560: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e570: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
e580: 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
e590: 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
e5a0: 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
e5b0: 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
e5c0: 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
e5d0: 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
e5e0: 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
e5f0: 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
e600: 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
e610: 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
e620: 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
e630: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
e640: 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
e650: 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
e660: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e670: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
e680: 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
e690: 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
e6a0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e6b0: 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
e6c0: 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
e6d0: 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
e6e0: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
e6f0: 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
e700: 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
e710: 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
e720: 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
e730: 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
e740: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
e750: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
e760: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
e770: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
e780: 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
e790: 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
e7a0: 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
e7b0: 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
e7c0: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
e7d0: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
e7e0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
e7f0: 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
e800: 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
e810: 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
e820: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e830: 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
e840: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e850: 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
e860: 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
e870: 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
e880: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e890: 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
e8a0: 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
e8b0: 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
e8c0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
e8d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
e8e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e8f0: 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
e900: 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
e910: 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
e920: 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
e930: 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
e940: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
e950: 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
e960: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e970: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
e990: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
e9a0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
e9b0: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
e9c0: 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
e9d0: 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
e9e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
e9f0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
ea00: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
ea10: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
ea20: 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
ea30: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ea40: 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
ea50: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
ea60: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
ea70: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
ea80: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
ea90: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
eaa0: 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
eab0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
eac0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
ead0: 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f  r of a record co
eae0: 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 71 75  nsists of a sequ
eaf0: 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65  ence variable-le
eb00: 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a  ngth integers..*
eb10: 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73  * These integers
eb20: 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
eb30: 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65  ys small and are
eb40: 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69   encoded as a si
eb50: 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68  ngle byte..** Th
eb60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
eb70: 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  o takes advantag
eb80: 65 20 74 68 69 73 20 66 61 63 74 20 74 6f 20 70  e this fact to p
eb90: 72 6f 76 69 64 65 20 61 20 66 61 73 74 20 64 65  rovide a fast de
eba0: 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69  code.** of the i
ebb0: 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72 65 63  ntegers in a rec
ebc0: 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49 74 20  ord header.  It 
ebd0: 69 73 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  is faster for th
ebe0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a  e common case.**
ebf0: 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 67   where the integ
ec00: 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62  er is a single b
ec10: 79 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69  yte.  It is a li
ec20: 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e  ttle slower when
ec30: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
ec40: 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62  is two or more b
ec50: 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61  ytes.  But overa
ec60: 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65 72 2e  ll it is faster.
ec70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
ec80: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  wing expressions
ec90: 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a   are equivalent:
eca0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73  .**.**     x = s
ecb0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
ecc0: 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a  2( A, &B );.**.*
ecd0: 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56 61 72  *     x = GetVar
ece0: 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a  int( A, B );.**.
ecf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56 61  */.#define GetVa
ed00: 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20 3d  rint(A,B)  ((B =
ed10: 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20 31   *(A))<=0x7f ? 1
ed20: 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61 72   : sqlite3GetVar
ed30: 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f  int32(A, &B))../
ed40: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ed50: 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
ed60: 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
ed70: 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20  r index records 
ed80: 73 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a  specified by .**
ed90: 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
eda0: 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79  and {nKey2, pKey
edb0: 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20  2}, returning a 
edc0: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
edd0: 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
ede0: 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c  teger if {nKey1,
edf0: 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20   pKey1} is less 
ee00: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
ee10: 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
ee20: 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32  an {nKey2, pKey2
ee30: 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e  }.  Both Key1 an
ee40: 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62  d Key2 must be b
ee50: 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63  yte strings.** c
ee60: 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f  omposed by the O
ee70: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
ee80: 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
ee90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
eea0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
eeb0: 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61  (.  void *userDa
eec0: 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ta,.  int nKey1,
eed0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
eee0: 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32  y1, .  int nKey2
eef0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
ef00: 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  ey2.){.  KeyInfo
ef10: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65   *pKeyInfo = (Ke
ef20: 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b  yInfo*)userData;
ef30: 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20  .  u32 d1, d2;  
ef40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
ef50: 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
ef60: 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
ef70: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
ef80: 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20  , idx2;      /* 
ef90: 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
efa0: 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
efb0: 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
efc0: 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72  32 szHdr1, szHdr
efd0: 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  2;  /* Number of
efe0: 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
eff0: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
f000: 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
f010: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
f020: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f030: 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
f040: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f050: 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73   *)pKey1;.  cons
f060: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f070: 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20  *aKey2 = (const 
f080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
f090: 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65  pKey2;..  Mem me
f0a0: 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a  m1;.  Mem mem2;.
f0b0: 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
f0c0: 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
f0d0: 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
f0e0: 2d 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63  ->db;.  mem2.enc
f0f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
f100: 3b 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70 4b  ;.  mem2.db = pK
f110: 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a 20  eyInfo->db;.  . 
f120: 20 69 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e   idx1 = GetVarin
f130: 74 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  t(aKey1, szHdr1)
f140: 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
f150: 0a 20 20 69 64 78 32 20 3d 20 47 65 74 56 61 72  .  idx2 = GetVar
f160: 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72  int(aKey2, szHdr
f170: 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72  2);.  d2 = szHdr
f180: 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b  2;.  nField = pK
f190: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
f1a0: 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
f1b0: 48 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48  Hdr1 && idx2<szH
f1c0: 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73  dr2 ){.    u32 s
f1d0: 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20  erial_type1;.   
f1e0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
f1f0: 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  2;..    /* Read 
f200: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
f210: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
f220: 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
f230: 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
f240: 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65  = GetVarint( aKe
f250: 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
f260: 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
f270: 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
f280: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
f290: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
f2a0: 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
f2b0: 20 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56      idx2 += GetV
f2c0: 61 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78  arint( aKey2+idx
f2d0: 32 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20  2, serial_type2 
f2e0: 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e  );.    if( d2>=n
f2f0: 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56  Key2 && sqlite3V
f300: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f310: 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30  (serial_type2)>0
f320: 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
f330: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
f340: 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
f350: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f360: 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
f370: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
f380: 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
f390: 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  pe1, &mem1);.   
f3a0: 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d2 += sqlite3Vd
f3b0: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
f3c0: 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74  y2[d2], serial_t
f3d0: 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20  ype2, &mem2);.. 
f3e0: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
f3f0: 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
f400: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
f410: 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
f420: 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64   &mem2, i<nField
f430: 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
f440: 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
f450: 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  if( mem1.flags &
f460: 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74   MEM_Dyn ) sqlit
f470: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
f480: 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28  (&mem1);.    if(
f490: 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45   mem2.flags & ME
f4a0: 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56  M_Dyn ) sqlite3V
f4b0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
f4c0: 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63  em2);.    if( rc
f4d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  !=0 ){.      bre
f4e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  ak;.    }.    i+
f4f0: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65  +;.  }..  /* One
f500: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
f510: 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20   out of fields, 
f520: 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c  but all the fiel
f530: 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
f540: 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71  int.  ** were eq
f550: 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72  ual. If the incr
f560: 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  Key flag is true
f570: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
f580: 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72  d key is.  ** tr
f590: 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e  eated as larger.
f5a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
f5b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65  0 ){.    if( pKe
f5c0: 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29  yInfo->incrKey )
f5d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
f5e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
f5f0: 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  1<nKey1 ){.     
f600: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
f610: 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20  se if( d2<nKey2 
f620: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
f630: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
f640: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
f650: 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b  ortOrder && i<pK
f660: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20  eyInfo->nField. 
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
f680: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
f690: 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
f6a0: 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20  rc = -rc;.  }.. 
f6b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f6c0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
f6d0: 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e  t is an index en
f6e0: 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69  try composed usi
f6f0: 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
f700: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
f710: 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  The last entry i
f720: 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20 73 68  n this record sh
f730: 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
f740: 65 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79  er (specifically
f750: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72  .** an integer r
f760: 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75  owid).  This rou
f770: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
f780: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
f790: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65   in.** that inte
f7a0: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
f7b0: 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
f7c0: 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  en(const u8 *aKe
f7d0: 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  y){.  u32 szHdr;
f7e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f7f0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
f800: 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
f810: 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
f820: 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
f830: 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47 65   */..  sqlite3Ge
f840: 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
f850: 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74  &szHdr);.  sqlit
f860: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  e3GetVarint32(&a
f870: 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74  Key[szHdr-1], &t
f880: 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74  ypeRowid);.  ret
f890: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53  urn sqlite3VdbeS
f8a0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
f8b0: 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f  eRowid);.}.  ../
f8c0: 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
f8d0: 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
f8e0: 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
f8f0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
f900: 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
f910: 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
f920: 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
f930: 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
f940: 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
f950: 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
f960: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
f970: 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
f980: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
f990: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
f9a0: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
f9b0: 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
f9c0: 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
f9d0: 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
f9e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
f9f0: 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
fa00: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
fa10: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
fa20: 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
fa30: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
fa40: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
fa50: 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
fa60: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
fa70: 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
fa80: 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74 65   m, v;..  sqlite
fa90: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
faa0: 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
fab0: 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
fac0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fad0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
fae0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
faf0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
fb00: 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
fb10: 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d   nCellKey, 1, &m
fb20: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
fb30: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fb40: 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  }.  sqlite3GetVa
fb50: 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
fb60: 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69   &szHdr);.  sqli
fb70: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28  te3GetVarint32((
fb80: 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
fb90: 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a  ], &typeRowid);.
fba0: 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
fbb0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
fbc0: 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
fbd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
fbe0: 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
fbf0: 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
fc00: 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
fc10: 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
fc20: 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
fc30: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
fc40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fc50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
fc60: 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
fc70: 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
fc80: 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
fc90: 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69  is point to agai
fca0: 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
fcb0: 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f  tring in pKey (o
fcc0: 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20  f length nKey). 
fcd0: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
fce0: 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
fcf0: 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
fd00: 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
fd10: 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
fd20: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
fd30: 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
fd40: 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e  an pKey.  Return
fd50: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
fd60: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65  ccess..**.** pKe
fd70: 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  y is either crea
fd80: 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
fd90: 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
fda0: 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
fdb0: 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
fdc0: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
fdd0: 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
fde0: 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
fdf0: 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
fe00: 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ored as well..*/
fe10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
fe20: 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
fe30: 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20   Cursor *pC,    
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe50: 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
fe60: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
fe70: 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
fe80: 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f  st u8 *pKey,   /
fe90: 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d  * The key to com
fea0: 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  pare */.  int *r
feb0: 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
fec0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
fed0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
fee0: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
fef0: 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
ff00: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
ff10: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
ff20: 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
ff30: 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20  int lenRowid;.  
ff40: 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  Mem m;..  sqlite
ff50: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
ff60: 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
ff70: 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
ff80: 30 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  0 ){.    *res = 
ff90: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
ffa0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
ffb0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
ffc0: 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
ffd0: 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c  pCursor, 0, nCel
ffe0: 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
fff0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
10000 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c  turn rc;.  }.  l
10010 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
10020 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
10030 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72  ((u8*)m.z);.  *r
10040 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
10050 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70 43  RecordCompare(pC
10060 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d  ->pKeyInfo, m.n-
10070 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e  lenRowid, m.z, n
10080 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71  Key, pKey);.  sq
10090 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
100a0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
100b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
100c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
100d0 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
100e0 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
100f0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
10100 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
10110 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
10120 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
10130 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
10140 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
10150 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
10160 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
10170 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
10180 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10190 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
101a0 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
101b0 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
101c0 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
101d0 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
101e0 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
101f0 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
10200 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
10210 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
10220 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
10230 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
10240 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
10250 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
10260 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
10270 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
10280 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
10290 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
102a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
102b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
102c0 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
102d0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
102e0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
102f0 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
10300 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
10310 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
10320 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
10330 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
10340 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
10350 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
10360 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
10370 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
10380 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
10390 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
103a0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
103b0 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
103c0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
103d0 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
103e0 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
103f0 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
10400 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
10410 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
10420 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
10430 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
10440 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
10450 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
10460 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
10470 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
10480 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
10490 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
104a0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
104b0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
104c0 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
104d0 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
104e0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
104f0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
10500 3b 0a 7d 0a                                      ;.}.