/ Hex Artifact Content
Login

Artifact 692f0a7622057096476da552f1bbd88f59b852c6:


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 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
02f0: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0300: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0310: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0320: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0330: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0340: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0350: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0360: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0370: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0380: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
0390: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03a0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
03b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03c0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03d0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
03f0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0400: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0410: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0420: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0430: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0440: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0450: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0460: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 64  ro(db, sizeof(Vd
0470: 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  be) );.  if( p==
0480: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0490: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66  p->db = db;.  if
04a0: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
04b0: 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50     db->pVdbe->pP
04c0: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70  rev = p;.  }.  p
04d0: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56  ->pNext = db->pV
04e0: 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20  dbe;.  p->pPrev 
04f0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65  = 0;.  db->pVdbe
0500: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = p;.  p->magic
0510: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
0520: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  IT;.  return p;.
0530: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0540: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0550: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0560: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0580: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0590: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
05a0: 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20   n){.  if( p==0 
05b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
05c0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05d0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
05e0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
05f0: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a  ->db, z, n);.}..
0600: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0610: 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20   SQL associated 
0620: 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64 20  with a prepared 
0630: 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e  statement.*/.con
0640: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0650: 56 64 62 65 47 65 74 53 71 6c 28 56 64 62 65 20  VdbeGetSql(Vdbe 
0660: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
0670: 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >zSql;.}../*.** 
0680: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
0690: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
06a0: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
06b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
06c0: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
06d0: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
06e0: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
06f0: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e  char *zTmp;.  in
0700: 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20  t nTmp;.  tmp = 
0710: 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42  *pA;.  *pA = *pB
0720: 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20  ;.  *pB = tmp;. 
0730: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78   pTmp = pA->pNex
0740: 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d  t;.  pA->pNext =
0750: 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42   pB->pNext;.  pB
0760: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a  ->pNext = pTmp;.
0770: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72    pTmp = pA->pPr
0780: 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20  ev;.  pA->pPrev 
0790: 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pB->pPrev;.  p
07a0: 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b  B->pPrev = pTmp;
07b0: 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53  .  zTmp = pA->zS
07c0: 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d  ql;.  pA->zSql =
07d0: 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d   pB->zSql;.  pB-
07e0: 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20  >zSql = zTmp;.  
07f0: 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b  nTmp = pA->nSql;
0800: 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42  .  pA->nSql = pB
0810: 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53  ->nSql;.  pB->nS
0820: 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69  ql = nTmp;.}..#i
0830: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0840: 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61  G./*.** Turn tra
0850: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a  cing on or off.*
0860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0870: 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c  beTrace(Vdbe *p,
0880: 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20   FILE *trace){. 
0890: 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63   p->trace = trac
08a0: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
08b0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
08c0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
08d0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
08e0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
08f0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
0900: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0910: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0920: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0930: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0940: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0950: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 0a 2a  tain exactly N.*
0960: 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 56 64 62 65  * elements. Vdbe
0970: 2e 6e 4f 70 41 6c 6c 6f 63 20 69 73 20 73 65 74  .nOpAlloc is set
0980: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
0990: 6e 65 77 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  new size of.** t
09a0: 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
09b0: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
09c0: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
09d0: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
09e0: 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64  the array,.** Vd
09f0: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0a00: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a10: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a20: 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e  is so that.** an
0a30: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0a40: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
0a50: 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  be correctly dea
0a60: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
0a70: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0a80: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
0aa0: 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  izeOpArray(Vdbe 
0ab0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  *p, int N){.  in
0ac0: 74 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d  t runMode = p->m
0ad0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
0ae0: 5f 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d  _RUN;.  if( runM
0af0: 6f 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c  ode || p->nOpAll
0b00: 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  oc<N ){.    Vdbe
0b10: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  Op *pNew;.    in
0b20: 74 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30  t nNew = N + 100
0b30: 2a 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20  *(!runMode);.   
0b40: 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70   int oldSize = p
0b50: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20  ->nOpAlloc;.    
0b60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
0b70: 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e  ealloc(p->aOp, n
0b80: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0b90: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
0ba0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  .      p->nOpAll
0bb0: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
0bc0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bd0: 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f        if( nNew>o
0be0: 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ldSize ){.      
0bf0: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
0c00: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e  [oldSize], 0, (n
0c10: 4e 65 77 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a  New-oldSize)*siz
0c20: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 20 20  eof(Op));.      
0c30: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
0c40: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
0c50: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
0c60: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
0c70: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0c80: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0c90: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0ca0: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0cb0: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0cc0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0cd0: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
0ce0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
0cf0: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
0d00: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
0d10: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
0d20: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
0d40: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
0d50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
0d60: 2a 2a 20 20 20 20 70 31 2c 20 70 32 20 20 20 20  **    p1, p2    
0d70: 20 20 20 20 20 20 46 69 72 73 74 20 74 77 6f 20        First two 
0d80: 6f 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 73  of the three pos
0d90: 73 69 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a  sible operands..
0da0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0db0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0dc0: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0dd0: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0de0: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0df0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0e00: 33 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  3() function to 
0e10: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0e20: 20 6f 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70   of the P3.** op
0e30: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 56  lite3VdbeAddOp(V
0e50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
0e60: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
0e70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
0e80: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
0e90: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
0ea0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0eb0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0ec0: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
0ed0: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a  <=i ){.    resiz
0ee0: 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31 29  eOpArray(p, i+1)
0ef0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  ;.    if( p->db-
0f00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
0f10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
0f30: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
0f40: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
0f50: 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70 3b 0a 20  ->opcode = op;. 
0f60: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20   pOp->p1 = p1;. 
0f70: 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20   pOp->p2 = p2;. 
0f80: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
0f90: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
0fa0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0fb0: 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  xpired = 0;.#ifd
0fc0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64    if( sqlite3_vd
0fe0: 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29  be_addop_trace )
0ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
1000: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
1010: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  p[i]);.#endif.  
1020: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
1030: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1040: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1050: 68 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f 0a  he p3 value..*/.
1060: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f  int sqlite3VdbeO
1070: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
1080: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1090: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
10a0: 7a 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29 7b  zP3,int p3type){
10b0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
10c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70  lite3VdbeAddOp(p
10d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20  , op, p1, p2);. 
10e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10f0: 67 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP3(p, addr, zP
1100: 33 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72 65  3, p3type);.  re
1110: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1120: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1130: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1140: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1150: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1160: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1170: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1180: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
1190: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
11a0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
11b0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
11c0: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
11d0: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
11e0: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
11f0: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1200: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1210: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1220: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1230: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1240: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1250: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1260: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1270: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1280: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
1290: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
12a0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
12b0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
12c0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
12d0: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
12e0: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
12f0: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1300: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1310: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1320: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1330: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1340: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1350: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1360: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1370: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1380: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
1390: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
13a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
13b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13c0: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
13d0: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
13e0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
13f0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1400: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1410: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
1420: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d  nLabelAlloc = p-
1430: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1440: 20 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62   10;.    p->aLab
1450: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1460: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1470: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
14b0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
14c0: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
14d0: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
14e0: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
14f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1500: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1510: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1520: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1530: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1540: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1550: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
1560: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
1570: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
1580: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1590: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
15a0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
15b0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
15c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
15d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
15e0: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
15f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1600: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1610: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
1630: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
1640: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
1650: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1660: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
1670: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1680: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1690: 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69  if opcode 'op' i
16a0: 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74  s guarenteed not
16b0: 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61   to push more va
16c0: 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  lues.** onto the
16d0: 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e   VDBE stack than
16e0: 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f   it pops off..*/
16f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f  .static int opco
1700: 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b  deNoPush(u8 op){
1710: 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50  .  /* The 10 NOP
1720: 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74  USH_MASK_n const
1730: 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64  ants are defined
1740: 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69   in the automati
1750: 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72  cally.  ** gener
1760: 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65  ated header file
1770: 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68   opcodes.h. Each
1780: 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74   is a 16-bit bit
1790: 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62  mask, one.  ** b
17a0: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
17b0: 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20   to each opcode 
17c0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
17d0: 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  he virtual.  ** 
17e0: 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e  machine in vdbe.
17f0: 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72  c. The bit is tr
1800: 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22  ue if the word "
1810: 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73  no-push" appears
1820: 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65  .  ** in a comme
1830: 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  nt on the same l
1840: 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65  ine as the "case
1850: 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20   OP_XXX:" in .  
1860: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ** sqlite3VdbeEx
1870: 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a  ec() in vdbe.c..
1880: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
1890: 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68   bit is true, th
18a0: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
18b0: 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67  ding opcode is g
18c0: 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uarenteed not.  
18d0: 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73  ** to grow the s
18e0: 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20  tack when it is 
18f0: 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77  executed. Otherw
1900: 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77  ise, it may grow
1910: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20   the.  ** stack 
1920: 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  by at most one e
1930: 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
1940: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f  NOPUSH_MASK_0 co
1950: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63  rresponds to opc
1960: 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f  odes 0 to 15. NO
1970: 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74  PUSH_MASK_1 cont
1980: 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69  ains.  ** one bi
1990: 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36  t for opcodes 16
19a0: 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f   to 31, and so o
19b0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d  n..  **.  ** 16-
19c0: 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61  bit bitmasks (ra
19d0: 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74  ther than 32-bit
19e0: 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  ) are specified 
19f0: 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20  in opcodes.h .  
1a00: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
1a10: 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ile is generated
1a20: 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72   by an awk progr
1a30: 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61  am. Awk manipula
1a40: 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d  tes.  ** all num
1a50: 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67  bers as floating
1a60: 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f  -point and we do
1a70: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b  n't want to risk
1a80: 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a   a rounding.  **
1a90: 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e   error if someon
1aa0: 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e  e builds with an
1ab0: 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28   awk that uses (
1ac0: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d  for example) 32-
1ad0: 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66  bit .  ** IEEE f
1ae0: 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73  loats..  */ .  s
1af0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20  tatic const u32 
1b00: 6d 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20  masks[5] = {.   
1b10: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b   NOPUSH_MASK_0 +
1b20: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1b30: 55 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29  USH_MASK_1)<<16)
1b40: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1b50: 4b 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_2 + (((unsigne
1b60: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29  d)NOPUSH_MASK_3)
1b70: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1b80: 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e  H_MASK_4 + (((un
1b90: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1ba0: 53 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_5)<<16),.    
1bb0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20  NOPUSH_MASK_6 + 
1bc0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1bd0: 53 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c  SH_MASK_7)<<16),
1be0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1bf0: 5f 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _8 + (((unsigned
1c00: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c  )NOPUSH_MASK_9)<
1c10: 3c 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65  <16).  };.  asse
1c20: 72 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20  rt( op<32*5 );. 
1c30: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f   return (masks[o
1c40: 70 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26  p>>5] & (1<<(op&
1c50: 30 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e  0x1F)));.}..#ifn
1c60: 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
1c70: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1c80: 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20  NoPush(u8 op){. 
1c90: 20 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f   return opcodeNo
1ca0: 50 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64  Push(op);.}.#end
1cb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  if../*.** Loop t
1cc0: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
1cd0: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
1ce0: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
1cf0: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45  e negative..** E
1d00: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
1d10: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
1d20: 6c 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79  lve the label by
1d30: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a   setting the P2.
1d40: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  ** value to its 
1d50: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
1d60: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1d70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d80: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
1d90: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
1da0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
1db0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
1dc0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
1dd0: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
1de0: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
1df0: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
1e00: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
1e10: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
1e20: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
1e30: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
1e40: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
1e50: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
1e60: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
1e70: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
1e80: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72  *.** The integer
1e90: 20 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73   *pMaxStack is s
1ea0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1eb0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  m number of vdbe
1ec0: 20 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65   stack.** entrie
1ed0: 73 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e  s that static an
1ee0: 61 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74  alysis reveals t
1ef0: 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68  his program migh
1f00: 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t need..**.** Th
1f10: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
1f20: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
1f30: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ng optimization:
1f40: 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a    It scans for.*
1f50: 2a 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69  * Halt instructi
1f60: 6f 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51  ons where P1==SQ
1f70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1f80: 6f 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20  or P2==OE_Abort 
1f90: 6f 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73  or for.** IdxIns
1fa0: 65 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ert instructions
1fb0: 20 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49   where P2!=0.  I
1fc0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1fd0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e  ction is.** foun
1fe0: 64 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74  d, then every St
1ff0: 61 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74  atement instruct
2000: 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74  ion is changed t
2010: 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a  o a Noop.  In.**
2020: 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76   this way, we av
2030: 6f 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65  oid creating the
2040: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2050: 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73  al file unnecess
2060: 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  arily..*/.static
2070: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
2080: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
2090: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
20a0: 2c 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b  , int *pMaxStack
20b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
20c0: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a  t nMaxArgs = 0;.
20d0: 20 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20    int nMaxStack 
20e0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a  = p->nOp;.  Op *
20f0: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
2100: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
2110: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
2120: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
2130: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
2140: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
2150: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
2160: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
2170: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
2180: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
2190: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
21a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
21b0: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
21c0: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a  de==OP_AggStep .
21d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21e0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
21f0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f  .        || opco
2200: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23  de==OP_VUpdate.#
2210: 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2220: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
2230: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2240: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
2250: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
2260: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20  de==OP_Halt ){. 
2270: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
2280: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
2290: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
22a0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
22b0: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
22c0: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
22d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22e0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
22f0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
2300: 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42     hasStatementB
2310: 65 67 69 6e 20 3d 20 31 3b 0a 23 69 66 6e 64 65  egin = 1;.#ifnde
2320: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2330: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
2340: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2350: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2360: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2370: 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53  e ){.      doesS
2380: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
2390: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
23a0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
23b0: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
23c0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
23d0: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
23e0: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
23f0: 73 65 72 74 28 20 70 4f 70 5b 2d 32 5d 2e 6f 70  sert( pOp[-2].op
2400: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2410: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2420: 70 5b 2d 32 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-2].p1;.      
2430: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2440: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2450: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2460: 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68  if( opcodeNoPush
2470: 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20 20  (opcode) ){.    
2480: 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20    nMaxStack--;. 
2490: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
24a0: 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69  p->p2>=0 ) conti
24b0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
24c0: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
24d0: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70  Label );.    pOp
24e0: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31  ->p2 = aLabel[-1
24f0: 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20  -pOp->p2];.  }. 
2500: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
2510: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
2520: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
2530: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
2540: 61 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78 53  axArgs;.  *pMaxS
2550: 74 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63 6b  tack = nMaxStack
2560: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65  ;..  /* If we ne
2570: 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73  ver rollback a s
2580: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
2590: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65  tion, then state
25a0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
25b0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e  ctions are not n
25c0: 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67  eeded.  So chang
25d0: 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65  e every OP_State
25e0: 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ment.  ** opcode
25f0: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2600: 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20  .  This avoid a 
2610: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2620: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2630: 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20  .  ** which can 
2640: 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20  be expensive on 
2650: 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a  some platforms..
2660: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74    */.  if( hasSt
2670: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20  atementBegin && 
2680: 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f  !doesStatementRo
2690: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
26a0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
26b0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
26c0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
26d0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
26e0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
26f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   ){.        pOp-
2700: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
2710: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2720: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2730: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
2740: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2750: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
2760: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
2770: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2780: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
2790: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
27a0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
27b0: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
27c0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
27d0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
27e0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
27f0: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2800: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2810: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2820: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2830: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2850: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
2860: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
2870: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
2880: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
2890: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
28a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
28b0: 4e 49 54 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f  NIT );.  resizeO
28c0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
28d0: 20 2b 20 6e 4f 70 29 3b 0a 20 20 69 66 28 20 70   + nOp);.  if( p
28e0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
28f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
2900: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
2910: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e   p->nOp;.  if( n
2920: 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  Op>0 ){.    int 
2930: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
2940: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
2950: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
2960: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
2970: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
2980: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
2990: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
29a0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
29b0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
29c0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
29d0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
29e0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
29f0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
2a00: 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44  p2<0 ? addr + AD
2a10: 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20  DR(p2) : p2;.   
2a20: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
2a30: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
2a40: 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d  t->p3type = pIn-
2a50: 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20  >p3 ? P3_STATIC 
2a60: 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  : P3_NOTUSED;.#i
2a70: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a80: 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  G.      if( sqli
2a90: 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
2aa0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
2ab0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
2ac0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
2ad0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
2ae0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2af0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
2b00: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
2b10: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2b20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2b30: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
2b40: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
2b50: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2b60: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2b70: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
2b80: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
2b90: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
2ba0: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
2bb0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
2bc0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
2bd0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
2be0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
2bf0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
2c00: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
2c10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2c20: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP1(Vdbe *p, in
2c30: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2c40: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2c50: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2c60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2c70: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2c80: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2c90: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2ca0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2cb0: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
2cc0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2cd0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2ce0: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
2cf0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2d00: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
2d10: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
2d20: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
2d30: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
2d40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d50: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
2d60: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2d70: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2d80: 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20 20  rt( val>=0 );.  
2d90: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2da0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2db0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2dc0: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
2dd0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
2de0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2df0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
2e00: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2e10: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
2e20: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
2e30: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
2e40: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2e50: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
2e60: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2e70: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2e80: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
2e90: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2ea0: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
2eb0: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
2ec0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
2ed0: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
2ee0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
2ef0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
2f00: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
2f10: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
2f20: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
2f30: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
2f40: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
2f50: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
2f60: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
2f70: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75  meralFunction(Fu
2f80: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
2f90: 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65  if( pDef && (pDe
2fa0: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
2fb0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
2fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2fd0: 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a  free(pDef);.  }.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2ff0: 61 20 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65  a P3 value if ne
3000: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
3010: 69 63 20 76 6f 69 64 20 66 72 65 65 50 33 28 69  ic void freeP3(i
3020: 6e 74 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20  nt p3type, void 
3030: 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29  *p3){.  if( p3 )
3040: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 33  {.    switch( p3
3050: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
3060: 73 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P3_DYNAMIC:. 
3070: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59       case P3_KEY
3080: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
3090: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
30a0: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
30b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b  qlite3_free(p3);
30c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
30d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
30e0: 73 65 20 50 33 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P3_MPRINTF: {
30f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3100: 5f 66 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20  _free(p3);.     
3110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3120: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33 5f  }.      case P3_
3130: 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20  VDBEFUNC: {.    
3140: 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56      VdbeFunc *pV
3150: 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46  dbeFunc = (VdbeF
3160: 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20  unc *)p3;.      
3170: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
3180: 75 6e 63 74 69 6f 6e 28 70 56 64 62 65 46 75 6e  unction(pVdbeFun
3190: 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  c->pFunc);.     
31a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
31b0: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
31c0: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
31d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31e0: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
31f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3200: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 33   }.      case P3
3210: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
3220: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
3230: 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44  lFunction((FuncD
3240: 65 66 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ef*)p3);.       
3250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3260: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45        case P3_ME
3270: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M: {.        sql
3280: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
3290: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33  qlite3_value*)p3
32a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32c0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68    }.}.../*.** Ch
32d0: 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73  ange N opcodes s
32e0: 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20  tarting at addr 
32f0: 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f  to No-ops..*/.vo
3300: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3310: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
3320: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3330: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
3340: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
3350: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
3360: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
3370: 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20  while( N-- ){.  
3380: 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e      freeP3(pOp->
3390: 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29  p3type, pOp->p3)
33a0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
33b0: 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  Op, 0, sizeof(pO
33c0: 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f  p[0]));.      pO
33d0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
33e0: 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b  oop;.      pOp++
33f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
3400: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3410: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
3420: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3430: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3440: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3450: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
3460: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3470: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3480: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3490: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
34a0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
34b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
34c0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
34d0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
34e0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
34f0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
3500: 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P3 operand is d
3510: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
3520: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
3530: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
3540: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
3550: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3560: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
3570: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
3580: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
3590: 79 74 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74  ytes of zP3 up t
35a0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
35b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
35c0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
35d0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
35e0: 74 65 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a  tes of zP3..**.*
35f0: 2a 20 49 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e  * If n==P3_KEYIN
3600: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
3610: 20 7a 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65   zP3 is a pointe
3620: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
3630: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
3640: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
3650: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
3660: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
3670: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3680: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
3690: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
36a0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
36b0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
36c0: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
36d0: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
36e0: 74 20 7a 50 33 20 70 6f 69 6e 74 73 20 74 6f 20  t zP3 points to 
36f0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
3700: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
3710: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
3720: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
3730: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3740: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
3750: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
3760: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
3770: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
3780: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
3790: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
37a0: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
37b0: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
37c0: 6e 20 28 50 33 5f 53 54 41 54 49 43 2c 20 50 33  n (P3_STATIC, P3
37d0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
37e0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 33  ndicate that zP3
37f0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
3800: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
3810: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
3820: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
3830: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
3840: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
3850: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
3860: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
3870: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
3880: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
3890: 65 6e 20 63 68 61 6e 67 65 20 50 33 20 6f 6e 20  en change P3 on 
38a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
38b0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
38c0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
38d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
38e0: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP3(Vdbe *p, int
38f0: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
3900: 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP3, int n){.
3910: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73    Op *pOp;.  ass
3920: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
3930: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3940: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
3950: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  p==0 || p->aOp==
3960: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
3970: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
3980: 69 66 20 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49  if (n != P3_KEYI
3990: 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65  NFO) {.      fre
39a0: 65 50 33 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  eP3(n, (void*)*(
39b0: 63 68 61 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20  char**)&zP3);.  
39c0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
39d0: 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30    }.  if( addr<0
39e0: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
39f0: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
3a00: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69  ->nOp - 1;.    i
3a10: 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75  f( addr<0 ) retu
3a20: 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20  rn;.  }.  pOp = 
3a30: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3a40: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3a50: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3a60: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
3a70: 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20  if( zP3==0 ){.  
3a80: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
3a90: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3aa0: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P3_NOTUSED;.  }
3ab0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b  else if( n==P3_K
3ac0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
3ad0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
3ae0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
3af0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
3b00: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
3b10: 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP3)->nField;. 
3b20: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3b30: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3b40: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3b50: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3b60: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3b70: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3b80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
3b90: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
3ba0: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
3bb0: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3bc0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3bd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
3be0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
3bf0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3c00: 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20  , zP3, nByte);. 
3c10: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
3c20: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
3c30: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
3c40: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
3c50: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
3c60: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
3c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3c80: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3c90: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
3ca0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
3cb0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
3cc0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
3cd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3ce0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3cf0: 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  3_KEYINFO;.    }
3d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
3d10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3d20: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
3d30: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
3d40: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
3d50: 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59  se if( n==P3_KEY
3d60: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
3d70: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
3d80: 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f  har*)zP3;.    pO
3d90: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b  p->p3type = P3_K
3da0: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3db0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3dc0: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
3dd0: 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  zP3;.    pOp->p3
3de0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3df0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3e00: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33  ) n = strlen(zP3
3e10: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  );.    pOp->p3 =
3e20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
3e30: 70 28 70 2d 3e 64 62 2c 20 7a 50 33 2c 20 6e 29  p(p->db, zP3, n)
3e40: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3e50: 65 20 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a  e = P3_DYNAMIC;.
3e60: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
3e70: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  DEBUG./*.** Repl
3e80: 61 63 65 20 74 68 65 20 50 33 20 66 69 65 6c 64  ace the P3 field
3e90: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
3ea0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
3eb0: 72 75 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ruction with.** 
3ec0: 63 6f 6d 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f  comment text..*/
3ed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3ee0: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
3ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
3f00: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
3f10: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73  a_list ap;.  ass
3f20: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
3f30: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
3f40: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
3f50: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
3f60: 4f 70 2d 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 70  Op-1].p3==0 || p
3f70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3f80: 65 64 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  ed );.  va_start
3f90: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
3fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3fb0: 67 65 50 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69  geP3(p, -1, sqli
3fc0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
3fd0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c  b, zFormat, ap),
3fe0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
3ff0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
4000: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
4010: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
4020: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
4030: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
4040: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
4050: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4060: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4070: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4080: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
4090: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
40a0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
40b0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
40c0: 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  led );.  return 
40d0: 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ((addr>=0 && add
40e0: 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61  r<p->nOp)?(&p->a
40f0: 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a  Op[addr]):0);.}.
4100: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4110: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
4120: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
4130: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
4140: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
4150: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
4160: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
4170: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4180: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
4190: 72 69 62 65 73 20 74 68 65 20 50 33 20 70 61 72  ribes the P3 par
41a0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
41b0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
41c0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
41d0: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
41e0: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
41f0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
4200: 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63  layP3(Op *pOp, c
4210: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
4220: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
4230: 7a 50 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  zP3;.  assert( n
4240: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
4250: 69 74 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70  itch( pOp->p3typ
4260: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33  e ){.    case P3
4270: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
4280: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
4290: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
42a0: 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29  nfo = (KeyInfo*)
42b0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
42c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
42d0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
42e0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
42f0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4300: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4310: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4320: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4330: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4340: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4350: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4360: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
4370: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
4380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4390: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
43a0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
43b0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
43c0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
43d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
43e0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4400: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4410: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4420: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4430: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4440: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4450: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4460: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
4470: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4480: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
4490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
44a0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
44b0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
44c0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
44d0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
44e0: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
44f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4500: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4510: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4520: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4540: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4550: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4560: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
4570: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
4580: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33  emp );.      zP3
4590: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
45a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
45b0: 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51   case P3_COLLSEQ
45c0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
45d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
45e0: 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Seq*)pOp->p3;.  
45f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4600: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4610: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
4620: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
4630: 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20  e);.      zP3 = 
4640: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
4650: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4660: 73 65 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b  se P3_FUNCDEF: {
4670: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
4680: 70 44 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a  pDef = (FuncDef*
4690: 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20  )pOp->p3;.      
46a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
46b0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
46c0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
46d0: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
46e0: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
46f0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4700: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
4710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4720: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
4730: 73 65 20 50 33 5f 56 54 41 42 3a 20 7b 0a 20 20  se P3_VTAB: {.  
4740: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
4750: 20 2a 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74   *pVtab = (sqlit
4760: 65 33 5f 76 74 61 62 2a 29 70 4f 70 2d 3e 70 33  e3_vtab*)pOp->p3
4770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4780: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4790: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
47a0: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
47b0: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
47c0: 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a     zP3 = zTemp;.
47d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
47f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
4800: 50 33 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  P3 = pOp->p3;.  
4810: 20 20 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c      if( zP3==0 |
4820: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
4830: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
4840: 20 20 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20    zP3 = "";.    
4850: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4860: 61 73 73 65 72 74 28 20 7a 50 33 21 3d 30 20 29  assert( zP3!=0 )
4870: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 3b 0a  ;.  return zP3;.
4880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  }.#endif...#if d
4890: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
48a0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
48b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
48c0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
48d0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
48e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
48f0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
4900: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
4910: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
4920: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
4930: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
4940: 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63 68 61  char *zP3;.  cha
4950: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74  r zPtr[50];.  st
4960: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4970: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
4980: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
4990: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
49a0: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
49b0: 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64 69 73  out;.  zP3 = dis
49c0: 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50 74 72  playP3(pOp, zPtr
49d0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
49e0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
49f0: 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20 20 20   zFormat1,.     
4a00: 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70 63 6f   pc, sqlite3Opco
4a10: 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 63  deNames[pOp->opc
4a20: 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode], pOp->p1, p
4a30: 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a 20 20  Op->p2, zP3);.  
4a40: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
4a50: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4a60: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
4a70: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
4a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a90: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4aa0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
4ab0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77    if( p ){.    w
4ac0: 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20  hile( N-->0 ){. 
4ad0: 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32       assert( N<2
4ae0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
4af0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 73 71  ].db );.      sq
4b00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
4b10: 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a  ase(p++);.    }.
4b20: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
4b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
4b40: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
4b50: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
4b60: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
4b70: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
4b80: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
4b90: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
4ba0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
4bb0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
4bc0: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
4bd0: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
4be0: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
4bf0: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
4c00: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4c10: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
4c20: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
4c30: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a  t "EXPLAIN"..*/.
4c40: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c  int sqlite3VdbeL
4c50: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20  ist(.  Vdbe *p  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
4c80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4c90: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
4ca0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
4cb0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
4cc0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
4cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
4ce0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
4cf0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4d00: 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72  _MISUSE;.  asser
4d10: 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  t( db->magic==SQ
4d20: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20  LITE_MAGIC_BUSY 
4d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
4d40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
4d50: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
4d60: 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  USY );..  /* Eve
4d70: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
4d80: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 75  code does not pu
4d90: 74 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  t dynamic string
4da0: 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  s onto the.  ** 
4db0: 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79 20  the stack, they 
4dc0: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
4dd0: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
4de0: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
4df0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
4e00: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
4e10: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
4e20: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
4e30: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d  /.  if( p->pTos=
4e40: 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29  =&p->aStack[4] )
4e50: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
4e60: 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c  Array(p->aStack,
4e70: 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65   5);.  }.  p->re
4e80: 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20  sOnStack = 0;.. 
4e90: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
4ea0: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
4eb0: 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65  i<p->nOp && p->e
4ec0: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
4ed0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
4ee0: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
4ef0: 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  f( i>=p->nOp ){.
4f00: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
4f10: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
4f20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
4f30: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
4f40: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
4f50: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
4f60: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
4f70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
4f80: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
4f90: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
4fa0: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 45  ErrMsg, sqlite3E
4fb0: 72 72 53 74 72 28 70 2d 3e 72 63 29 2c 20 28 63  rrStr(p->rc), (c
4fc0: 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65  har*)0);.  }else
4fd0: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
4fe0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
4ff0: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *pMem = p->a
5000: 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d  Stack;.    pMem-
5010: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5020: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  ;.    pMem->type
5030: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5040: 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  R;.    pMem->u.i
5050: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
5080: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  counter */.    p
5090: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
50a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
50b0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
50c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d  _Term;.    pMem-
50d0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
50e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
50f0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a  Op->opcode];  /*
5100: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 61   Opcode */.    a
5110: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
5120: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
5130: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5140: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
5150: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
5160: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
5170: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
5180: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
5190: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
51a0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
51b0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
51e0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
51f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5200: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
5210: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5220: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
5230: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5240: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
5270: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5280: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5290: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
52a0: 61 67 73 20 3d 20 4d 45 4d 5f 45 70 68 65 6d 7c  ags = MEM_Ephem|
52b0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
52c0: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
52d0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
52e0: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
52f0: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
5300: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
5310: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
5320: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65  >z!=0 );.    pMe
5330: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
5340: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
5350: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5360: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
5370: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
5380: 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43  8;..    p->nResC
5390: 6f 6c 75 6d 6e 20 3d 20 35 20 2d 20 32 2a 28 70  olumn = 5 - 2*(p
53a0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
53b0: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d 65 6d    p->pTos = pMem
53c0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
53d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e  LITE_OK;.    p->
53e0: 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 31 3b 0a  resOnStack = 1;.
53f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5400: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
5410: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
5420: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
5430: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
5440: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
5450: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
5460: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
5470: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
5480: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
5490: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
54a0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
54b0: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
54c0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
54d0: 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  pOp;.  if( nOp<1
54e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
54f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31   = &p->aOp[nOp-1
5500: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
5510: 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26  code==OP_Noop &&
5520: 20 70 4f 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20   pOp->p3!=0 ){. 
5530: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5540: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
5550: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
5560: 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20  (u8*)z) ) z++;. 
5570: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
5580: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
5590: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
55a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
55b0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
55c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
55d0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
55e0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
55f0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
5600: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
5610: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5620: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
5630: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
5640: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
5650: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
5660: 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72 61  ( sqlite3_io_tra
5670: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
5680: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
5690: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
56a0: 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20  ->aOp[nOp-1];.  
56b0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
56c0: 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d  =OP_Noop && pOp-
56d0: 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >p3!=0 ){.    in
56e0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
56f0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
5700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
5710: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
5720: 22 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20  ", pOp->p3);.   
5730: 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63   for(i=0; isspac
5740: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
5750: 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  )z[i]); i++){}. 
5760: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
5770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
5780: 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ( isspace((unsig
5790: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29  ned char)z[i]) )
57a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
57b0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
57c0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
57d0: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
57e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
57f0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
5800: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
5810: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
5820: 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 74 72     sqlite3_io_tr
5830: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
5840: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
5850: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
5860: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
5870: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
5880: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  */.../*.** Prepa
5890: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
58a0: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
58b0: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  on.  This involv
58c0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
58d0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
58e0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
58f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
5900: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
5910: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
5920: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
5930: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
5940: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
5950: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
5960: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
5970: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
5980: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
5990: 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45  y to move a VDBE
59a0: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
59b0: 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45  _INIT to.** VDBE
59c0: 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76  _MAGIC_RUN..*/.v
59d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
59e0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
59f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5a10: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
5a20: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
5a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5a40: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
5a50: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
5a60: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
5a70: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
5a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5a90: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
5aa0: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
5ab0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5ae0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
5af0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ate */.  int isE
5b00: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5b20: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
5b30: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
5b40: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
5b50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
5b60: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  = p->db;..  asse
5b70: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
5b80: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5b90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5ba0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
5bb0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
5bc0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
5bd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
5be0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
5bf0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
5c00: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
5c10: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
5c20: 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20  n later. This.  
5c30: 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68   * is because th
5c40: 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65  e call to resize
5c50: 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20  OpArray() below 
5c60: 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20  may shrink the. 
5c70: 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72    * p->aOp[] arr
5c80: 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72  ay to save memor
5c90: 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e  y if called when
5ca0: 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   in VDBE_MAGIC_R
5cb0: 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a  UN .   * state..
5cc0: 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63     */.  p->magic
5cd0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
5ce0: 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73 74  N;..  /* No inst
5cf0: 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75 73  ruction ever pus
5d00: 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 20  hes more than a 
5d10: 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20 6f  single element o
5d20: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61  nto the.  ** sta
5d30: 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74 61  ck.  And the sta
5d40: 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20 6f  ck never grows o
5d50: 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78 65  n successive exe
5d60: 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  cutions of the. 
5d70: 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20 20   ** same loop.  
5d80: 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  So the total num
5d90: 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ber of instructi
5da0: 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72 20  ons is an upper 
5db0: 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  bound.  ** on th
5dc0: 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20  e maximum stack 
5dd0: 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e 20  depth required. 
5de0: 20 28 41 64 64 65 64 20 6c 61 74 65 72 3a 29 20   (Added later:) 
5df0: 20 54 68 65 0a 20 20 2a 2a 20 72 65 73 6f 6c 76   The.  ** resolv
5e00: 65 50 32 56 61 6c 75 65 73 28 29 20 63 61 6c 6c  eP2Values() call
5e10: 20 63 6f 6d 70 75 74 65 73 20 61 20 74 69 67 68   computes a tigh
5e20: 74 65 72 20 75 70 70 65 72 20 62 6f 75 6e 64 20  ter upper bound 
5e30: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63  on the.  ** stac
5e40: 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a  k size..  **.  *
5e50: 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c  * Allocation all
5e60: 20 74 68 65 20 73 74 61 63 6b 20 73 70 61 63 65   the stack space
5e70: 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20 6e 65   we will ever ne
5e80: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
5e90: 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20  ->aStack==0 ){. 
5ea0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
5eb0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
5ec0: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
5ed0: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
5ee0: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
5ef0: 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20 2f  nt nStack;     /
5f00: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
5f10: 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72 69 65   of stack entrie
5f20: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
5f30: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
5f40: 73 28 70 2c 20 26 6e 41 72 67 2c 20 26 6e 53 74  s(p, &nArg, &nSt
5f50: 61 63 6b 29 3b 0a 20 20 20 20 72 65 73 69 7a 65  ack);.    resize
5f60: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
5f70: 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
5f80: 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 61  nVar>=0 );.    a
5f90: 73 73 65 72 74 28 20 6e 53 74 61 63 6b 3c 70 2d  ssert( nStack<p-
5fa0: 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28 20  >nOp );.    if( 
5fb0: 69 73 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  isExplain ){.   
5fc0: 20 20 20 6e 53 74 61 63 6b 20 3d 20 31 30 3b 0a     nStack = 10;.
5fd0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 53 74      }.    p->aSt
5fe0: 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ack = sqlite3DbM
5ff0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
6000: 20 20 20 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a        nStack*siz
6010: 65 6f 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d  eof(p->aStack[0]
6020: 29 20 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a  )    /* aStack *
6030: 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73  /.      + nArg*s
6040: 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20  izeof(Mem*)     
6050: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72           /* apAr
6060: 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  g */.      + nVa
6070: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20  r*sizeof(Mem)   
6080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6090: 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Var */.      + n
60a0: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
60b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
60c0: 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20   azVar */.      
60d0: 2b 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  + nMem*sizeof(Me
60e0: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
60f0: 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20   /* aMem */.    
6100: 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65    + nCursor*size
6110: 6f 66 28 43 75 72 73 6f 72 2a 29 20 20 20 20 20  of(Cursor*)     
6120: 20 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20     /* apCsr */. 
6130: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64     );.    if( !d
6140: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6150: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
6160: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53   = &p->aStack[nS
6170: 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  tack];.      p->
6180: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20  nMem = nMem;.   
6190: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d     p->aVar = &p-
61a0: 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20  >aMem[nMem];.   
61b0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61     p->nVar = nVa
61c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61  r;.      p->okVa
61d0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
61e0: 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26  apArg = (Mem**)&
61f0: 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  p->aVar[nVar];. 
6200: 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20       p->azVar = 
6210: 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72  (char**)&p->apAr
6220: 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70  g[nArg];.      p
6230: 2d 3e 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f  ->apCsr = (Curso
6240: 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56  r**)&p->azVar[nV
6250: 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  ar];.      p->nC
6260: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
6270: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
6280: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
6290: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
62a0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
62b0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  l;.        p->aV
62c0: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
62d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
62e0: 28 6e 3d 30 3b 20 6e 3c 6e 53 74 61 63 6b 3b 20  (n=0; n<nStack; 
62f0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
6300: 3e 61 53 74 61 63 6b 5b 6e 5d 2e 64 62 20 3d 20  >aStack[n].db = 
6310: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
6320: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b  }.  }.  for(n=0;
6330: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
6340: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d  {.    p->aMem[n]
6350: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
6360: 6c 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  l;.    p->aMem[n
6370: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 0a  ].db = db;.  }..
6380: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e    p->pTos = &p->
6390: 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d  aStack[-1];.  p-
63a0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
63b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
63c0: 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20   p->uniqueCnt = 
63d0: 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65  0;.  p->returnDe
63e0: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72  pth = 0;.  p->er
63f0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
6400: 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74  bort;.  p->popSt
6410: 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65  ack =  0;.  p->e
6420: 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c  xplain |= isExpl
6430: 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ain;.  p->magic 
6440: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
6450: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
6460: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
6470: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
6480: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
6490: 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65   255;.  p->opene
64a0: 64 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  dStatement = 0;.
64b0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
64c0: 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ILE.  {.    int 
64d0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
64e0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
64f0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
6500: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  cnt = 0;.      p
6510: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
6520: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
6530: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
6540: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e  lose a cursor an
6550: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
6560: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
6570: 20 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a   cursor happens.
6580: 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ** to hold..*/.v
6590: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
65a0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
65b0: 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  p, Cursor *pCx){
65c0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
65d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
65e0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  .  if( pCx->pCur
65f0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
6600: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
6610: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
6620: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
6630: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
6640: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
6650: 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66  x->pBt);.  }.#if
6660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6670: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6680: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
6690: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
66a0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
66b0: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
66c0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
66d0: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
66e0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
66f0: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
6700: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
6710: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
6720: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
6730: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f  (p->db);.    pMo
6740: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
6750: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  abCursor);.    s
6760: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
6770: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ->db);.    p->in
6780: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
6790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
67a0: 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70  ite3_free(pCx->p
67b0: 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
67c0: 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65  _free(pCx->aType
67d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
67e0: 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(pCx);.}../*.**
67f0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
6800: 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  rs.*/.static voi
6810: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
6820: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
6830: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
6840: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
6850: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6860: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
6870: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 6e 56 74      if( !p->inVt
6880: 61 62 4d 65 74 68 6f 64 20 7c 7c 20 28 70 2d 3e  abMethod || (p->
6890: 61 70 43 73 72 5b 69 5d 20 26 26 20 21 70 2d 3e  apCsr[i] && !p->
68a0: 61 70 43 73 72 5b 69 5d 2d 3e 70 56 74 61 62 43  apCsr[i]->pVtabC
68b0: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
68c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
68d0: 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73  ursor(p, p->apCs
68e0: 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  r[i]);.      p->
68f0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
6900: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
6910: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
6920: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
6930: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6940: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
6950: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
6960: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
6970: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
6980: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
6990: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
69a0: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
69b0: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
69c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
69d0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
69e0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
69f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6a00: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   i;.  if( p->aSt
6a10: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  ack ){.    relea
6a20: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
6a30: 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54  tack, 1 + (p->pT
6a40: 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29  os - p->aStack))
6a50: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
6a60: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
6a70: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
6a80: 72 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65  rsors(p);.  rele
6a90: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
6aa0: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
6ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f   sqlite3VdbeFifo
6ac0: 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29  Clear(&p->sFifo)
6ad0: 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65  ;.  if( p->conte
6ae0: 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66  xtStack ){.    f
6af0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e  or(i=0; i<p->con
6b00: 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b  textStackTop; i+
6b10: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6b20: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
6b30: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b  p->contextStack[
6b40: 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d  i].sFifo);.    }
6b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6b60: 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  e(p->contextStac
6b70: 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e  k);.  }.  p->con
6b80: 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20  textStack = 0;. 
6b90: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6ba0: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
6bb0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20  contextStackTop 
6bc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
6bd0: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
6be0: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
6bf0: 30 3b 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61  0;.  p->resOnSta
6c00: 63 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck = 0;.}../*.**
6c10: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
6c20: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
6c30: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
6c40: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6c50: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
6c60: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
6c70: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
6c80: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
6c90: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
6ca0: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
6cb0: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
6cc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
6cd0: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
6ce0: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
6cf0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
6d00: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
6d10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6d20: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
6d30: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
6d40: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
6d50: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
6d60: 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65   n;..  releaseMe
6d70: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
6d80: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
6d90: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
6da0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
6db0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
6dc0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
6dd0: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
6de0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c  Column = nResCol
6df0: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
6e00: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
6e10: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
6e20: 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c  allocZero(p->db,
6e30: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
6e40: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
6e50: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6e60: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
6e70: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
6e80: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
6e90: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
6ea0: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
6eb0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
6ec0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
6ed0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6ee0: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
6ef0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
6f00: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
6f10: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
6f20: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
6f30: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
6f40: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
6f50: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
6f60: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
6f70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
6f80: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
6f90: 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53  **.** If N==P3_S
6fa0: 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20  TATIC  it means 
6fb0: 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20  that zName is a 
6fc0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e  pointer to a con
6fd0: 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20  stant static.** 
6fe0: 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61  string and we ca
6ff0: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
7000: 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69  pointer. If it i
7010: 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68  s P3_DYNAMIC, th
7020: 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e  en .** the strin
7030: 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e 67  g is freed using
7040: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
7050: 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
7060: 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a   finished with.*
7070: 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  * it. Otherwise,
7080: 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d   N bytes of zNam
7090: 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f  e are copied..*/
70a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
70b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20  SetColName(Vdbe 
70c0: 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
70d0: 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72   var, const char
70e0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b   *zName, int N){
70f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
7100: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73   *pColName;.  as
7110: 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65  sert( idx<p->nRe
7120: 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  sColumn );.  ass
7130: 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45  ert( var<COLNAME
7140: 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  _N );.  if( p->d
7150: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7160: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7170: 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28  NOMEM;.  assert(
7180: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
7190: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
71a0: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
71b0: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
71c0: 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d  umn]);.  if( N==
71d0: 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d  P3_DYNAMIC || N=
71e0: 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20  =P3_STATIC ){.  
71f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
7200: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
7210: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
7220: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7230: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7240: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
7250: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
7260: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
7270: 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f  Name, N, SQLITE_
7280: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e  UTF8,SQLITE_TRAN
7290: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66  SIENT);.  }.  if
72a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
72b0: 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43  && N==P3_DYNAMIC
72c0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
72d0: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e  ->flags = (pColN
72e0: 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d  ame->flags&(~MEM
72f0: 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79  _Static))|MEM_Dy
7300: 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  n;.    pColName-
7310: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  >xDel = 0;.  }. 
7320: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7330: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
7340: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
7350: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
7360: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
7370: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
7380: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
7390: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
73a0: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
73b0: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
73c0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
73d0: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
73e0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
73f0: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
7400: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
7410: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
7420: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
7430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
7440: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
7450: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
7460: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
7470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
7480: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
7490: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
74a0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
74b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
74c0: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
74d0: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  mmit = 0;..  /* 
74e0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
74f0: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
7500: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
7510: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
7520: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
7530: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
7540: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
7550: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
7560: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
7570: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
7580: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
7590: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
75a0: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
75b0: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
75c0: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
75d0: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
75e0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
75f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
7600: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
7610: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
7620: 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rc);.  if( rc!=S
7630: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7640: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
7650: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
7660: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
7670: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
7680: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
7690: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
76a0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
76b0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
76c0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
76d0: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
76e0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
76f0: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
7700: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
7710: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
7720: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
7730: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
7740: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
7750: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
7760: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
7770: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
7780: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
7790: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
77a0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
77b0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
77c0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
77d0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
77e0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
77f0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
7800: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65  pBt) ){.      ne
7810: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
7820: 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20       if( i!=1 ) 
7830: 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a  nTrans++;.    }.
7840: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
7850: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
7860: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
7870: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
7880: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
7890: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
78a0: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
78b0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
78c0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
78d0: 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  (db);.    rc = d
78e0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
78f0: 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
7900: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  g);.    sqlite3S
7910: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20  afetyOn(db);.   
7920: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
7930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7940: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
7950: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
7960: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
7970: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
7980: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
7990: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
79a0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
79b0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
79c0: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
79d0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
79e0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
79f0: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
7a00: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
7a10: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
7a20: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
7a30: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
7a40: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
7a50: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
7a60: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7a70: 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e  is :memory:.  In
7a80: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
7a90: 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72  .  ** not suppor
7aa0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
7ab0: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
7ac0: 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65 20 63  use the simple c
7ad0: 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f  ase then.  ** to
7ae0: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
7af0: 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42  =strlen(sqlite3B
7b00: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
7b10: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
7b20: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b   || nTrans<=1 ){
7b30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
7b40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
7b50: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
7b60: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
7b70: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
7b80: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
7b90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
7ba0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
7bb0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
7bc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
7bd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
7be0: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
7bf0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
7c00: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
7c10: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
7c20: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
7c30: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
7c40: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
7c50: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
7c60: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
7c70: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
7c80: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
7c90: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
7ca0: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
7cb0: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
7cc0: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
7cd0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
7ce0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
7cf0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
7d00: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
7d10: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
7d20: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
7d30: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
7d40: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7d50: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7d60: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
7d70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
7d80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
7d90: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
7da0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7db0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7dc0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
7dd0: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
7de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7df0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
7e00: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
7e10: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
7e20: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
7e30: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
7e40: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
7e50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
7e60: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
7e70: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
7e80: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
7e90: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
7ea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
7eb0: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
7ec0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
7ed0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
7ee0: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
7ef0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
7f00: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
7f10: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
7f20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7f30: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
7f40: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
7f50: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
7f60: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
7f70: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
7f80: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
7f90: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
7fa0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  offset = 0;..   
7fb0: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
7fc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7fd0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20   name */.    do 
7fe0: 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e 64  {.      u32 rand
7ff0: 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  om;.      sqlite
8000: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 61  .      sqlite3Ra
8020: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
8030: 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d  random), &random
8040: 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72  );.      zMaster
8050: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8060: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58  f(db, "%s-mj%08X
8070: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61  ", zMainFile, ra
8080: 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29  ndom&0x7fffffff)
8090: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
80a0: 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ster ){.        
80b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
80c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
80d0: 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33   }while( sqlite3
80e0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
80f0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
8100: 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29 3b  CCESS_EXISTS) );
8110: 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
8120: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8130: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
8140: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
8150: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
8160: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
8170: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
8180: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
8190: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
81a0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
81b0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
81c0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
81d0: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 29 3b  OURNAL, 0.    );
81e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
81f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8200: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
8210: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
8220: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
8230: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
8240: 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
8250: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
8260: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
8270: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
8280: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
8290: 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
82a0: 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
82b0: 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
82c0: 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
82d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
82e0: 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
82f0: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
8300: 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
8310: 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
8320: 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
8330: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
8340: 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
8350: 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
8360: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
8370: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
8380: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
8390: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
83a0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
83b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
83c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
83d0: 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e    if( i==1 ) con
83e0: 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f  tinue;   /* Igno
83f0: 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
8400: 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  base */.      if
8410: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
8420: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
8430: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
8440: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
8450: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
8460: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
8470: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
8480: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
8490: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
84a0: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
84b0: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
84c0: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
84d0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
84e0: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
84f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
8500: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
8510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
8520: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8530: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
8540: 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  , strlen(zFile)+
8550: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
8560: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74      offset += st
8570: 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  rlen(zFile)+1;. 
8580: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
8590: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
85a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
85b0: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
85c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
85d0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
85e0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
85f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8600: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8610: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8620: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
8630: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8640: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
8650: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8660: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
8670: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
8680: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
8690: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
86a0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
86b0: 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65  */.    zMainFile
86c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
86d0: 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44  etDirname(db->aD
86e0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[0].pBt);.    i
86f0: 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20  f( (needSync .  
8700: 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74     && (0==(sqlit
8710: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
8720: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
8730: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
8740: 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20  SEQUENTIAL)).   
8750: 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33    && (rc=sqlite3
8760: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
8770: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
8780: 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  AL))!=SQLITE_OK)
8790: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
87a0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
87b0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
87c0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
87d0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
87e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
87f0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8800: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8810: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
8820: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
8830: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
8840: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
8850: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
8860: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
8870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
8880: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
8890: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
88a0: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
88b0: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
88c0: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
88d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
88e0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
88f0: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
8900: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
8910: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
8920: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
8930: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8940: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
8950: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
8960: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
8970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8980: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
8990: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
89a0: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
89b0: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
89c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
89d0: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
89e0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
89f0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
8a00: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
8a10: 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20  lure occured..  
8a20: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
8a30: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
8a40: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
8a50: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
8a60: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8a70: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
8a80: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
8a90: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
8aa0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Bt) ){.        r
8ab0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
8ac0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
8ad0: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
8ae0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8af0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
8b00: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
8b10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8b20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
8b30: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8b40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8b50: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
8b60: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
8b70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8b80: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
8b90: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
8ba0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
8bb0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
8bc0: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
8bd0: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
8be0: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
8bf0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
8c00: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
8c10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
8c20: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
8c30: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
8c40: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
8c50: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
8c60: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
8c70: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
8c80: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8c90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
8ca0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
8cb0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
8cc0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
8cd0: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
8ce0: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
8cf0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
8d00: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
8d10: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
8d20: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
8d30: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
8d40: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
8d50: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
8d60: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
8d70: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
8d80: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
8d90: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
8da0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
8db0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
8dc0: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
8dd0: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
8de0: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
8df0: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
8e00: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
8e10: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
8e20: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
8e30: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
8e40: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
8e50: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
8e60: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
8e70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8e80: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8e90: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
8ea0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
8eb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
8ec0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8ed0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8ee0: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
8ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e    }.    }.    en
8f00: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
8f10: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
8f20: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
8f30: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
8f40: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
8f50: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
8f60: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
8f70: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
8f80: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
8f90: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
8fa0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
8fb0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
8fc0: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
8fd0: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
8fe0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
8ff0: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
9000: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
9010: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
9020: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
9030: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
9040: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
9050: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
9060: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
9070: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
9080: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
9090: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
90a0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
90b0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
90c0: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
90d0: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
90e0: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
90f0: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
9100: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
9110: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9120: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
9130: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
9140: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
9150: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
9160: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
9170: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
9180: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
9190: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  veVdbeCnt );.}.#
91a0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
91b0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
91c0: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
91d0: 20 46 69 6e 64 20 65 76 65 72 79 20 61 63 74 69   Find every acti
91e0: 76 65 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e  ve VM other than
91f0: 20 70 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67   pVdbe and chang
9200: 65 20 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a  e its status to.
9210: 2a 2a 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69  ** aborted.  Thi
9220: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f  s happens when o
9230: 6e 65 20 56 4d 20 63 61 75 73 65 73 20 61 20 72  ne VM causes a r
9240: 6f 6c 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61  ollback due to a
9250: 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  n.** ON CONFLICT
9260: 20 52 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65   ROLLBACK clause
9270: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20   (for example). 
9280: 20 54 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d   The other VMs m
9290: 75 73 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65  ust be.** aborte
92a0: 64 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 64  d so that they d
92b0: 6f 20 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20  o not have data 
92c0: 72 6f 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20  rolled out from 
92d0: 75 6e 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68  underneath.** th
92e0: 65 6d 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20  em leading to a 
92f0: 73 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76 6f 69  segfault..*/.voi
9300: 64 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74  d sqlite3AbortOt
9310: 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28 73  herActiveVdbes(s
9320: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
9330: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 56 64   *pExcept){.  Vd
9340: 62 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f  be *pOther;.  fo
9350: 72 28 70 4f 74 68 65 72 3d 64 62 2d 3e 70 56 64  r(pOther=db->pVd
9360: 62 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74 68  be; pOther; pOth
9370: 65 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  er=pOther->pNext
9380: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 74 68 65  ){.    if( pOthe
9390: 72 3d 3d 70 45 78 63 65 70 74 20 29 20 63 6f 6e  r==pExcept ) con
93a0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
93b0: 4f 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44  Other->magic!=VD
93c0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
93d0: 70 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63  pOther->pc<0 ) c
93e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63 68 65  ontinue;.    che
93f0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
9400: 64 62 29 3b 0a 20 20 20 20 63 6c 6f 73 65 41 6c  db);.    closeAl
9410: 6c 43 75 72 73 6f 72 73 28 70 4f 74 68 65 72 29  lCursors(pOther)
9420: 3b 0a 20 20 20 20 63 68 65 63 6b 41 63 74 69 76  ;.    checkActiv
9430: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
9440: 20 20 70 4f 74 68 65 72 2d 3e 61 62 6f 72 74 65    pOther->aborte
9450: 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
9460: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9470: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
9480: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
9490: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
94a0: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
94b0: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
94c0: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
94d0: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
94e0: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
94f0: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
9500: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
9510: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
9520: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
9530: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
9540: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
9550: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
9560: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
9570: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
9580: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a  ITE_MAGIC_HALT..
9590: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
95a0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
95b0: 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
95c0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
95d0: 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
95e0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
95f0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
9600: 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
9610: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
9620: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
9630: 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
9640: 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
9650: 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
9660: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
9670: 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
9680: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
9690: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
96a0: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72  int (*xFunc)(Btr
96b0: 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f  ee *pBt) = 0;  /
96c0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
96d0: 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65  ll on each btree
96e0: 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e   backend */.  in
96f0: 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
9700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9710: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53  Set to true if S
9720: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49  QLITE_NOMEM or I
9730: 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  OERR */..  /* Th
9740: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
9750: 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
9760: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
9770: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
9780: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
9790: 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
97a0: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
97b0: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
97c0: 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
97d0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
97e0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
97f0: 20 2a 2a 0a 20 20 2a 2a 20 53 70 65 63 69 61 6c   **.  ** Special
9800: 20 65 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20 20   errors:.  **.  
9810: 2a 2a 20 20 20 20 20 49 66 20 61 6e 20 53 51 4c  **     If an SQL
9820: 49 54 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f 72 20  ITE_NOMEM error 
9830: 68 61 73 20 6f 63 63 75 72 65 64 20 69 6e 20 61  has occured in a
9840: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
9850: 77 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20 20  writes to.  **  
9860: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 2c     the database,
9870: 20 74 68 65 6e 20 65 69 74 68 65 72 20 61 20 73   then either a s
9880: 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
9890: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
98a0: 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 20 20 20 20  rolled.  **     
98b0: 62 61 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74  back to ensure t
98c0: 68 65 20 74 72 65 65 2d 73 74 72 75 63 74 75 72  he tree-structur
98d0: 65 73 20 61 72 65 20 69 6e 20 61 20 63 6f 6e 73  es are in a cons
98e0: 69 73 74 65 6e 74 20 73 74 61 74 65 2e 20 41 0a  istent state. A.
98f0: 20 20 2a 2a 20 20 20 20 20 73 74 61 74 65 6d 65    **     stateme
9900: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
9910: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66  s rolled back if
9920: 20 6f 6e 65 20 69 73 20 6f 70 65 6e 2c 20 6f 74   one is open, ot
9930: 68 65 72 77 69 73 65 20 74 68 65 0a 20 20 2a 2a  herwise the.  **
9940: 20 20 20 20 20 65 6e 74 69 72 65 20 74 72 61 6e       entire tran
9950: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
9960: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 2a  rolled back..  *
9970: 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20 61 6e  *.  **     If an
9980: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 65 72   SQLITE_IOERR er
9990: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
99a0: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  in a statement t
99b0: 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a 20 20  hat writes to.  
99c0: 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74 61 62  **     the datab
99d0: 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  ase, then the en
99e0: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
99f0: 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
9a00: 62 61 63 6b 2e 20 54 68 65 0a 20 20 2a 2a 20 20  back. The.  **  
9a10: 20 20 20 49 2f 4f 20 65 72 72 6f 72 20 6d 61 79     I/O error may
9a20: 20 68 61 76 65 20 63 61 75 73 65 64 20 67 61 72   have caused gar
9a30: 62 61 67 65 20 74 6f 20 62 65 20 77 72 69 74 74  bage to be writt
9a40: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
9a50: 6c 20 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c 65  l .  **     file
9a60: 2e 20 57 65 72 65 20 74 68 65 20 74 72 61 6e 73  . Were the trans
9a70: 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  action to contin
9a80: 75 65 20 61 6e 64 20 65 76 65 6e 74 75 61 6c 6c  ue and eventuall
9a90: 79 20 62 65 20 72 6f 6c 6c 65 64 20 0a 20 20 2a  y be rolled .  *
9aa0: 2a 20 20 20 20 20 62 61 63 6b 20 74 68 61 74 20  *     back that 
9ab0: 67 61 72 62 61 67 65 20 6d 69 67 68 74 20 65 6e  garbage might en
9ac0: 64 20 75 70 20 69 6e 20 74 68 65 20 64 61 74 61  d up in the data
9ad0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20  base file..  ** 
9ae0: 20 20 20 20 0a 20 20 2a 2a 20 20 20 20 20 49 6e      .  **     In
9af0: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 61 62 6f   both of the abo
9b00: 76 65 20 63 61 73 65 73 2c 20 74 68 65 20 56 64  ve cases, the Vd
9b10: 62 65 2e 65 72 72 6f 72 41 63 74 69 6f 6e 20 76  be.errorAction v
9b20: 61 72 69 61 62 6c 65 20 69 73 20 0a 20 20 2a 2a  ariable is .  **
9b30: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 20 49 66       ignored. If
9b40: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 75 74   the sqlite3.aut
9b50: 6f 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  oCommit flag is 
9b60: 66 61 6c 73 65 20 61 6e 64 20 61 20 74 72 61 6e  false and a tran
9b70: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  saction.  **    
9b80: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
9b90: 20 69 74 20 77 69 6c 6c 20 62 65 20 73 65 74 20   it will be set 
9ba0: 74 6f 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20  to true..  **.  
9bb0: 2a 2a 20 4f 74 68 65 72 20 65 72 72 6f 72 73 3a  ** Other errors:
9bc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20 65 72  .  **.  ** No er
9bd0: 72 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 0a  ror:.  **.  */..
9be0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
9bf0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9c00: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9c10: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
9c20: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
9c30: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
9c40: 20 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 6c 74   /* Already halt
9c50: 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20  ed.  Nothing to 
9c60: 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  do. */.    asser
9c70: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
9c80: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a  E_MAGIC_HALT );.
9c90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9ca0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9cb0: 0a 20 20 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  .    closeAllCur
9cc0: 73 6f 72 73 28 70 29 3b 0a 23 65 6e 64 69 66 0a  sors(p);.#endif.
9cd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9ce0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  E_OK;.  }.  clos
9cf0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
9d00: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
9d10: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
9d20: 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
9d30: 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
9d40: 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
9d50: 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  r started */.  i
9d60: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
9d70: 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
9d80: 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
9d90: 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
9da0: 2f 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  /.    /* Check f
9db0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
9dc0: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2d 20 53  ecial errors - S
9dd0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 53  QLITE_NOMEM or S
9de0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 2a 2f 0a 20  QLITE_IOERR */. 
9df0: 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
9e00: 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
9e10: 63 69 61 6c 45 72 72 6f 72 20 3d 20 28 0a 20 20  cialError = (.  
9e20: 20 20 20 20 20 20 28 6d 72 63 3d 3d 53 51 4c 49        (mrc==SQLI
9e30: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
9e40: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
9e50: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
9e60: 45 52 52 55 50 54 29 3f 31 3a 30 29 3b 0a 20 20  ERRUPT)?1:0);.  
9e70: 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
9e80: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
9e90: 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20   This loop does 
9ea0: 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20  static analysis 
9eb0: 6f 66 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  of the query to 
9ec0: 73 65 65 20 77 68 69 63 68 20 6f 66 20 74 68 65  see which of the
9ed0: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
9ee0: 69 6e 67 20 74 68 72 65 65 20 63 61 74 65 67 6f  ing three catego
9ef0: 72 69 65 73 20 69 74 20 66 61 6c 6c 73 20 69 6e  ries it falls in
9f00: 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to:.      **.   
9f10: 20 20 20 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f     **     Read-o
9f20: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nly.      **    
9f30: 20 51 75 65 72 79 20 77 69 74 68 20 73 74 61 74   Query with stat
9f40: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  ement journal.  
9f50: 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79      **     Query
9f60: 20 77 69 74 68 6f 75 74 20 73 74 61 74 65 6d 65   without stateme
9f70: 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt journal.     
9f80: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20   **.      ** We 
9f90: 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69  could do somethi
9fa0: 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20  ng more elegant 
9fb0: 74 68 61 6e 20 74 68 69 73 20 73 74 61 74 69 63  than this static
9fc0: 20 61 6e 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a   analysis (i.e..
9fd0: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74        ** store t
9fe0: 68 65 20 74 79 70 65 20 6f 66 20 71 75 65 72 79  he type of query
9ff0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
a000: 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70 68 61 73  compliation phas
a010: 65 29 2c 20 62 75 74 20 0a 20 20 20 20 20 20 2a  e), but .      *
a020: 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f  * handling mallo
a030: 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72  c() or IO failur
a040: 65 20 69 73 20 61 20 66 61 69 72 6c 79 20 6f 62  e is a fairly ob
a050: 73 63 75 72 65 20 65 64 67 65 20 63 61 73 65 20  scure edge case 
a060: 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  so .      ** thi
a070: 73 20 69 73 20 70 72 6f 62 61 62 6c 79 20 65 61  s is probably ea
a080: 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68  sier. Todo: Migh
a090: 74 20 62 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e  t be an opportun
a0a0: 69 74 79 20 74 6f 20 72 65 64 75 63 65 20 0a 20  ity to reduce . 
a0b0: 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a       ** code siz
a0c0: 65 20 61 20 76 65 72 79 20 73 6d 61 6c 6c 20 61  e a very small a
a0d0: 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a  mount though....
a0e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
a0f0: 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20  nt isReadOnly = 
a100: 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53  1;.      int isS
a110: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
a120: 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f      assert(p->aO
a130: 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b  p || p->nOp==0);
a140: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a150: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20  i<p->nOp; i++){ 
a160: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
a170: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
a180: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  e ){.          c
a190: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
a1a0: 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  on:.            
a1b0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 62 69 74  /* This is a bit
a1c0: 20 73 74 72 61 6e 67 65 2e 20 49 66 20 77 65 20   strange. If we 
a1d0: 68 69 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f  hit a malloc() o
a1e0: 72 20 49 4f 20 65 72 72 6f 72 20 61 6e 64 0a 20  r IO error and. 
a1f0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
a200: 65 20 73 74 61 74 65 6d 65 6e 74 20 64 69 64 20  e statement did 
a210: 6e 6f 74 20 6f 70 65 6e 20 61 20 73 74 61 74 65  not open a state
a220: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
a230: 2c 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  , we will.      
a240: 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
a250: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
a260: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 62 6f  nsaction and abo
a270: 72 74 20 61 6c 6c 20 6f 74 68 65 72 20 61 63 74  rt all other act
a280: 69 76 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ive.            
a290: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 4f  ** statements. O
a2a0: 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  r, if this is an
a2b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
a2c0: 54 20 65 72 72 6f 72 2c 20 77 65 0a 20 20 20 20  T error, we.    
a2d0: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
a2e0: 6f 6e 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 69 66  only rollback if
a2f0: 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 65 64   the interrupted
a300: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61   statement was a
a310: 20 77 72 69 74 65 2e 0a 20 20 20 20 20 20 20 20   write..        
a320: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
a330: 20 20 20 2a 2a 20 49 74 20 63 6f 75 6c 64 20 62     ** It could b
a340: 65 20 61 72 67 75 65 64 20 74 68 61 74 20 72 65  e argued that re
a350: 61 64 2d 6f 6e 6c 79 20 73 74 61 74 65 6d 65 6e  ad-only statemen
a360: 74 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 0a  ts should never.
a370: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
a380: 6f 6c 6c 62 61 63 6b 20 61 6e 79 74 68 69 6e 67  ollback anything
a390: 2e 20 42 75 74 20 63 61 72 65 66 75 6c 20 61 6e  . But careful an
a3a0: 61 6c 79 73 69 73 20 69 73 20 72 65 71 75 69 72  alysis is requir
a3b0: 65 64 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  ed before.      
a3c0: 20 20 20 20 20 20 2a 2a 20 6d 61 6b 69 6e 67 20        ** making 
a3d0: 74 68 69 73 20 63 68 61 6e 67 65 0a 20 20 20 20  this change.    
a3e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a3f0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4f         if( p->aO
a400: 70 5b 69 5d 2e 70 32 20 7c 7c 20 6d 72 63 21 3d  p[i].p2 || mrc!=
a410: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a430: 20 20 69 73 52 65 61 64 4f 6e 6c 79 20 3d 20 30    isReadOnly = 0
a440: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
a450: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a460: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
a470: 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 0a  e OP_Statement:.
a480: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 53 74              isSt
a490: 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20 20  atement = 1;.   
a4a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a4b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a4c0: 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  }.  .      /* If
a4d0: 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
a4e0: 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65  ead-only, we nee
a4f0: 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  d do no rollback
a500: 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69   at all. Otherwi
a510: 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  se,.      ** pro
a520: 63 65 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ceed with the sp
a530: 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
a540: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
a550: 66 28 20 21 69 73 52 65 61 64 4f 6e 6c 79 20 29  f( !isReadOnly )
a560: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
a570: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc==SQLITE_IOER
a580: 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53  R_BLOCKED && isS
a590: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
a5a0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
a5b0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
a5c0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  ckStmt;.        
a5d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
a5e0: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
a5f0: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 3d   else if( p->rc=
a600: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
a610: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
a620: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
a630: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
a640: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
a650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a660: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
a670: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
a680: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
a690: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
a6a0: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
a6b0: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
a6c0: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
a6d0: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
a6e0: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
a6f0: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
a700: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
a710: 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63  ite3AbortOtherAc
a720: 74 69 76 65 56 64 62 65 73 28 64 62 2c 20 70 29  tiveVdbes(db, p)
a730: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a740: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
a750: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
a760: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
a770: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a780: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
a790: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
a7a0: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
a7b0: 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
a7c0: 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76  he only active v
a7d0: 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  dbe, then.    **
a7e0: 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
a7f0: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
a800: 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
a810: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
a820: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
a830: 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
a840: 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
a850: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
a860: 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
a870: 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
a880: 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f  occured. .    */
a890: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74  .    if( db->aut
a8a0: 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61  oCommit && db->a
a8b0: 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20  ctiveVdbeCnt==1 
a8c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
a8d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
a8e0: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
a8f0: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
a900: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
a910: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
a920: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
a930: 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68   is true, and th
a940: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
a950: 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  as .        ** s
a960: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74  uccessful or hit
a970: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
a980: 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d  nstraint. This m
a990: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
a9a0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
a9b0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  uired..        *
a9c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  /.        int rc
a9d0: 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
a9e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
a9f0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
aa00: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
aa10: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
aa20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
aa30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aa40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
aa50: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
aa60: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
aa70: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
aa80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa90: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
aaa0: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
aab0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
aac0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aad0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
aae0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
aaf0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
ab00: 66 28 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20  f( !xFunc ){.   
ab10: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
ab20: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
ab30: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
ab40: 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  il ){.        if
ab50: 28 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65  ( p->openedState
ab60: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
ab70: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
ab80: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
ab90: 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  ;.        } .   
aba0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
abb0: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
abc0: 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
abd0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
abe0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
abf0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
ac00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
ac10: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
ac20: 64 62 65 73 28 64 62 2c 20 70 29 3b 0a 20 20 20  dbes(db, p);.   
ac30: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
ac40: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
ac50: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
ac60: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
ac70: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
ac80: 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74   If xFunc is not
ac90: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
aca0: 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33  s one of sqlite3
acb0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
acc0: 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  t or.    ** sqli
acd0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
ace0: 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65  mt. Call it once
acf0: 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64   on each backend
ad00: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
ad10: 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20  curs.    ** and 
ad20: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
ad30: 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f  is still SQLITE_
ad40: 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75  OK, set the retu
ad50: 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  rn code to the n
ad60: 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  ew.    ** error 
ad70: 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  value..    */.  
ad80: 20 20 61 73 73 65 72 74 28 21 78 46 75 6e 63 20    assert(!xFunc 
ad90: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
ada0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
adb0: 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20  itStmt ||.      
adc0: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
add0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a  reeRollbackStmt.
ade0: 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69      );.    for(i
adf0: 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64  =0; xFunc && i<d
ae00: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ae10: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
ae20: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
ae30: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
ae40: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
ae50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 78 46  .        rc = xF
ae60: 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20  unc(pBt);.      
ae70: 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e    if( rc && (p->
ae80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
ae90: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
aea0: 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20  ONSTRAINT) ){.  
aeb0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
aec0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
aed0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
aee0: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a  p->zErrMsg, 0);.
aef0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af00: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
af10: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
af20: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
af30: 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68  or DELETE and th
af40: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
af50: 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20  committed, .    
af60: 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e 67  ** set the chang
af70: 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e counter. .    
af80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
af90: 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e  angeCntOn && p->
afa0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  pc>=0 ){.      i
afb0: 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75  f( !xFunc || xFu
afc0: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
afd0: 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20  CommitStmt ){.  
afe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aff0: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
b000: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
b010: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b030: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
b040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
b050: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
b060: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
b070: 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
b080: 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
b090: 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
b0a0: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
b0b0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
b0c0: 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
b0d0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
b0e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b0f0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
b100: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
b110: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
b120: 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
b130: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
b140: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
b150: 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
b160: 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
b170: 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
b180: 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
b190: 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
b1a0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
b1b0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d  ->activeVdbeCnt-
b1c0: 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  -;.  }.  p->magi
b1d0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
b1e0: 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
b1f0: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
b200: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b210: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  OK;.}../*.** Eac
b220: 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
b230: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
b240: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
b250: 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
b260: 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
b270: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
b280: 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
b290: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
b2a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b2b0: 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
b2c0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
b2d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b2e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
b2f0: 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
b300: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
b310: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
b320: 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
b330: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
b340: 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
b350: 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
b360: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
b370: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
b380: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
b390: 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
b3a0: 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
b3b0: 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
b3c0: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
b3d0: 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
b3e0: 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
b3f0: 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
b400: 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
b410: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
b420: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
b430: 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
b440: 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
b450: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
b460: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b470: 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
b480: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
b490: 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
b4a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
b4b0: 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
b4c0: 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
b4d0: 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
b4e0: 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
b4f0: 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
b500: 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
b510: 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
b520: 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
b530: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
b540: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
b550: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
b560: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66  p);.  sqlite3Saf
b570: 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f  etyOff(db);..  /
b580: 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
b590: 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
b5a0: 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
b5b0: 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
b5c0: 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
b5d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
b5e0: 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
b5f0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
b600: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
b610: 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
b620: 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
b630: 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
b640: 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
b650: 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
b660: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
b670: 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
b680: 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
b690: 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
b6a0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
b6b0: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
b6c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  .    if( p->zErr
b6d0: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
b6e0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
b6f0: 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a  db->pErr,-1,p->z
b700: 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54  ErrMsg,SQLITE_UT
b710: 46 38 2c 73 71 6c 69 74 65 33 5f 66 72 65 65 29  F8,sqlite3_free)
b720: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43  ;.      db->errC
b730: 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20  ode = p->rc;.   
b740: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
b750: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
b760: 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
b770: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
b780: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
b790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
b7a0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
b7b0: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20  LITE_OK, 0);.   
b7c0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
b7d0: 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
b7e0: 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
b7f0: 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
b800: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
b810: 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
b820: 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
b830: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
b840: 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
b850: 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
b860: 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
b870: 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
b880: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
b890: 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
b8a0: 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
b8b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b8c0: 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  (db, p->rc, 0);.
b8d0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
b8e0: 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
b8f0: 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
b900: 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
b910: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
b920: 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
b930: 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
b940: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   run..  */.  ass
b950: 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d  ert( p->pTos<&p-
b960: 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f  >aStack[p->pc<0?
b970: 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e  0:p->pc] || !p->
b980: 61 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66  aStack );.#ifdef
b990: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
b9a0: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
b9b0: 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
b9c0: 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
b9d0: 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
b9e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
b9f0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
ba00: 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
ba10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ba20: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
ba30: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
ba40: 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
ba50: 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
ba60: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
ba70: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
ba80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ba90: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
baa0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
bab0: 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c  "%6d %10lld %8ll
bac0: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
bad0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
bae0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
baf0: 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
bb00: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
bb10: 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
bb20: 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
bb30: 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
bb40: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73      );.        s
bb50: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
bb60: 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
bb70: 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
bb80: 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
bb90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bba0: 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
bbb0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
bbc0: 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20  .  p->aborted = 
bbd0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  0;.  return p->r
bbe0: 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
bbf0: 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
bc00: 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
bc10: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
bc20: 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
bc30: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
bc40: 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
bc50: 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
bc60: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
bc70: 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
bc80: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
bc90: 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
bca0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
bcb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bcc0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
bcd0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
bce0: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
bcf0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
bd00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
bd10: 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
bd20: 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
bd30: 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
bd40: 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rc );.  }else if
bd50: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
bd60: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20  _MAGIC_INIT ){. 
bd70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bd80: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
bd90: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
bda0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
bdb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
bdc0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
bdd0: 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20  or each auxdata 
bde0: 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75  entry in pVdbeFu
bdf0: 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20  nc for which.** 
be00: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
be10: 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73  g bit in mask is
be20: 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61   clear.  Auxdata
be30: 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20   entries beyond 
be40: 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73  31.** are always
be50: 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20   destroyed.  To 
be60: 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64  destroy all auxd
be70: 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c  ata entries, cal
be80: 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
be90: 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a  e with mask==0..
bea0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
beb0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
bec0: 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65  (VdbeFunc *pVdbe
bed0: 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b  Func, int mask){
bee0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
bef0: 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63  i=0; i<pVdbeFunc
bf00: 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAux; i++){.  
bf10: 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61    struct AuxData
bf20: 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46   *pAux = &pVdbeF
bf30: 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20  unc->apAux[i];. 
bf40: 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20     if( (i>31 || 
bf50: 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20  !(mask&(1<<i))) 
bf60: 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
bf70: 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
bf80: 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
bf90: 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
bfa0: 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
bfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
bfc0: 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
bfd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
bfe0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
bff0: 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
c000: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
c010: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
c020: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
c030: 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e   return;.  Clean
c040: 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  up(p);.  if( p->
c050: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
c060: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
c070: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
c080: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
c090: 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b  >db->pVdbe==p );
c0a0: 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62  .    p->db->pVdb
c0b0: 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
c0c0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
c0d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
c0e0: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
c0f0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ev;.  }.  if( p-
c100: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  >aOp ){.    for(
c110: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
c120: 2b 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70  ++){.      Op *p
c130: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
c140: 0a 20 20 20 20 20 20 66 72 65 65 50 33 28 70 4f  .      freeP3(pO
c150: 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p3type, pOp->
c160: 70 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  p3);.    }.    s
c170: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c180: 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  Op);.  }.  relea
c190: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
c1a0: 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
c1b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c1c0: 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
c1d0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63  e3_free(p->aStac
c1e0: 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  k);.  releaseMem
c1f0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
c200: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
c210: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
c220: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
c230: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
c240: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c  te3_free(p->zSql
c250: 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  );.  p->magic = 
c260: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
c270: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c280: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  p);.}../*.** If 
c290: 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
c2a0: 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
c2b0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
c2c0: 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
c2d0: 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
c2e0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
c2f0: 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76  code.  If no Mov
c300: 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  eTo is pending, 
c310: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
c320: 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64  does nothing and
c330: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
c340: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
c350: 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
c360: 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  to(Cursor *p){. 
c370: 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
c380: 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
c390: 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
c3a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
c3b0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
c3c0: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
c3d0: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  t;.#endif.    as
c3e0: 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
c3f0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
c400: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
c410: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
c420: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
c430: 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
c440: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c450: 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b  ;.    *p->pIncrK
c460: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c  ey = 0;.    p->l
c470: 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f  astRowid = keyTo
c480: 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  Int(p->movetoTar
c490: 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  get);.    p->row
c4a0: 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
c4b0: 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  =0;.    if( res<
c4c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c4d0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
c4e0: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  (p->pCursor, &re
c4f0: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
c500: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c510: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
c520: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
c530: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
c540: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  +;.#endif.    p-
c550: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
c560: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
c570: 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
c580: 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74  STALE;.  }.  ret
c590: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c5a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
c5b0: 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
c5c0: 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
c5d0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
c5e0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
c5f0: 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
c600: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c610: 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74  lRead().** sqlit
c620: 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
c630: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
c640: 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a  SerialWrite().**
c650: 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
c660: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
c670: 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
c680: 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
c690: 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
c6a0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
c6b0: 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
c6c0: 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
c6d0: 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
c6e0: 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
c6f0: 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
c700: 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
c710: 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
c720: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
c730: 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
c740: 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
c750: 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
c760: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
c770: 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
c780: 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
c790: 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
c7a0: 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
c7b0: 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
c7c0: 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
c7d0: 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
c7e0: 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
c7f0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
c800: 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
c810: 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
c820: 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
c830: 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
c840: 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
c850: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
c860: 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
c870: 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
c880: 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
c890: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
c8a0: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
c8b0: 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
c8c0: 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
c8d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
c8e0: 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
c8f0: 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
c900: 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c940: 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
c960: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
c970: 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
c990: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
c9a0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
c9b0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
c9c0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
c9d0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
c9e0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
ca10: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
ca20: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
ca40: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
ca50: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
ca60: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
ca70: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
ca80: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
ca90: 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
cac0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
cad0: 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
cae0: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
caf0: 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
cb00: 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
cb30: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
cb40: 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
cb60: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
cb70: 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
cb80: 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
cbb0: 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
cbc0: 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
cbd0: 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
cbe0: 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
cbf0: 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
cc00: 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
cc10: 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
cc20: 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
cc30: 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
cc40: 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
cc50: 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
cc60: 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
cc70: 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
cc80: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
cc90: 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
cca0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
ccb0: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
ccc0: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
ccd0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
cce0: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
ccf0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
cd00: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
cd10: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
cd20: 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
cd30: 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
cd40: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
cd50: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
cd60: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
cd70: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
cd80: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
cd90: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
cda0: 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
cdb0: 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
cdc0: 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
cdd0: 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30  ((((i64)0x000010
cde0: 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
cdf0: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
ce00: 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
ce10: 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
ce20: 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
ce30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ce40: 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   8+i;.    }.    
ce50: 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69  u = i<0 ? -i : i
ce60: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  ;.    if( u<=127
ce70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
ce80: 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
ce90: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
cea0: 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
ceb0: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
cec0: 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
ced0: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
cee0: 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
cef0: 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
cf00: 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
cf10: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
cf20: 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
cf30: 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
cf40: 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  ( flags&(MEM_Str
cf50: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
cf60: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
cf70: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
cf80: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
cf90: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20  pMem->u.i;.  }. 
cfa0: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
cfb0: 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
cfc0: 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
cfd0: 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
cfe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cff0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
d000: 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
d010: 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
d020: 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
d030: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d040: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
d050: 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
d060: 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
d070: 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
d080: 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
d090: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
d0a0: 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
d0b0: 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
d0c0: 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
d0d0: 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
d0e0: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
d0f0: 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
d100: 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
d110: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
d120: 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
d130: 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
d140: 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
d150: 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
d160: 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
d170: 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
d180: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
d190: 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
d1a0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
d1b0: 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
d1c0: 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
d1d0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
d1e0: 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
d1f0: 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
d200: 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
d210: 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
d220: 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
d230: 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
d240: 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
d250: 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
d260: 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
d270: 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
d280: 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
d290: 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
d2a0: 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
d2b0: 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
d2c0: 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
d2d0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
d2e0: 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
d2f0: 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
d300: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
d310: 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
d320: 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
d330: 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
d340: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
d350: 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
d360: 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
d370: 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
d380: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
d390: 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
d3a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
d3b0: 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
d3c0: 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
d3d0: 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
d3e0: 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
d3f0: 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
d400: 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
d410: 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
d420: 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
d430: 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
d440: 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
d450: 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
d460: 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
d470: 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
d480: 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
d490: 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
d4a0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
d4b0: 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 23 69 66   correct..*/.#if
d4c0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
d4d0: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
d4e0: 4f 41 54 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  OAT.static doubl
d4f0: 65 20 66 6c 6f 61 74 53 77 61 70 28 64 6f 75 62  e floatSwap(doub
d500: 6c 65 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  le in){.  union 
d510: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a  {.    double r;.
d520: 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
d530: 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
d540: 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
d550: 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
d560: 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
d570: 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
d580: 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
d590: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
d5a0: 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
d5b0: 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
d5c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
d5d0: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
d5e0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
d5f0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
d600: 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
d610: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
d620: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
d630: 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
d640: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
d650: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
d660: 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
d670: 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
d680: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
d690: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
d6a0: 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
d6b0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
d6c0: 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
d6d0: 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77  .  nBuf must alw
d6e0: 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20  ays be.** large 
d6f0: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
d700: 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e  he entire field.
d710: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
d720: 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62   field is.** a b
d730: 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d  lob with a zero-
d740: 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65  filled tail, the
d750: 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65  n buf[] might be
d760: 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a   just the right.
d770: 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20  ** size to hold 
d780: 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70  everything excep
d790: 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66  t for the zero-f
d7a0: 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20  illed tail.  If 
d7b0: 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79  buf[].** is only
d7c0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
d7d0: 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f  old the non-zero
d7e0: 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e   prefix, then on
d7f0: 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  ly write that.**
d800: 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66   prefix into buf
d810: 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b  [].  But if buf[
d820: 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  ] is large enoug
d830: 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74  h to hold both t
d840: 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64  he.** prefix and
d850: 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77   the tail then w
d860: 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20  rite the prefix 
d870: 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c  and set the tail
d880: 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73   to all.** zeros
d890: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
d8a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
d8b0: 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
d8c0: 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
d8d0: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
d8e0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
d8f0: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
d900: 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
d910: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
d920: 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
d930: 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
d940: 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
d950: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d960: 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
d970: 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d  f, int nBuf, Mem
d980: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
d990: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20  _format){.  u32 
d9a0: 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71  serial_type = sq
d9b0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
d9c0: 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66  ype(pMem, file_f
d9d0: 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65  ormat);.  int le
d9e0: 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
d9f0: 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
da00: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
da10: 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
da20: 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
da30: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
da40: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
da50: 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
da60: 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
da70: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29  izeof(pMem->r) )
da80: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
da90: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 70 4d 65  dEndianFloat(pMe
daa0: 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d  m->r);.      mem
dab0: 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72  cpy(&v, &pMem->r
dac0: 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
dad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
dae0: 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
daf0: 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
db00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
db10: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
db20: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
db30: 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29  ert( len<=nBuf )
db40: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
db50: 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
db60: 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20   = (v&0xFF);.   
db70: 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
db80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
db90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
dba0: 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
dbb0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
dbc0: 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
dbd0: 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
dbe0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
dbf0: 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69  _Zero)?pMem->u.i
dc00: 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
dc10: 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   == sqlite3VdbeS
dc20: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
dc30: 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
dc40: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
dc50: 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65  <=nBuf );.    le
dc60: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
dc70: 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
dc80: 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
dc90: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
dca0: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
dcb0: 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d      len += pMem-
dcc0: 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20  >u.i;.      if( 
dcd0: 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20  len>nBuf ){.    
dce0: 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a      len = nBuf;.
dcf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
dd00: 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
dd10: 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
dd20: 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
dd30: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
dd40: 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
dd50: 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
dd60: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
dd70: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
dd80: 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
dd90: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
dda0: 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
ddb0: 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
ddc0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
ddd0: 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
dde0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
ddf0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
de00: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
de10: 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
de20: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
de30: 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
de40: 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
de50: 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
de60: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
de70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
de80: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
de90: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
dea0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
ded0: 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
dee0: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
def0: 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
df00: 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
df10: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
df20: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
df30: 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
df40: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
df50: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
df60: 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
df70: 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
df80: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
df90: 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
dfa0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
dfb0: 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
dfc0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
dfd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
dfe0: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
dff0: 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
e000: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e010: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e020: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
e030: 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
e040: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e050: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
e060: 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
e070: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
e080: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
e090: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e0a0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
e0b0: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
e0c0: 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
e0d0: 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
e0e0: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
e0f0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
e100: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
e110: 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
e120: 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
e130: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e140: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e150: 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
e160: 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
e170: 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
e180: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
e190: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
e1a0: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
e1b0: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
e1c0: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
e1d0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
e1e0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e1f0: 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
e200: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
e210: 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
e220: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
e230: 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
e240: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
e250: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
e260: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
e270: 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
e280: 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
e290: 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
e2a0: 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
e2b0: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
e2c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
e2d0: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
e2e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e2f0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
e300: 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
e310: 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
e320: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
e330: 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
e340: 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
e350: 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
e360: 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
e370: 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
e380: 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
e390: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e3a0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
e3b0: 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
e3c0: 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
e3d0: 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
e3e0: 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
e3f0: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
e400: 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
e410: 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
e420: 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
e430: 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
e440: 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
e450: 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
e460: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
e470: 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
e480: 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
e490: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
e4a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
e4b0: 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
e4c0: 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
e4d0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e4e0: 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
e4f0: 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  0;.      double 
e500: 72 32 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 73  r2 = r1;.      s
e510: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e520: 6f 61 74 28 72 32 29 3b 0a 20 20 20 20 20 20 61  oat(r2);.      a
e530: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 32  ssert( sizeof(r2
e540: 29 3d 3d 73 69 7a 65 6f 66 28 74 31 29 20 26 26  )==sizeof(t1) &&
e550: 20 6d 65 6d 63 6d 70 28 26 72 32 2c 20 26 74 31   memcmp(&r2, &t1
e560: 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
e570: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
e580: 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
e590: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
e5a0: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
e5b0: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
e5c0: 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
e5d0: 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
e5e0: 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
e5f0: 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
e600: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
e610: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
e620: 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
e630: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
e640: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
e650: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e660: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
e670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
e680: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
e690: 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
e6a0: 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
e6b0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
e6c0: 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
e6d0: 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  x));.        swa
e6e0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e6f0: 74 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  t(pMem->r);.    
e700: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e710: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  = MEM_Real;.    
e720: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
e730: 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   8;.    }.    ca
e740: 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
e750: 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
e760: 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
e770: 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
e780: 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
e790: 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
e7a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e7b0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e7c0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
e7d0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
e7e0: 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69   int len = (seri
e7f0: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
e800: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
e810: 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
e820: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
e830: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65  .      pMem->xDe
e840: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  l = 0;.      if(
e850: 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30   serial_type&0x0
e860: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
e870: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
e880: 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  tr | MEM_Ephem;.
e890: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e8a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e8b0: 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45   = MEM_Blob | ME
e8c0: 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
e8d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65  .      return le
e8e0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
e8f0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e900: 2a 20 54 68 65 20 68 65 61 64 65 72 20 6f 66 20  * The header of 
e910: 61 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74  a record consist
e920: 73 20 6f 66 20 61 20 73 65 71 75 65 6e 63 65 20  s of a sequence 
e930: 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20  variable-length 
e940: 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65  integers..** The
e950: 73 65 20 69 6e 74 65 67 65 72 73 20 61 72 65 20  se integers are 
e960: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 6d  almost always sm
e970: 61 6c 6c 20 61 6e 64 20 61 72 65 20 65 6e 63 6f  all and are enco
e980: 64 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ded as a single 
e990: 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c  byte..** The fol
e9a0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b  lowing macro tak
e9b0: 65 73 20 61 64 76 61 6e 74 61 67 65 20 74 68 69  es advantage thi
e9c0: 73 20 66 61 63 74 20 74 6f 20 70 72 6f 76 69 64  s fact to provid
e9d0: 65 20 61 20 66 61 73 74 20 64 65 63 6f 64 65 0a  e a fast decode.
e9e0: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ** of the intege
e9f0: 72 73 20 69 6e 20 61 20 72 65 63 6f 72 64 20 68  rs in a record h
ea00: 65 61 64 65 72 2e 20 20 49 74 20 69 73 20 66 61  eader.  It is fa
ea10: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
ea20: 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20 77 68 65 72  mon case.** wher
ea30: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73  e the integer is
ea40: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 20   a single byte. 
ea50: 20 49 74 20 69 73 20 61 20 6c 69 74 74 6c 65 20   It is a little 
ea60: 73 6c 6f 77 65 72 20 77 68 65 6e 20 74 68 65 0a  slower when the.
ea70: 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 74 77  ** integer is tw
ea80: 6f 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 2e  o or more bytes.
ea90: 20 20 42 75 74 20 6f 76 65 72 61 6c 6c 20 69 74    But overall it
eaa0: 20 69 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a   is faster..**.*
eab0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
eac0: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
ead0: 65 71 75 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a  equivalent:.**.*
eae0: 2a 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65  *     x = sqlite
eaf0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 20 41 2c  3GetVarint32( A,
eb00: 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20   &B );.**.**    
eb10: 20 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28 20   x = GetVarint( 
eb20: 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64  A, B );.**.*/.#d
eb30: 65 66 69 6e 65 20 47 65 74 56 61 72 69 6e 74 28  efine GetVarint(
eb40: 41 2c 42 29 20 20 28 28 42 20 3d 20 2a 28 41 29  A,B)  ((B = *(A)
eb50: 29 3c 3d 30 78 37 66 20 3f 20 31 20 3a 20 73 71  )<=0x7f ? 1 : sq
eb60: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
eb70: 28 41 2c 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20  (A, &B))../*.** 
eb80: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
eb90: 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
eba0: 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
ebb0: 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69  ex records speci
ebc0: 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65  fied by .** {nKe
ebd0: 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b  y1, pKey1} and {
ebe0: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72  nKey2, pKey2}, r
ebf0: 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74  eturning a negat
ec00: 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
ec10: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
ec20: 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   if {nKey1, pKey
ec30: 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  1} is less than,
ec40: 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
ec50: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e   greater than {n
ec60: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42  Key2, pKey2}.  B
ec70: 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  oth Key1 and Key
ec80: 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73  2 must be byte s
ec90: 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73  trings.** compos
eca0: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
ecb0: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
ecc0: 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69  f the VDBE..*/.i
ecd0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
ece0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76  cordCompare(.  v
ecf0: 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20  oid *userData,. 
ed00: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
ed10: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a  t void *pKey1, .
ed20: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
ed30: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
ed40: 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  {.  KeyInfo *pKe
ed50: 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f  yInfo = (KeyInfo
ed60: 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33  *)userData;.  u3
ed70: 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20  2 d1, d2;       
ed80: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
ed90: 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
eda0: 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
edb0: 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78  .  u32 idx1, idx
edc0: 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  2;      /* Offse
edd0: 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
ede0: 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
edf0: 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
ee00: 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f  Hdr1, szHdr2;  /
ee10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
ee20: 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
ee30: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
ee40: 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
ee50: 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
ee60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
ee70: 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
ee80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
ee90: 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ey1;.  const uns
eea0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
eeb0: 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  2 = (const unsig
eec0: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32  ned char *)pKey2
eed0: 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20  ;..  Mem mem1;. 
eee0: 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d   Mem mem2;.  mem
eef0: 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
ef00: 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
ef10: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
ef20: 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20 70 4b  .  mem2.enc = pK
ef30: 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
ef40: 65 6d 32 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em2.db = pKeyInf
ef50: 6f 2d 3e 64 62 3b 0a 20 20 0a 20 20 69 64 78 31  o->db;.  .  idx1
ef60: 20 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65   = GetVarint(aKe
ef70: 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
ef80: 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 64  1 = szHdr1;.  id
ef90: 78 32 20 3d 20 47 65 74 56 61 72 69 6e 74 28 61  x2 = GetVarint(a
efa0: 4b 65 79 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20  Key2, szHdr2);. 
efb0: 20 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20   d2 = szHdr2;.  
efc0: 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
efd0: 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69  o->nField;.  whi
efe0: 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
eff0: 26 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29  && idx2<szHdr2 )
f000: 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
f010: 5f 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20  _type1;.    u32 
f020: 73 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20  serial_type2;.. 
f030: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
f040: 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
f050: 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
f060: 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
f070: 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 47 65 74  .    idx1 += Get
f080: 56 61 72 69 6e 74 28 20 61 4b 65 79 31 2b 69 64  Varint( aKey1+id
f090: 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
f0a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d   );.    if( d1>=
f0b0: 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33  nKey1 && sqlite3
f0c0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
f0d0: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
f0e0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
f0f0: 64 78 32 20 2b 3d 20 47 65 74 56 61 72 69 6e 74  dx2 += GetVarint
f100: 28 20 61 4b 65 79 32 2b 69 64 78 32 2c 20 73 65  ( aKey2+idx2, se
f110: 72 69 61 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20  rial_type2 );.  
f120: 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20    if( d2>=nKey2 
f130: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
f140: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
f150: 61 6c 5f 74 79 70 65 32 29 3e 30 20 29 20 62 72  al_type2)>0 ) br
f160: 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  eak;..    /* Ext
f170: 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
f180: 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
f190: 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
f1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
f1b0: 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
f1c0: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
f1d0: 26 6d 65 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b  &mem1);.    d2 +
f1e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
f1f0: 69 61 6c 47 65 74 28 26 61 4b 65 79 32 5b 64 32  ialGet(&aKey2[d2
f200: 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 2c  ], serial_type2,
f210: 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a   &mem2);..    /*
f220: 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
f230: 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
f240: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
f250: 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d  pare(&mem1, &mem
f260: 32 2c 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b  2, i<nField ? pK
f270: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
f280: 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6d   : 0);.    if( m
f290: 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em1.flags & MEM_
f2a0: 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  Dyn ) sqlite3Vdb
f2b0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
f2c0: 31 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 32  1);.    if( mem2
f2d0: 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  .flags & MEM_Dyn
f2e0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
f2f0: 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b  mRelease(&mem2);
f300: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
f310: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
f320: 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
f330: 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  }..  /* One of t
f340: 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
f350: 6f 66 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61  of fields, but a
f360: 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
f370: 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20   to that point. 
f380: 20 2a 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20   ** were equal. 
f390: 49 66 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66  If the incrKey f
f3a0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
f3b0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79  n the second key
f3c0: 20 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64   is.  ** treated
f3d0: 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f   as larger..  */
f3e0: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
f3f0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
f400: 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20  ->incrKey ){.   
f410: 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
f420: 7d 65 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65  }else if( d1<nKe
f430: 79 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  y1 ){.      rc =
f440: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
f450: 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20  ( d2<nKey2 ){.  
f460: 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
f470: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
f480: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
f490: 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66  der && i<pKeyInf
f4a0: 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20  o->nField.      
f4b0: 20 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79           && pKey
f4c0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
f4d0: 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [i] ){.    rc = 
f4e0: 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -rc;.  }..  retu
f4f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f500: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
f510: 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
f520: 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68  omposed using th
f530: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
f540: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c  opcode..** The l
f550: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ast entry in thi
f560: 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  s record should 
f570: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73  be an integer (s
f580: 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61  pecifically.** a
f590: 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29  n integer rowid)
f5a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
f5b0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
f5c0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a  er of bytes in.*
f5d0: 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a  * that integer..
f5e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f5f0: 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f  beIdxRowidLen(co
f600: 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
f610: 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
f620: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
f630: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
f640: 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
f650: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
f660: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a  f the rowid */..
f670: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
f680: 6e 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64  nt32(aKey, &szHd
f690: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
f6a0: 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
f6b0: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
f6c0: 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
f6d0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f6e0: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
f6f0: 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  d);.}.  ../*.** 
f700: 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
f710: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
f720: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
f730: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
f740: 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
f750: 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
f760: 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
f770: 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
f780: 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
f790: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
f7a0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
f7b0: 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
f7c0: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
f7d0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
f7e0: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
f7f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
f800: 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
f810: 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
f820: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
f830: 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
f840: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
f850: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
f860: 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
f870: 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
f880: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
f890: 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
f8a0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
f8b0: 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
f8c0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
f8d0: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
f8e0: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
f8f0: 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
f900: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f910: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f920: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
f930: 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
f940: 65 65 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ee(pCur, 0, nCel
f950: 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
f960: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
f970: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73  turn rc;.  }.  s
f980: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
f990: 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48  2((u8*)m.z, &szH
f9a0: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  dr);.  sqlite3Ge
f9b0: 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
f9c0: 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74  m.z[szHdr-1], &t
f9d0: 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e  ypeRowid);.  len
f9e0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
f9f0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
fa00: 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73  (typeRowid);.  s
fa10: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
fa20: 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
fa30: 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
fa40: 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
fa50: 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
fa60: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
fa70: 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
fa80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fa90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
faa0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
fab0: 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
fac0: 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
fad0: 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  int to against.*
fae0: 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
faf0: 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e   in pKey (of len
fb00: 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74  gth nKey).  Writ
fb10: 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
fb20: 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
fb30: 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
fb40: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
fb50: 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
fb60: 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
fb70: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b   greater than pK
fb80: 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ey.  Return SQLI
fb90: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
fba0: 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20  ..**.** pKey is 
fbb0: 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
fbc0: 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
fbd0: 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
fbe0: 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
fbf0: 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
fc00: 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
fc10: 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
fc20: 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
fc30: 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
fc40: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20  as well..*/.int 
fc50: 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
fc60: 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73  yCompare(.  Curs
fc70: 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
fc80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
fc90: 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
fca0: 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e   against */.  in
fcb0: 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38  t nKey, const u8
fcc0: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
fcd0: 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
fce0: 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
fd10: 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
fd20: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
fd30: 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
fd40: 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
fd50: 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
fd60: 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c  pCursor;.  int l
fd70: 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d  enRowid;.  Mem m
fd80: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
fd90: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
fda0: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
fdb0: 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
fdc0: 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
fdd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fde0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OK;.  }.  rc = s
fdf0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
fe00: 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
fe10: 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  or, 0, nCellKey,
fe20: 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
fe30: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
fe40: 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  rc;.  }.  lenRow
fe50: 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
fe60: 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a  IdxRowidLen((u8*
fe70: 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20  )m.z);.  *res = 
fe80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
fe90: 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65  dCompare(pC->pKe
fea0: 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f  yInfo, m.n-lenRo
feb0: 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20  wid, m.z, nKey, 
fec0: 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  pKey);.  sqlite3
fed0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
fee0: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
fef0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ff00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
ff10: 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
ff20: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
ff30: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
ff40: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
ff50: 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
ff60: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
ff70: 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
ff80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
ff90: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
ffa0: 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
ffb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ffc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
ffd0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
ffe0: 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
fff0: 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
10000 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
10010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
10020 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
10030 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
10040 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
10050 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
10060 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
10070 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10080 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
10090 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
100a0 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
100b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
100c0 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
100d0 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
100e0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
100f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
10100 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
10110 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
10120 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
10130 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
10140 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
10150 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
10160 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
10170 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
10180 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
10190 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
101a0 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
101b0 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
101c0 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
101d0 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
101e0 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
101f0 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
10200 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
10210 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
10220 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
10230 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
10240 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
10250 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
10260 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
10270 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
10280 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
10290 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
102a0 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
102b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
102c0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
102d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
102e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
102f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10300 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
10310 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
10320 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
10330 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a     eturn v->db;.}.