/ Hex Artifact Content
Login

Artifact e45929a3b5e59e8f2d69b7d6164c9a636149e1df:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0350: 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63  to 1 and all opc
0360: 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69  odes will be pri
0370: 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20  nted.** as they 
0380: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
0390: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72   instruction str
03a0: 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  eam..*/.#ifdef S
03b0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
03c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
03d0: 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
03e0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  f.../*.** Create
03f0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64   a new virtual d
0400: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a  atabase engine..
0410: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
0420: 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69 74  VdbeCreate(sqlit
0430: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
0440: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
0450: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0460: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
0470: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
0480: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0490: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
04a0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
04b0: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
04c0: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
04d0: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
04e0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
04f0: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0500: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0510: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0520: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
0530: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
0540: 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20   SQL string for 
0550: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
0560: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
0570: 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28  lite3VdbeSetSql(
0580: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
0590: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
05a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
05b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
05c0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
05d0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
05e0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
05f0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
0600: 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20   Return the SQL 
0610: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0620: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
0630: 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ment.*/.const ch
0640: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28  ar *sqlite3_sql(
0650: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0660: 74 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  tmt){.  return (
0670: 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e  (Vdbe *)pStmt)->
0680: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  zSql;.}../*.** S
0690: 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  wap all content 
06a0: 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45  between two VDBE
06b0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
06c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
06d0: 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56  Swap(Vdbe *pA, V
06e0: 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65  dbe *pB){.  Vdbe
06f0: 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63   tmp, *pTmp;.  c
0700: 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e 74  har *zTmp;.  int
0710: 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20 2a   nTmp;.  tmp = *
0720: 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b  pA;.  *pA = *pB;
0730: 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20  .  *pB = tmp;.  
0740: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74  pTmp = pA->pNext
0750: 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20  ;.  pA->pNext = 
0760: 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d  pB->pNext;.  pB-
0770: 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20  >pNext = pTmp;. 
0780: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65   pTmp = pA->pPre
0790: 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d  v;.  pA->pPrev =
07a0: 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42   pB->pPrev;.  pB
07b0: 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a  ->pPrev = pTmp;.
07c0: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71    zTmp = pA->zSq
07d0: 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20  l;.  pA->zSql = 
07e0: 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->zSql;.  pB->
07f0: 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 6e  zSql = zTmp;.  n
0800: 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b 0a  Tmp = pA->nSql;.
0810: 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42 2d    pA->nSql = pB-
0820: 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53 71  >nSql;.  pB->nSq
0830: 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69 66  l = nTmp;.}..#if
0840: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0850: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63  ./*.** Turn trac
0860: 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f  ing on or off.*/
0870: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
0880: 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20  eTrace(Vdbe *p, 
0890: 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20  FILE *trace){.  
08a0: 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65  p->trace = trace
08b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
08c0: 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62  * Resize the Vdb
08d0: 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74  e.aOp array so t
08e0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
08f0: 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65 6c  at least N.** el
0900: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
0910: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0920: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0930: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0940: 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64 62 65  e array,.** Vdbe
0950: 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f  .aOp and Vdbe.nO
0960: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 75 6e  pAlloc remain un
0970: 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73  changed (this is
0980: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e 79 20   so that.** any 
0990: 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20  opcodes already 
09a0: 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65  allocated can be
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
09c0: 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
09d0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
09e0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
09f0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 69 7a  tatic void resiz
0a00: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
0a10: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56 64 62 65  , int N){.  Vdbe
0a20: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  Op *pNew;.  int 
0a30: 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70  oldSize = p->nOp
0a40: 41 6c 6c 6f 63 3b 0a 20 20 70 4e 65 77 20 3d 20  Alloc;.  pNew = 
0a50: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0a60: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  (p->db, p->aOp, 
0a70: 4e 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  N*sizeof(Op));. 
0a80: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
0a90: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 4e   p->nOpAlloc = N
0aa0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70  ;.    p->aOp = p
0ab0: 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 4e 3e 6f  New;.    if( N>o
0ac0: 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ldSize ){.      
0ad0: 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f  memset(&p->aOp[o
0ae0: 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 4e 2d 6f  ldSize], 0, (N-o
0af0: 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f  ldSize)*sizeof(O
0b00: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p));.    }.  }.}
0b10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
0b20: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
0b30: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
0b40: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
0b50: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
0b60: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
0b70: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
0b80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
0b90: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
0ba0: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
0bb0: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
0bc0: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
0bd0: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
0be0: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
0bf0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
0c00: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
0c10: 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f  1, p2, p3      O
0c20: 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73  perands.**.** Us
0c30: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
0c40: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20  eResolveLabel() 
0c50: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20  function to fix 
0c60: 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a  an address and.*
0c70: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
0c80: 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63  eChangeP4() func
0c90: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
0ca0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
0cb0: 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P4.** operand..*
0cc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0cd0: 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c  eAddOp3(Vdbe *p,
0ce0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
0cf0: 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29   int p2, int p3)
0d00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0d10: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
0d20: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
0d30: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
0d40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
0d50: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0d60: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69  c<=i ){.    resi
0d70: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
0d80: 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f  nOpAlloc ? p->nO
0d90: 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f  pAlloc*2 : 1024/
0da0: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
0db0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
0dc0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0dd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
0de0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0df0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0e00: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0e10: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0e20: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0e30: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0e40: 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d  >p3 = p3;.  pOp-
0e50: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.p = 0;.  pOp
0e60: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
0e70: 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69  TUSED;.  p->expi
0e80: 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  red = 0;.#ifdef 
0e90: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
0ea0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
0eb0: 64 6f 70 54 72 61 63 65 20 29 20 73 71 6c 69 74  dopTrace ) sqlit
0ec0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
0ed0: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
0ee0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
0ef0: 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   i;.}.int sqlite
0f00: 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65  3VdbeAddOp0(Vdbe
0f10: 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   *p, int op){.  
0f20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
0f30: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
0f40: 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  0, 0, 0);.}.int 
0f50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0f60: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  1(Vdbe *p, int o
0f70: 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65  p, int p1){.  re
0f80: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
0f90: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
0fa0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
0fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
0fc0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0fd0: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
0fe0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
0ff0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1000: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b   op, p1, p2, 0);
1010: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
1020: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1030: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1040: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1050: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1060: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1070: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1080: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1090: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
10a0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
10c0: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
10d0: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
10e0: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
10f0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1110: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1120: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1140: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1160: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1170: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1180: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1190: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
11a0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
11b0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
11c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
11d0: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
11e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
11f0: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1200: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1210: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
1230: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
1240: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1250: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1260: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
1270: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1280: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
1290: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
12a0: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
12b0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
12c0: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
12d0: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
12e0: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
12f0: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
1300: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
1310: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
1320: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
1330: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
1340: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
1350: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
1360: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
1370: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
1380: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
1390: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
13a0: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
13b0: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
13c0: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
13d0: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
13e0: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
13f0: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
1400: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
1410: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
1420: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
1430: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
1440: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
1450: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
1460: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
1470: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
1480: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1490: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
14a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
14b0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
14c0: 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b    i = p->nLabel+
14d0: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  +;.  assert( p->
14e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
14f0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
1500: 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f  i>=p->nLabelAllo
1510: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  c ){.    p->nLab
1520: 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61  elAlloc = p->nLa
1530: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b  belAlloc*2 + 10;
1540: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  .    p->aLabel =
1550: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1560: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
1570: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
15a0: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a  >nLabelAlloc*siz
15b0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
15c0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
15d0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
15e0: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
15f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1600: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
1610: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
1620: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
1630: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
1640: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
1650: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
1660: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
1670: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1680: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1690: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
16a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16b0: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
16c0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16d0: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c  veLabel(Vdbe *p,
16e0: 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a   int x){.  int j
16f0: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72   = -1-x;.  asser
1700: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1710: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1720: 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26    assert( j>=0 &
1730: 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  & j<p->nLabel );
1740: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
1750: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1760: 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  l[j] = p->nOp;. 
1770: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70   }.}../*.** Loop
1780: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
1790: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
17a0: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
17b0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
17c0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
17d0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
17e0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
17f0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
1800: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
1810: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
1820: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
1830: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
1840: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1850: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
1860: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
1870: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
1880: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
1890: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
18a0: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
18b0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
18c0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
18d0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
18e0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
18f0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
1900: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
1910: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
1920: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1930: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
1940: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
1950: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  array..**.** Thi
1960: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
1970: 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  oes the followin
1980: 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20  g optimization: 
1990: 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a   It scans for.**
19a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
19b0: 61 74 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  at might cause a
19c0: 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
19d0: 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74 72  ack.  Such instr
19e0: 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a  uctions.** are:.
19f0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
1a00: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
1a10: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
1a20: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
1a30: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79     *  OP_Destroy
1a40: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64  .**   *  OP_VUpd
1a50: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  ate.**   *  OP_V
1a60: 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20  Rename.**.** If 
1a70: 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74  no such instruct
1a80: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ion is found, th
1a90: 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65  en every Stateme
1aa0: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  nt instruction .
1ab0: 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ** is changed to
1ac0: 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68 69   a Noop.  In thi
1ad0: 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20  s way, we avoid 
1ae0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61  creating the sta
1af0: 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e  tement .** journ
1b00: 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73  al file unnecess
1b10: 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  arily..*/.static
1b20: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
1b30: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
1b40: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
1b50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
1b60: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a  t nMaxArgs = 0;.
1b70: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74    Op *pOp;.  int
1b80: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c   *aLabel = p->aL
1b90: 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73  abel;.  int does
1ba0: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1bb0: 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  k = 0;.  int has
1bc0: 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d  StatementBegin =
1bd0: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
1be0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
1bf0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
1c00: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
1c10: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
1c20: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  ;..    if( opcod
1c30: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29  e==OP_Function )
1c40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1c50: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
1c60: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
1c70: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
1c80: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53   opcode==OP_AggS
1c90: 74 65 70 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  tep .#ifndef SQL
1ca0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1cb0: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 7c 7c  TABLE.        ||
1cc0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
1cd0: 61 74 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  ate.#endif.    )
1ce0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1cf0: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
1d00: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
1d10: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  2;.    }.    if(
1d20: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
1d30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1d40: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->p1==SQLITE_CO
1d50: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
1d60: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  >p2==OE_Abort ){
1d70: 0a 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61  .        doesSta
1d80: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d  tementRollback =
1d90: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1da0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1db0: 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29  ==OP_Statement )
1dc0: 7b 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65  {.      hasState
1dd0: 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20  mentBegin = 1;. 
1de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1df0: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
1e00: 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61  ){.      doesSta
1e10: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d  tementRollback =
1e20: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
1e30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e40: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
1e50: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  f( opcode==OP_VU
1e60: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
1e70: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20  =OP_VRename ){. 
1e80: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
1e90: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
1ea0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1eb0: 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72  code==OP_VFilter
1ec0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   ){.      int n;
1ed0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ee0: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
1ef0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f00: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
1f10: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
1f20: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
1f30: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  p1;.      if( n>
1f40: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1f50: 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a  rgs = n;.#endif.
1f60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
1f70: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1f80: 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f  HasProperty(opco
1f90: 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20  de, OPFLG_JUMP) 
1fa0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
1fb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
1fc0: 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62  -pOp->p2<p->nLab
1fd0: 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  el );.      pOp-
1fe0: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
1ff0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a  pOp->p2];.    }.
2000: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2010: 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  ee(p->aLabel);. 
2020: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a   p->aLabel = 0;.
2030: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
2040: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20   = nMaxArgs;..  
2050: 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72  /* If we never r
2060: 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
2070: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
2080: 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a   then statement.
2090: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20a0: 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
20b0: 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65  .  So change eve
20c0: 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a  ry OP_Statement.
20d0: 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f    ** opcode into
20e0: 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68   an OP_Noop.  Th
20f0: 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20  is avoid a call 
2100: 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
2110: 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a  Exclusive().  **
2120: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78   which can be ex
2130: 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20  pensive on some 
2140: 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a  platforms..  */.
2150: 20 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65    if( hasStateme
2160: 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73  ntBegin && !does
2170: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
2180: 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70  k ){.    for(pOp
2190: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
21a0: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
21b0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  pOp++){.      if
21c0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
21d0: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
21e0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
21f0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
2200: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2210: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2220: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2230: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2240: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
2250: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2260: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2270: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
2280: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
2290: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
22a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
22b0: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
22c0: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
22d0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
22e0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
22f0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  ck.  Return the.
2300: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
2310: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
2320: 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20  n added..*/.int 
2330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2340: 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  List(Vdbe *p, in
2350: 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73  t nOp, VdbeOpLis
2360: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20  t const *aOp){. 
2370: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
2380: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2390: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
23a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
23b0: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
23c0: 6f 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  oc ){.    resize
23d0: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
23e0: 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41  pAlloc ? p->nOpA
23f0: 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f 73 69  lloc*2 : 1024/si
2400: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 61  zeof(Op));.    a
2410: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 2b 6e 4f  ssert( p->nOp+nO
2420: 70 3c 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 7c  p<=p->nOpAlloc |
2430: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
2440: 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 20 20 69  ailed );.  }.  i
2450: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
2460: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
2470: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
2480: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
2490: 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20  f( nOp>0 ){.    
24a0: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
24b0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
24c0: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
24d0: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
24e0: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
24f0: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
2500: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
2510: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
2520: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
2530: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
2540: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
2550: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
2560: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
2570: 30 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  0 && sqlite3Vdbe
2580: 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74  OpcodeHasPropert
2590: 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20  y(pOut->opcode, 
25a0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20  OPFLG_JUMP) ){. 
25b0: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
25c0: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
25d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
25e0: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
25f0: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
2600: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
2610: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
2620: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
2630: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
2640: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
2650: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
2660: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
2670: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
2680: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ( sqlite3VdbeAdd
2690: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
26a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
26b0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
26c0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
26d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
26e0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  f.    }.    p->n
26f0: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20  Op += nOp;.  }. 
2700: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2710: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2720: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2730: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
2740: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2750: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2760: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2770: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
2780: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
2790: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
27a0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
27b0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
27c0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
27d0: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
27e0: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
27f0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
2800: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2810: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
2820: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2830: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2840: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2850: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2860: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2870: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2880: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2890: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
28a0: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
28b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
28c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
28d0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
28e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
28f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2910: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
2920: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
2930: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2950: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2960: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2970: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2980: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2990: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
29a0: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
29b0: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
29c0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
29d0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
29e0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
29f0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2a00: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
2a10: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2a20: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2a30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a40: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
2a50: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2a60: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2a70: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2a80: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2a90: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2aa0: 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20  p && addr>=0 && 
2ab0: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70  p->nOp>addr && p
2ac0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->aOp ){.    p->
2ad0: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
2ae0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2af0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2b00: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
2b10: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
2b20: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
2b30: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
2b40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2b50: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
2b60: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
2b70: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
2b80: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2b90: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
2ba0: 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a   p && p->aOp ){.
2bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2bc0: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61  Op>0 );.    p->a
2bd0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
2be0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2bf0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
2c00: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
2c10: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
2c20: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2c30: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
2c40: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2c50: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2c60: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
2c70: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2c80: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
2c90: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
2ca0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
2cb0: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
2cc0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
2cd0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
2ce0: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
2cf0: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
2d00: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
2d10: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
2d20: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
2d30: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
2d40: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
2d50: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75  meralFunction(Fu
2d60: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
2d70: 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65  if( pDef && (pDe
2d80: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
2d90: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
2da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2db0: 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a  free(pDef);.  }.
2dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2dd0: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
2de0: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
2df0: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 69  ic void freeP4(i
2e00: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
2e10: 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29  *p3){.  if( p3 )
2e20: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  {.    switch( p4
2e30: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
2e40: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
2e50: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
2e60: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
2e70: 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63 61  PRINTF:.      ca
2e80: 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P4_DYNAMIC:. 
2e90: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
2ea0: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
2eb0: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
2ec0: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
2ed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b  qlite3_free(p3);
2ee0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
2f00: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
2f10: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
2f20: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
2f30: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b 0a  (VdbeFunc *)p3;.
2f40: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
2f50: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70 56  meralFunction(pV
2f60: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b  dbeFunc->pFunc);
2f70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f80: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
2f90: 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b  a(pVdbeFunc, 0);
2fa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fb0: 5f 66 72 65 65 28 70 56 64 62 65 46 75 6e 63 29  _free(pVdbeFunc)
2fc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2fe0: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
2ff0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
3000: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
3010: 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a 20  (FuncDef*)p3);. 
3020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3030: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3040: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
3050: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
3060: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
3070: 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ue*)p3);.       
3080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3090: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
30a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63  .** Change N opc
30b0: 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  odes starting at
30c0: 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e   addr to No-ops.
30d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30e0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
30f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3100: 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  dr, int N){.  if
3110: 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ( p && p->aOp ){
3120: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
3130: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
3140: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ;.    while( N--
3150: 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34   ){.      freeP4
3160: 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f  (pOp->p4type, pO
3170: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
3180: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
3190: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
31a0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
31b0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
31c0: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
31d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
31e0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
31f0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
3200: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3210: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3230: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
3240: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
3250: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
3260: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
3270: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
3280: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
3290: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
32a0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
32b0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
32c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
32d0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
32e0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
32f0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
3300: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
3310: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
3320: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3330: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
3340: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
3350: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
3360: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
3370: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
3380: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
3390: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
33a0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
33b0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
33c0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
33d0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
33e0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
33f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
3400: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3410: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
3420: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
3430: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
3440: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3450: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
3460: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
3470: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
3480: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
3490: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
34a0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
34b0: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
34c0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
34d0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
34e0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
34f0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
3500: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
3510: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3520: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
3530: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
3540: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
3550: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
3560: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
3570: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
3580: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
3590: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
35a0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
35b0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
35c0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
35d0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
35e0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
35f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3600: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
3610: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
3620: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
3630: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
3640: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
3650: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
3660: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
3670: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
3680: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
3690: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
36a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
36b0: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
36c0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
36d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
36e0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
36f0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  p;.  assert( p!=
3700: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3710: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3720: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3730: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
3740: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3750: 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20  ed ){.    if (n 
3760: 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b  != P4_KEYINFO) {
3770: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 6e 2c  .      freeP4(n,
3780: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
3790: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
37a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
37b0: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
37c0: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
37d0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
37e0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
37f0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72    if( addr<0 ) r
3800: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70  eturn;.  }.  pOp
3810: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
3820: 3b 0a 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e  ;.  freeP4(pOp->
3830: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
3840: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p);.  pOp->p4.p 
3850: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34  = 0;.  if( n==P4
3860: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
3870: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
3880: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
3890: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
38a0: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
38b0: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
38c0: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
38d0: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
38e0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
38f0: 28 69 6e 74 29 28 73 71 6c 69 74 65 33 5f 69 6e  (int)(sqlite3_in
3900: 74 70 74 72 5f 74 29 7a 50 34 3b 0a 20 20 20 20  tptr_t)zP4;.    
3910: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b  pOp->p4type = n;
3920: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
3930: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
3940: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
3950: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
3960: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
3970: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
3980: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
3990: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
39a0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
39b0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
39c0: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
39d0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
39e0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
39f0: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
3a00: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
3a10: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
3a20: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
3a30: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
3a40: 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
3a50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b  ;.    pOp->p4.pK
3a60: 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
3a70: 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  o;.    if( pKeyI
3a80: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  nfo ){.      mem
3a90: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3aa0: 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  4, nByte);.     
3ab0: 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
3ac0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
3ad0: 6e 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 20 69 73  n, P4_KEYINFO is
3ae0: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
3af0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 4b 65 79 49  on.      ** KeyI
3b00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 73 20 74  nfo structures t
3b10: 68 61 74 20 68 61 76 65 20 6e 6f 20 61 53 6f 72  hat have no aSor
3b20: 74 4f 72 64 65 72 20 63 6f 6d 70 6f 6e 65 6e 74  tOrder component
3b30: 2e 20 20 45 6c 65 6d 65 6e 74 73 0a 20 20 20 20  .  Elements.    
3b40: 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 61 53 6f    ** with an aSo
3b50: 72 74 4f 72 64 65 72 20 61 6c 77 61 79 73 20 75  rtOrder always u
3b60: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  se P4_KEYINFO_HA
3b70: 4e 44 4f 46 46 2e 20 20 53 6f 20 77 65 20 64 6f  NDOFF.  So we do
3b80: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65   not.      ** ne
3b90: 65 64 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74  ed to bother wit
3ba0: 68 20 64 75 70 6c 69 63 61 74 69 6e 67 20 74 68  h duplicating th
3bb0: 65 20 61 53 6f 72 74 4f 72 64 65 72 2e 20 2a 2f  e aSortOrder. */
3bc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3bd0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3be0: 64 65 72 3d 3d 30 20 29 3b 0a 23 69 66 20 30 0a  der==0 );.#if 0.
3bf0: 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72        aSortOrder
3c00: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
3c10: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69  rtOrder;.      i
3c20: 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b  f( aSortOrder ){
3c30: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
3c40: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
3c50: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
3c60: 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  &pKeyInfo->aColl
3c70: 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20  [nField];.      
3c80: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
3c90: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61  o->aSortOrder, a
3ca0: 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c  SortOrder, nFiel
3cb0: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  d);.      }.#end
3cc0: 69 66 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  if.      pOp->p4
3cd0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
3ce0: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
3cf0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
3d00: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
3d10: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3d20: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
3d30: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
3d40: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
3d50: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
3d60: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
3d70: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
3d80: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
3d90: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
3da0: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
3db0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
3dc0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3dd0: 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = n;.  }else{. 
3de0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
3df0: 3d 20 73 74 72 6c 65 6e 28 7a 50 34 29 3b 0a 20  = strlen(zP4);. 
3e00: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
3e10: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
3e20: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
3e30: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3e40: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
3e50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
3e60: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
3e70: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
3e80: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
3e90: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
3ea0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
3eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
3ec0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
3ed0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
3ee0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3ef0: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
3f00: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
3f10: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
3f20: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
3f30: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3f40: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
3f50: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3f60: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
3f70: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
3f80: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
3f90: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
3fa0: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
3fb0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
3fc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
3fd0: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
3fe0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
3ff0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
4000: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
4010: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
4020: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4030: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
4040: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a  given address..*
4050: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
4060: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
4070: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
4080: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4090: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
40a0: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
40b0: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
40c0: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
40d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
40e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61 64  );.  return ((ad
40f0: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
4100: 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b 61  >nOp)?(&p->aOp[a
4110: 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66  ddr]):0);.}..#if
4120: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4130: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
4140: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
4150: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
4160: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4170: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
4180: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
4190: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
41a0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
41b0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
41c0: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
41d0: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
41e0: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
41f0: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
4200: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
4210: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
4220: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
4230: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
4240: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
4250: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
4260: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
4270: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
4280: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
4290: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
42a0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
42b0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
42c0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
42d0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
42e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
42f0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4300: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
4310: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
4320: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c  ;.      i = strl
4330: 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  en(zTemp);.     
4340: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
4350: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
4370: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
4380: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
4390: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
43a0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
43b0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
43c0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
43d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
43e0: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
43f0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
4400: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
4410: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
4420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
4430: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  }.          zTem
4440: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
4450: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
4460: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
4470: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
4480: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
4490: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
44a0: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
44b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
44c0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
44d0: 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  [i], pColl->zNam
44e0: 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  e,n+1);.        
44f0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
4500: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c    }else if( i+4<
4510: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
4520: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
4530: 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b  mp[i],",nil",4);
4540: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
4550: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
4560: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
4570: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
4580: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
4590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
45a0: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
45b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
45c0: 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51   case P4_COLLSEQ
45d0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
45e0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e  q *pColl = pOp->
45f0: 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  p4.pColl;.      
4600: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4610: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4620: 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c  collseq(%.20s)",
4630: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
4640: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4650: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
4660: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
4670: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
4680: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
4690: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
46a0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
46b0: 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  mp, "%s(%d)", pD
46c0: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
46d0: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
46e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
46f0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a  ase P4_INT64: {.
4700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4720: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f  emp, "%lld", *pO
4730: 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20  p->p4.pI64);.   
4740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4750: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33      case P4_INT3
4760: 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2: {.      sqlit
4770: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4780: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20  p, zTemp, "%d", 
4790: 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20  pOp->p4.i);.    
47a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
47b0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
47c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
47d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
47e0: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
47f0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
4800: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4810: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4820: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
4830: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
4840: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73  4.pMem;.      as
4850: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
4860: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
4870: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
4880: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
4890: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
48a0: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
48b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
48c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
48d0: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
48e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
48f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4900: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
4910: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
4920: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4930: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
4940: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4950: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4960: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  mp, "%.16g", pMe
4970: 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m->r);.      }. 
4980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4990: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
49a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
49b0: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
49c0: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
49d0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
49e0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
49f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4a00: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4a10: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
4a20: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
4a30: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
4a40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4a50: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
4a60: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
4a70: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
4a80: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
4a90: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
4aa0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
4ab0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
4ac0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4ad0: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
4ae0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
4af0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4b00: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
4b10: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
4b20: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
4b30: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
4b40: 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .**.*/.void sqli
4b50: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
4b60: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29  (Vdbe *p, int i)
4b70: 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20  {.  int mask;.  
4b80: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
4b90: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  i<p->db->nDb );.
4ba0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 69 7a 65    assert( i<size
4bb0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
4bc0: 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31  *8 );.  mask = 1
4bd0: 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62  <<i;.  if( (p->b
4be0: 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  treeMask & mask)
4bf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74  ==0 ){.    p->bt
4c00: 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  reeMask |= mask;
4c10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
4c20: 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72  eMutexArrayInser
4c30: 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d  t(&p->aMutex, p-
4c40: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
4c50: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65  ;.  }.}...#if de
4c60: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
4c70: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
4c80: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4c90: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
4ca0: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
4cb0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4cc0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
4cd0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
4ce0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
4cf0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
4d00: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
4d10: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
4d20: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
4d30: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
4d40: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
4d50: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
4d60: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e  d %-4s %.2X %s\n
4d70: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
4d80: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
4d90: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
4da0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
4db0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
4dc0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
4dd0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
4de0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
4df0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
4e00: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
4e10: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
4e20: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64  4, pOp->p5,.#ifd
4e30: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4e40: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d        pOp->zComm
4e50: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ent ? pOp->zComm
4e60: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20  ent : "".#else. 
4e70: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20       "".#endif. 
4e80: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
4e90: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
4ea0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
4eb0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
4ec0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
4ed0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
4ee0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
4ef0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
4f00: 20 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   N ){.    sqlite
4f10: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
4f20: 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66 61     int malloc_fa
4f30: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
4f40: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 77 68 69  cFailed;.    whi
4f50: 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20  le( N-->0 ){.   
4f60: 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32 20 7c     assert( N<2 |
4f70: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
4f80: 64 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db );.      sqli
4f90: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
4fa0: 65 28 70 29 3b 0a 20 20 20 20 20 20 70 2b 2b 2d  e(p);.      p++-
4fb0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
4fc0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
4fd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
4fe0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
4ff0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5000: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5010: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
5020: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
5030: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
5040: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
5050: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
5060: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
5070: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
5080: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
5090: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
50a0: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
50b0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
50c0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
50d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
50e0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
50f0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
5100: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
5110: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
5120: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
5130: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
5140: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
5150: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
5160: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
5170: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
5180: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
5190: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
51a0: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
51b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
51c0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
51d0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
51e0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e  UERY PLAN..*/.in
51f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
5200: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5220: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
5230: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5240: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
5250: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5260: 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d  TE_OK;.  Mem *pM
5270: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
5280: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
5290: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
52a0: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  explain );.  if(
52b0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
52c0: 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75  MAGIC_RUN ) retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
52e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
52f0: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
5300: 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73  GIC_BUSY );.  as
5310: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
5320: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
5330: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
5340: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
5350: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
5360: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
5370: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
5380: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
5390: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
53a0: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
53b0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
53c0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
53d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
53e0: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
53f0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
5400: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
5410: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
5420: 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  ay(pMem, p->nMem
5430: 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20  );..  do{.    i 
5440: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
5450: 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26  ile( i<p->nOp &&
5460: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
5470: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
5480: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
5490: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f  ;.  if( i>=p->nO
54a0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  p ){.    p->rc =
54b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
54c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
54d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
54e0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
54f0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
5500: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5510: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
5520: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
5530: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
5540: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
5550: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
5560: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
5570: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
5580: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20  *z;.    Op *pOp 
5590: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
55a0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
55b0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
55c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
55d0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
55e0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
55f0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5600: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
5630: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
5640: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
5650: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
5660: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
5670: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
5680: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
5690: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
56a0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
56b0: 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70  >opcode);  /* Op
56c0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
56d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
56e0: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
56f0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
5700: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
5710: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5720: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
5730: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5740: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
5750: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  ;.    }..    pMe
5760: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
5770: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
5780: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
57b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
57c0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
57d0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
57e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
57f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
5800: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
5830: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
5840: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5850: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
5860: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
5870: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
5880: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5890: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
58a0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
58b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
58c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
58d0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
58e0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
58f0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5900: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
5910: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
5920: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
5930: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
5940: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
5950: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5960: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
5970: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5980: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
5990: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
59a0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
59b0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
59c0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
59d0: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
59e0: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
59f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5a00: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
5a10: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
5a20: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
5a30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
5a40: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5a50: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5a60: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5a70: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
5a80: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
5a90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
5aa0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5ab0: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  TEXT;.    pMem++
5ac0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
5ad0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
5ae0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
5af0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
5b00: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
5b10: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5b20: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  led = 1;.       
5b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5b40: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
5b50: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5b60: 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74  = MEM_Dyn|MEM_St
5b70: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
5b80: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
5b90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
5ba0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
5bb0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
5bc0: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
5bd0: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5be0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5bf0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
5c00: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
5c10: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
5c20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5c30: 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  UG.      if( pOp
5c40: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
5c50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5c60: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
5c70: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
5c80: 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f  em->z = pOp->zCo
5c90: 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  mment;.        p
5ca0: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5cb0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
5cc0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5cd0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
5ce0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
5cf0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
5d00: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5d10: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5d30: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
5d40: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5d50: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
5d60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
5d70: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
5d80: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
5d90: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
5da0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5db0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
5dc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5dd0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5de0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5df0: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
5e00: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
5e10: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
5e20: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
5e30: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
5e40: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
5e50: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5e60: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
5e70: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
5e80: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
5e90: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
5ea0: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
5eb0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
5ec0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
5ed0: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
5ee0: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
5ef0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
5f00: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
5f10: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
5f20: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
5f30: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
5f40: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
5f50: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
5f60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5f70: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
5f80: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5f90: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
5fa0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
5fb0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
5fc0: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
5fd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5fe0: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
5ff0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
6000: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
6010: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
6020: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
6030: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6040: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
6050: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
6060: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
6070: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
6080: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
6090: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
60a0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
60b0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
60c0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
60d0: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
60e0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
60f0: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
6100: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
6110: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6120: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6130: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
6140: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
6150: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
6160: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
6170: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
6180: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
6190: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
61a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61b0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
61c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
61d0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
61e0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
61f0: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
6200: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
6210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
6220: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
6230: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f  E_IOTRACE */.../
6240: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
6250: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
6260: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
6270: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
6280: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
6290: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
62a0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
62b0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
62c0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
62d0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
62e0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
62f0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
6300: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
6310: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
6320: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
6330: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
6340: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
6350: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
6360: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6370: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
6380: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
6390: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
63a0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
63d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6400: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
6410: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
6420: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6450: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
6460: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
6470: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6490: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
64a0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
64b0: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
64e0: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
64f0: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
6500: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
6510: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
6520: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
6530: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6540: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6550: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
6560: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
6570: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
6580: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
6590: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
65a0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
65b0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
65c0: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
65d0: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
65e0: 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20  r. This.   * is 
65f0: 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
6600: 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61   to resizeOpArra
6610: 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68  y() below may sh
6620: 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d  rink the.   * p-
6630: 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20  >aOp[] array to 
6640: 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63  save memory if c
6650: 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44  alled when in VD
6660: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20  BE_MAGIC_RUN .  
6670: 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a   * state..   */.
6680: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
6690: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
66a0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
66b0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
66c0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
66d0: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
66e0: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
66f0: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
6700: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
6710: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
6720: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
6730: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
6740: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
6750: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
6760: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43 75 72  ace for.  ** Cur
6770: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
6780: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
6790: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
67a0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
67b0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
67c0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
67d0: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
67e0: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
67f0: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
6800: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
6810: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
6820: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
6830: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
6840: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
6850: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
6860: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
6870: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
6880: 20 73 70 61 63 65 20 66 6f 72 20 72 65 67 69 73   space for regis
6890: 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
68a0: 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20   p->aMem==0 ){. 
68b0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
68c0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
68d0: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
68e0: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
68f0: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  nction. */.    r
6900: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
6910: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 72 65  , &nArg);.    re
6920: 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70  sizeOpArray(p, p
6930: 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65  ->nOp);.    asse
6940: 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20  rt( nVar>=0 );. 
6950: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
6960: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
6970: 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e       p->nMem = n
6980: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a  Mem = 10;.    }.
6990: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71      p->aMem = sq
69a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
69b0: 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 4d  o(db,.        nM
69c0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  em*sizeof(Mem)  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
69e0: 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aMem */.      + 
69f0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a10: 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20  * aVar */.      
6a20: 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  + nArg*sizeof(Me
6a30: 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  m*)             
6a40: 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20   /* apArg */.   
6a50: 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66     + nVar*sizeof
6a60: 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20 20  (char*)         
6a70: 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a      /* azVar */.
6a80: 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a        + nCursor*
6a90: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20  sizeof(Cursor*) 
6aa0: 2b 20 31 20 20 20 20 2f 2a 20 61 70 43 73 72 20  + 1    /* apCsr 
6ab0: 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  */.    );.    if
6ac0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
6ad0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  led ){.      p->
6ae0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
6af0: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
6b00: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
6b10: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  */.      p->nMem
6b20: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
6b30: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
6b40: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
6b50: 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26       p->aVar = &
6b60: 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b  p->aMem[nMem+1];
6b70: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  .      p->nVar =
6b80: 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e   nVar;.      p->
6b90: 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20  okVar = 0;.     
6ba0: 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d   p->apArg = (Mem
6bb0: 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72  **)&p->aVar[nVar
6bc0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61  ];.      p->azVa
6bd0: 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e  r = (char**)&p->
6be0: 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20  apArg[nArg];.   
6bf0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43     p->apCsr = (C
6c00: 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61  ursor**)&p->azVa
6c10: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
6c20: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
6c30: 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e  sor;.      for(n
6c40: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
6c50: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61  {.        p->aVa
6c60: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
6c70: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6c80: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
6c90: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  b;.      }.     
6ca0: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
6cb0: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; n++){.       
6cc0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
6cd0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
6ce0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
6cf0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
6d00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
6d10: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6d20: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e    for(n=1; n<p->
6d30: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
6d40: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
6d50: 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20  n].db==db );.   
6d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
6d70: 5b 6e 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e  [n].flags==MEM_N
6d80: 75 6c 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ull );.  }.#endi
6d90: 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  f..  p->pc = -1;
6da0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
6db0: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75  E_OK;.  p->uniqu
6dc0: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72  eCnt = 0;.  p->r
6dd0: 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a  eturnDepth = 0;.
6de0: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
6df0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
6e00: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
6e10: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
6e20: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
6e30: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
6e40: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
6e50: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
6e60: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
6e70: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70  t = 255;.  p->op
6e80: 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20  enedStatement = 
6e90: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
6ea0: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69  ROFILE.  {.    i
6eb0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6ec0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
6ed0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  ){.      p->aOp[
6ee0: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
6ef0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
6f00: 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  es = 0;.    }.  
6f10: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
6f20: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
6f30: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
6f40: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
6f50: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
6f60: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
6f70: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
6f80: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
6f90: 6f 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73  or(Vdbe *p, Curs
6fa0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
6fb0: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
6fc0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6fd0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6ff0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
7000: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >pCursor);.  }. 
7010: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
7020: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
7030: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
7040: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
7050: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7060: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
7070: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
7080: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
7090: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
70a0: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
70b0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
70c0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
70d0: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
70e0: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
70f0: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
7100: 3d 20 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  = 1;.    (void)s
7110: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
7120: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64  p->db);.    pMod
7130: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
7140: 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 28 76  bCursor);.    (v
7150: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
7160: 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  yOn(p->db);.    
7170: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
7180: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
7190: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
71a0: 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 6d 65  Cx->pData);.  me
71b0: 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a  mset(pCx, 0, siz
71c0: 65 6f 66 28 43 75 72 73 6f 72 29 29 3b 0a 20 20  eof(Cursor));.  
71d0: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
71e0: 70 43 78 2d 3e 61 54 79 70 65 29 3b 20 2a 2f 0a  pCx->aType); */.
71f0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
7200: 65 28 70 43 78 29 3b 20 2a 2f 0a 7d 0a 0a 2f 2a  e(pCx); */.}../*
7210: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
7220: 72 73 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72  rsors except for
7230: 20 56 54 61 62 20 63 75 72 73 6f 72 73 20 74 68   VTab cursors th
7240: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
7250: 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  .** in use..*/.s
7260: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
7270: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
7280: 41 63 74 69 76 65 56 74 61 62 73 28 56 64 62 65  ActiveVtabs(Vdbe
7290: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
72a0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30   if( p->apCsr==0
72b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
72c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
72d0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75  or; i++){.    Cu
72e0: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
72f0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Csr[i];.    if( 
7300: 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61  pC && (!p->inVta
7310: 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e  bMethod || !pC->
7320: 70 56 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a  pVtabCursor) ){.
7330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7340: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
7350: 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  C);.      p->apC
7360: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  sr[i] = 0;.    }
7370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
7380: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
7390: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
73a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
73b0: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
73c0: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
73d0: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
73e0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
73f0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
7400: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
7410: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
7420: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
7430: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
7440: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
7450: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
7460: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7470: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
7480: 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74  rsExceptActiveVt
7490: 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d  abs(p);.  for(i=
74a0: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
74b0: 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  ++){.    MemSetT
74c0: 79 70 65 46 6c 61 67 28 26 70 2d 3e 61 4d 65 6d  ypeFlag(&p->aMem
74d0: 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  [i], MEM_Null);.
74e0: 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65    }..  releaseMe
74f0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
7500: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
7510: 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43  sqlite3VdbeFifoC
7520: 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b  lear(&p->sFifo);
7530: 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78  .  if( p->contex
7540: 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  tStack ){.    fo
7550: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74  r(i=0; i<p->cont
7560: 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b  extStackTop; i++
7570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7580: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
7590: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69  ->contextStack[i
75a0: 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a  ].sFifo);.    }.
75b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
75c0: 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  (p->contextStack
75d0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74  );.  }.  p->cont
75e0: 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  extStack = 0;.  
75f0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44  p->contextStackD
7600: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  epth = 0;.  p->c
7610: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d  ontextStackTop =
7620: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
7630: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  ee(p->zErrMsg);.
7640: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
7650: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
7660: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
7670: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
7680: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
7690: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
76a0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
76b0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
76c0: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
76d0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
76e0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
76f0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
7700: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
7710: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
7720: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
7730: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
7740: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
7750: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
7760: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
7770: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7780: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
7790: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
77a0: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
77b0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
77c0: 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  n;..  releaseMem
77d0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
77e0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
77f0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
7800: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
7810: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
7820: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
7830: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
7840: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  olumn = nResColu
7850: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
7860: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
7870: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
7880: 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20  llocZero(p->db, 
7890: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
78a0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
78b0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
78c0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
78d0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
78e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
78f0: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
7900: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
7910: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
7920: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
7930: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
7940: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
7950: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
7960: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
7970: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
7980: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
7990: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
79a0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
79b0: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
79c0: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
79d0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
79e0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
79f0: 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f 53 54  *.** If N==P4_ST
7a00: 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74  ATIC  it means t
7a10: 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70  hat zName is a p
7a20: 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73  ointer to a cons
7a30: 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73  tant static.** s
7a40: 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e  tring and we can
7a50: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
7a60: 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73  ointer. If it is
7a70: 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65   P4_DYNAMIC, the
7a80: 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  n .** the string
7a90: 20 69 73 20 66 72 65 65 64 20 75 73 69 6e 67 20   is freed using 
7aa0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 77  sqlite3_free() w
7ab0: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
7ac0: 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a  finished with.**
7ad0: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
7ae0: 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65  N bytes of zName
7af0: 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a   are copied..*/.
7b00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
7b10: 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a  etColName(Vdbe *
7b20: 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  p, int idx, int 
7b30: 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  var, const char 
7b40: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a  *zName, int N){.
7b50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
7b60: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
7b70: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
7b80: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
7b90: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
7ba0: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
7bb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7bc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7bd0: 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20  OMEM;.  assert( 
7be0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
7bf0: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
7c00: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
7c10: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
7c20: 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50  mn]);.  if( N==P
7c30: 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d  4_DYNAMIC || N==
7c40: 50 34 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20  P4_STATIC ){.   
7c50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
7c60: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
7c70: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
7c80: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
7c90: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
7ca0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
7cb0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
7cc0: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
7cd0: 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55  ame, N, SQLITE_U
7ce0: 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  TF8,SQLITE_TRANS
7cf0: 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28  IENT);.  }.  if(
7d00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7d10: 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  & N==P4_DYNAMIC 
7d20: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
7d30: 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61  >flags = (pColNa
7d40: 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f  me->flags&(~MEM_
7d50: 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e  Static))|MEM_Dyn
7d60: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
7d70: 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDel = 0;.  }.  
7d80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7d90: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
7da0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
7db0: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
7dc0: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
7dd0: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
7de0: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
7df0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
7e00: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
7e10: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
7e20: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
7e30: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
7e40: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
7e50: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
7e60: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
7e70: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7e80: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
7e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
7ea0: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
7eb0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
7ec0: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
7ed0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
7ee0: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
7ef0: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
7f00: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
7f10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7f20: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
7f30: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42  mit = 0;..  /* B
7f40: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
7f50: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
7f60: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
7f70: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
7f80: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
7f90: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
7fa0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
7fb0: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
7fc0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
7fd0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
7fe0: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
7ff0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
8000: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
8010: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
8020: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
8030: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
8040: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
8050: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
8060: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
8070: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 72  e3VtabSync(db, r
8080: 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c);.  if( rc!=SQ
8090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
80a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
80b0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
80c0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
80d0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
80e0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
80f0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
8100: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
8110: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
8120: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
8130: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
8140: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
8150: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
8160: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
8170: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
8180: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
8190: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
81a0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
81b0: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
81c0: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
81d0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
81e0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
81f0: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
8200: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
8210: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
8220: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8230: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
8240: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
8250: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
8260: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
8270: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
8280: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
8290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
82a0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
82b0: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
82c0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
82d0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
82e0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
82f0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
8300: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
8310: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73 71   ){.    (void)sq
8320: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
8330: 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d  b);.    rc = db-
8340: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
8350: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
8360: 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
8370: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
8380: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
8390: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
83a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
83b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
83c0: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
83d0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
83e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
83f0: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
8400: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
8410: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
8420: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
8430: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
8440: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
8450: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
8460: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
8470: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
8480: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8490: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
84a0: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
84b0: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
84c0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
84d0: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e  ase is :memory:.
84e0: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77    In that case w
84f0: 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75  e do.  ** not su
8500: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
8510: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
8520: 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70   so use the simp
8530: 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a  le case then.  *
8540: 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  * too..  */.  if
8550: 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69  ( 0==strlen(sqli
8560: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
8570: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
8580: 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  Bt)) || nTrans<=
8590: 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  1 ){.    for(i=0
85a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
85b0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
85c0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
85d0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
85e0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
85f0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
8600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8610: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
8620: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
8630: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8640: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
8650: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
8660: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
8670: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
8680: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
8690: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
86a0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
86b0: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
86c0: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
86d0: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
86e0: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
86f0: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
8700: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
8710: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
8720: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
8730: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
8740: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
8750: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
8760: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
8770: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
8780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8790: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
87a0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
87b0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
87c0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
87d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
87e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
87f0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
8800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8810: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8820: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
8830: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
8840: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
8850: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
8860: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
8870: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
8880: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
8890: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
88a0: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
88b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
88c0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
88d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
88e0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
88f0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
8900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8910: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
8920: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
8930: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
8940: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
8950: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
8960: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
8970: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
8980: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
8990: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
89a0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
89b0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
89c0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
89d0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
89e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
89f0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
8a00: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
8a10: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
8a20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8a30: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
8a40: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
8a50: 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71  random;.      sq
8a60: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
8a70: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8a80: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
8a90: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
8aa0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
8ab0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
8ac0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
8ad0: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
8ae0: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
8af0: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
8b00: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
8b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8b30: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
8b40: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
8b50: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
8b60: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
8b70: 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  S) );..    /* Op
8b80: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
8b90: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63  urnal. */.    rc
8ba0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
8bb0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
8bc0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
8bd0: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8be0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
8bf0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
8c00: 45 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  E|.        SQLIT
8c10: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
8c20: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
8c30: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
8c40: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
8c50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8c60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8c70: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8c80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8c90: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
8ca0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
8cb0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
8cc0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
8cd0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
8ce0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
8cf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
8d00: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8d10: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
8d20: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
8d30: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8d40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
8d50: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
8d60: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
8d70: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
8d80: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
8d90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
8da0: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
8db0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
8dc0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
8dd0: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
8de0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
8df0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8e00: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
8e10: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8e20: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8e30: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
8e40: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
8e50: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
8e60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
8e70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
8e80: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
8e90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8ea0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
8eb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8ec0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
8ed0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
8ee0: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
8ef0: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
8f00: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
8f10: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
8f20: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
8f30: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
8f40: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
8f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
8f60: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
8f70: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
8f80: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8f90: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
8fa0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c  strlen(zFile)+1,
8fb0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
8fc0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c    offset += strl
8fd0: 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  en(zFile)+1;.   
8fe0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8ff0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9000: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9010: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
9020: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9030: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
9040: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
9050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9060: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
9070: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9080: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
9090: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
90a0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
90b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
90c0: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
90d0: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
90e0: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
90f0: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
9100: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9110: 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d  .    zMainFile =
9120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
9130: 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  Dirname(db->aDb[
9140: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  0].pBt);.    if(
9150: 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20   (needSync .    
9160: 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74 65 33   && (0==(sqlite3
9170: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
9180: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
9190: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
91a0: 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20 20 20  QUENTIAL)).     
91b0: 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73  && (rc=sqlite3Os
91c0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
91d0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
91e0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  ))!=SQLITE_OK) )
91f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
9200: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
9210: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
9220: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
9230: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
9240: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9250: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
9260: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9270: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
9280: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
9290: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
92a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
92b0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
92c0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
92d0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
92e0: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
92f0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
9300: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
9310: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
9320: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
9330: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9340: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
9350: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
9360: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
9370: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
9380: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
9390: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
93a0: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
93b0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
93c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
93d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
93e0: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
93f0: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
9400: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
9410: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
9420: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9430: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
9440: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
9450: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
9460: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
9470: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  re occured..    
9480: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9490: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
94a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
94b0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
94c0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
94d0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
94e0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
94f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9500: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
9510: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
9520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9530: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
9540: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
9550: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9560: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
9570: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
9580: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9590: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
95a0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
95b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
95c0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
95d0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
95e0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
95f0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
9600: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
9610: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
9620: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
9630: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
9640: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
9650: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
9660: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
9670: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
9680: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
9690: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
96a0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
96b0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
96c0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
96d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
96e0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
96f0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
9700: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9710: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
9720: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
9730: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
9740: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
9750: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
9760: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
9770: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
9780: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
9790: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
97a0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
97b0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
97c0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
97d0: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
97e0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
97f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
9800: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
9810: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
9820: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
9830: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
9840: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
9850: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
9860: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
9870: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
9880: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
9890: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
98a0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
98b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
98c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
98d0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
98e0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
98f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
9900: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9910: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9920: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e    }.    }.    en
9940: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
9950: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
9960: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
9970: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
9980: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
9990: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
99a0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
99b0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
99c0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
99d0: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
99e0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
99f0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
9a00: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
9a10: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
9a20: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
9a30: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
9a40: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
9a50: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
9a60: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
9a70: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
9a80: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
9a90: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
9aa0: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
9ab0: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
9ac0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
9ad0: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
9ae0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
9af0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
9b00: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
9b10: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
9b20: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
9b30: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
9b40: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
9b50: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9b60: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
9b70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
9b80: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
9b90: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
9ba0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
9bb0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
9bc0: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
9bd0: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  veVdbeCnt );.}.#
9be0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
9bf0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
9c00: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
9c10: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
9c20: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
9c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
9c40: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
9c50: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
9c60: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
9c70: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
9c80: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
9c90: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
9ca0: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
9cb0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
9cc0: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
9cd0: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
9ce0: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
9cf0: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
9d00: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
9d10: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
9d20: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
9d30: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
9d40: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
9d50: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
9d60: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
9d70: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
9d80: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
9d90: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
9da0: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
9db0: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
9dc0: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
9dd0: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
9de0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
9df0: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
9e00: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
9e10: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
9e20: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
9e30: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
9e40: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
9e50: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
9e60: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
9e70: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
9e80: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
9e90: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
9ea0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
9eb0: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
9ec0: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
9ed0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
9ee0: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
9ef0: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
9f00: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
9f10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
9f20: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9f30: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
9f40: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9f50: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
9f60: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
9f70: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
9f80: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
9f90: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
9fa0: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
9fb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9fd0: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
9fe0: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
9ff0: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
a000: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
a010: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
a020: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
a030: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
a040: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
a050: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
a060: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
a070: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
a080: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a090: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
a0a0: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
a0b0: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
a0c0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
a0d0: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
a0e0: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
a0f0: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
a100: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
a110: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
a120: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
a130: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
a140: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
a150: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
a160: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
a170: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
a180: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
a190: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
a1a0: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
a1b0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
a1c0: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
a1d0: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
a1e0: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
a1f0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
a200: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
a210: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
a220: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
a230: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
a240: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a   int i;.  int (*
a250: 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42  xFunc)(Btree *pB
a260: 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63  t) = 0;  /* Func
a270: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20  tion to call on 
a280: 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65  each btree backe
a290: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70  nd */.  int isSp
a2a0: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
a2b0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
a2c0: 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   true if SQLITE_
a2d0: 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a  NOMEM or IOERR *
a2e0: 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
a2f0: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
a300: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
a310: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
a320: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
a330: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
a340: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
a350: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
a360: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
a370: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
a380: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
a390: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
a3a0: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
a3b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
a3c0: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
a3d0: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
a3e0: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
a3f0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
a400: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
a410: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
a420: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
a430: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
a440: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
a450: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
a460: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
a470: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
a480: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
a490: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
a4a0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
a4b0: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
a4c0: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
a4d0: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
a4e0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
a4f0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
a500: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
a510: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
a520: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
a530: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
a540: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
a550: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
a560: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
a570: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
a580: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
a590: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a5a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
a5b0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
a5c0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
a5d0: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
a5e0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
a5f0: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
a600: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
a610: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
a620: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
a630: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
a640: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20  rom p->rc */..  
a650: 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
a660: 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
a670: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a680: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
a690: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70  texArrayEnter(&p
a6a0: 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->aMutex);..    
a6b0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
a6c0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
a6d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
a6e0: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
a6f0: 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
a700: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
a710: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
a720: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
a750: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
a760: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
a770: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
a780: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
a790: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f   /* This loop do
a7a0: 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73  es static analys
a7b0: 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  is of the query 
a7c0: 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66 20  to see which of 
a7d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  the.      ** fol
a7e0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61 74  lowing three cat
a7f0: 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73  egories it falls
a800: 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a   into:.      **.
a810: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61        **     Rea
a820: 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  d-only.      ** 
a830: 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20 73      Query with s
a840: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
a850: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75  .      **     Qu
a860: 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61 74  ery without stat
a870: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  ement journal.  
a880: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
a890: 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65  We could do some
a8a0: 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61  thing more elega
a8b0: 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61  nt than this sta
a8c0: 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e  tic analysis (i.
a8d0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  e..      ** stor
a8e0: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75  e the type of qu
a8f0: 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74  ery as part of t
a900: 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70  he compliation p
a910: 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20  hase), but .    
a920: 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61    ** handling ma
a930: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
a940: 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c 79  lure is a fairly
a950: 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63 61   obscure edge ca
a960: 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20  se so .      ** 
a970: 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79  this is probably
a980: 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d   easier. Todo: M
a990: 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72  ight be an oppor
a9a0: 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65  tunity to reduce
a9b0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20   .      ** code 
a9c0: 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c  size a very smal
a9d0: 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e  l amount though.
a9e0: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
a9f0: 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e 6c    int notReadOnl
aa00: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  y = 0;.      int
aa10: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30   isStatement = 0
aa20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
aa30: 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d  ->aOp || p->nOp=
aa40: 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  =0);.      for(i
aa50: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
aa60: 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69  +){ .        swi
aa70: 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  tch( p->aOp[i].o
aa80: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
aa90: 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73     case OP_Trans
aaa0: 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  action:.        
aab0: 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20      notReadOnly 
aac0: 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b  |= p->aOp[i].p2;
aad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
aae0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
aaf0: 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a  se OP_Statement:
ab00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 53  .            isS
ab10: 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20  tatement = 1;.  
ab20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ab30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ab40: 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a   }..   .      /*
ab50: 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
ab60: 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20  s read-only, we 
ab70: 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62  need do no rollb
ab80: 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65  ack at all. Othe
ab90: 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
aba0: 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65  proceed with the
abb0: 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
abc0: 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
abd0: 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e 6c    if( notReadOnl
abe0: 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
abf0: 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
ac00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
ac10: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
ac20: 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61 74 65  OCKED && isState
ac30: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
ac40: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
ac50: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
ac60: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  mt;.          p-
ac70: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53  >rc = SQLITE_BUS
ac80: 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
ac90: 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49  e if( (mrc==SQLI
aca0: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
acb0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
acc0: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
acd0: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
ace0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
acf0: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
ad00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad10: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
ad20: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
ad30: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
ad40: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
ad50: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
ad60: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
ad70: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
ad80: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
ad90: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
ada0: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
adb0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76  */.          inv
adc0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
add0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
ade0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
adf0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
ae00: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
ae10: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
ae20: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ae30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
ae40: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
ae50: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
ae60: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
ae70: 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
ae80: 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20   vdbe, then.    
ae90: 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  ** we do either 
aea0: 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
aeb0: 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
aec0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
aed0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
aee0: 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
aef0: 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
af00: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
af10: 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
af20: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
af30: 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20  s occured. .    
af40: 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  */.    if( db->a
af50: 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
af60: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d  >activeVdbeCnt==
af70: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
af80: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
af90: 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
afa0: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
afb0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
afc0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
afd0: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
afe0: 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20  ag is true, and 
aff0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
b000: 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   was .        **
b010: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68   successful or h
b020: 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
b030: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73  constraint. This
b040: 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
b050: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72  .        ** is r
b060: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20  equired..       
b070: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b080: 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
b090: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  db);.        if(
b0a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
b0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b0c0: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
b0d0: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
b0e0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
b0f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b100: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
b110: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
b120: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b130: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
b140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b150: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
b160: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b180: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
b190: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
b1a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
b1b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b1c0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b1d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
b1e0: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
b1f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
b200: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b210: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
b220: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
b230: 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64     if( p->opened
b240: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
b250: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
b260: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
b270: 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  tStmt;.        }
b280: 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66   .      }else if
b290: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
b2a0: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
b2b0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
b2c0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b2d0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65  ckStmt;.      }e
b2e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
b2f0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b300: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
b310: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
b320: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b330: 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
b340: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
b350: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b360: 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63  .    /* If xFunc
b370: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
b380: 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  en it is one of 
b390: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b3a0: 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20  backStmt or.    
b3b0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
b3c0: 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20  ommitStmt. Call 
b3d0: 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  it once on each 
b3e0: 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65  backend. If an e
b3f0: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20  rror occurs.    
b400: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ** and the retur
b410: 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20  n code is still 
b420: 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74  SQLITE_OK, set t
b430: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
b440: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
b450: 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20   error value..  
b460: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b470: 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20  !xFunc ||.      
b480: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
b490: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c  reeCommitStmt ||
b4a0: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
b4b0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b4c0: 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20  ckStmt.    );.  
b4d0: 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63    for(i=0; xFunc
b4e0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
b4f0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
b500: 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  rc;.      Btree 
b510: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
b520: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
b530: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
b540: 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b  rc = xFunc(pBt);
b550: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
b560: 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  && (p->rc==SQLIT
b570: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
b580: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b590: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
b5a0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
b5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
b5c0: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
b5d0: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  g, 0);.        }
b5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b5f0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
b600: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
b610: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
b620: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
b630: 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  nt was committed
b640: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
b650: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
b660: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
b670: 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
b680: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
b690: 20 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63        if( !xFunc
b6a0: 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74   || xFunc==sqlit
b6b0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
b6c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b6d0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
b6e0: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
b6f0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
b700: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b710: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
b720: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
b730: 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
b740: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
b750: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
b760: 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
b770: 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
b780: 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20  occurred. */.   
b790: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
b7a0: 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61  TE_OK && db->fla
b7b0: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
b7c0: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20  Changes ){.     
b7d0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
b7e0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
b7f0: 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  0);.      db->fl
b800: 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ags = (db->flags
b810: 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   | SQLITE_Intern
b820: 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a  Changes);.    }.
b830: 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
b840: 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
b850: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
b860: 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d  exArrayLeave(&p-
b870: 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20  >aMutex);.  }.. 
b880: 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
b890: 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
b8a0: 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
b8b0: 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
b8c0: 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
b8d0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
b8e0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b8f0: 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  --;.  }.  p->mag
b900: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b910: 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
b920: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
b930: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
b940: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b950: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b960: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 68 65  NOMEM;.  }.  che
b970: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
b980: 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  db);..  return S
b990: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
b9a0: 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
b9b0: 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
b9c0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b9d0: 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
b9e0: 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
b9f0: 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
ba00: 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
ba10: 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
ba20: 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
ba30: 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
ba40: 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
ba50: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
ba60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ba70: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
ba80: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
ba90: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
baa0: 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
bab0: 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
bac0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
bad0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
bae0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
baf0: 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
bb00: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
bb10: 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
bb20: 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
bb30: 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
bb40: 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
bb50: 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
bb60: 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
bb70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
bb80: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
bb90: 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
bba0: 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
bbb0: 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
bbc0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
bbd0: 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
bbe0: 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
bbf0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
bc00: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
bc10: 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
bc20: 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
bc30: 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
bc40: 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
bc50: 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
bc60: 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
bc70: 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
bc80: 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
bc90: 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
bca0: 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
bcb0: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
bcc0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
bcd0: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
bce0: 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
bcf0: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
bd00: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
bd10: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
bd20: 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
bd30: 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
bd40: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
bd50: 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
bd60: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
bd70: 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
bd80: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
bd90: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
bda0: 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
bdb0: 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
bdc0: 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
bdd0: 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
bde0: 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
bdf0: 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
be00: 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
be10: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
be20: 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
be30: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
be40: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
be50: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
be60: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
be70: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
be80: 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
be90: 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
bea0: 5f 55 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72  _UTF8,sqlite3_fr
beb0: 65 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  ee);.      db->e
bec0: 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
bed0: 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
bee0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
bef0: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
bf00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
bf10: 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
bf20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf30: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
bf40: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
bf50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
bf60: 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
bf70: 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
bf80: 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
bf90: 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
bfa0: 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
bfb0: 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
bfc0: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
bfd0: 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
bfe0: 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
bff0: 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
c000: 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
c010: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
c020: 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
c030: 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
c040: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
c050: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
c060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
c070: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
c080: 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
c090: 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
c0a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
c0b0: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
c0c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
c0d0: 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
c0e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
c0f0: 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
c100: 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
c110: 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
c120: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
c130: 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
c140: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
c150: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
c160: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
c170: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
c180: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
c190: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
c1a0: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
c1b0: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
c1c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c1d0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
c1e0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
c1f0: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
c200: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
c210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
c220: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
c230: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c240: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
c250: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c260: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
c270: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
c280: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
c290: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
c2a0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
c2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
c2c0: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
c2d0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
c2e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
c2f0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
c310: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
c320: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
c330: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
c340: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
c350: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
c360: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
c370: 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74  INIT;.  p->abort
c380: 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ed = 0;.  return
c390: 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
c3a0: 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
c3b0: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
c3c0: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
c3d0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
c3e0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
c3f0: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
c400: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
c410: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
c420: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
c430: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
c440: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
c450: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
c460: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c470: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
c480: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
c490: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
c4a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
c4b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c4c0: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
c4d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
c4e0: 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
c4f0: 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c  sk)==rc );.  }el
c500: 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  se if( p->magic!
c510: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
c520: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c530: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
c540: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
c550: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
c560: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c570: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
c580: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
c590: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
c5a0: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
c5b0: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
c5c0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
c5d0: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
c5e0: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
c5f0: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
c600: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
c610: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
c620: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
c630: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
c640: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
c650: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
c660: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
c670: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
c680: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
c690: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
c6a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
c6b0: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
c6c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
c6d0: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
c6e0: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
c6f0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
c700: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c  1 || !(mask&(1<<
c710: 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
c720: 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
c730: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
c740: 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
c750: 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
c760: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c770: 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
c780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c790: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
c7a0: 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
c7b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
c7c0: 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
c7d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c7e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c7f0: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66  Cleanup(p);.  if
c800: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
c810: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
c820: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
c830: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c840: 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d  t( p->db->pVdbe=
c850: 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d  =p );.    p->db-
c860: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
c870: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
c880: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
c890: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
c8a0: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
c8b0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
c8c0: 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f   Op *pOp = p->aO
c8d0: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
c8e0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70  i<p->nOp; i++, p
c8f0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
c900: 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c  eP4(pOp->p4type,
c910: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
c920: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
c940: 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  ree(pOp->zCommen
c950: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
c960: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c970: 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a  3_free(p->aOp);.
c980: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
c990: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
c9a0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74  ->nVar);.  sqlit
c9b0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65  e3_free(p->aLabe
c9c0: 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  l);.  if( p->aMe
c9d0: 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  m ){.    sqlite3
c9e0: 5f 66 72 65 65 28 26 70 2d 3e 61 4d 65 6d 5b 31  _free(&p->aMem[1
c9f0: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
ca00: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
ca10: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
ca20: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
ca30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ca40: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
ca50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
ca60: 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69  zSql);.  p->magi
ca70: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
ca80: 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  EAD;.  sqlite3_f
ca90: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
caa0: 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
cab0: 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
cac0: 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
cad0: 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
cae0: 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
caf0: 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  w.  Return an er
cb00: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f  ror code.  If no
cb10: 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69   MoveTo is pendi
cb20: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ng, this.** rout
cb30: 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67  ine does nothing
cb40: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
cb50: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
cb60: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
cb70: 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70  Moveto(Cursor *p
cb80: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
cb90: 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
cba0: 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
cbb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
cbc0: 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  T.    extern int
cbd0: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
cbe0: 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
cbf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
cc00: 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  able );.    rc =
cc10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
cc20: 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  eto(p->pCursor, 
cc30: 30 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  0, 0, p->movetoT
cc40: 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b  arget, 0, &res);
cc50: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
cc60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d  turn rc;.    *p-
cc70: 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20  >pIncrKey = 0;. 
cc80: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
cc90: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
cca0: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
ccb0: 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
ccc0: 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69   = res==0;.    i
ccd0: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
cce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
ccf0: 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73  reeNext(p->pCurs
cd00: 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
cd10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cd20: 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65   rc;.    }.#ifde
cd30: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
cd40: 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
cd50: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
cd60: 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
cd70: 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
cd80: 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
cd90: 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
cda0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
cdb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
cdc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
cdd0: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
cde0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
cdf0: 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
ce00: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
ce10: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
ce20: 62 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a  beSerialRead().*
ce30: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
ce40: 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
ce50: 74 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69  te3VdbeSerialWri
ce60: 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  te().**.** encap
ce70: 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
ce80: 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
ce90: 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
cea0: 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
ceb0: 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
cec0: 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
ced0: 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
cee0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
cef0: 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
cf00: 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
cf10: 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
cf20: 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
cf30: 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
cf40: 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
cf50: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
cf60: 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
cf70: 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
cf80: 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
cf90: 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
cfa0: 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
cfb0: 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
cfc0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
cfd0: 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
cfe0: 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
cff0: 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
d000: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d010: 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
d020: 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
d030: 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
d040: 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
d050: 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
d060: 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
d070: 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
d080: 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
d090: 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a  ob seperately..*
d0a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d0b0: 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
d0c0: 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
d0d0: 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
d0e0: 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
d0f0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
d100: 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
d110: 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
d120: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
d130: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
d140: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
d150: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
d180: 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
d1b0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
d1c0: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
d1f0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
d200: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
d210: 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
d220: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
d230: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
d260: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
d270: 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
d290: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
d2a0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
d2b0: 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
d2c0: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
d2d0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
d2e0: 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
d310: 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
d320: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
d330: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
d340: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
d350: 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
d380: 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
d390: 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
d3a0: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
d3d0: 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
d3e0: 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
d3f0: 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
d400: 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
d410: 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
d420: 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
d430: 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
d440: 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
d450: 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
d460: 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
d470: 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
d480: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
d490: 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
d4a0: 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
d4b0: 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
d4c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
d4d0: 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
d4e0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
d4f0: 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
d500: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
d510: 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
d520: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
d530: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
d540: 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e  Mem->flags;.  in
d550: 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  t n;..  if( flag
d560: 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
d570: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d580: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
d590: 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
d5a0: 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
d5b0: 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
d5c0: 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
d5d0: 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
d5e0: 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
d5f0: 78 30 30 30 30 31 30 30 30 29 3c 3c 33 32 29 2d  x00001000)<<32)-
d600: 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
d610: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
d620: 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c  4 u;.    if( fil
d630: 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28  e_format>=4 && (
d640: 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20  i&1)==i ){.     
d650: 20 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20   return 8+i;.   
d660: 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f   }.    u = i<0 ?
d670: 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28   -i : i;.    if(
d680: 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e   u<=127 ) return
d690: 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33   1;.    if( u<=3
d6a0: 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
d6b0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
d6c0: 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
d6d0: 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
d6e0: 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
d6f0: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
d700: 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
d710: 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
d720: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
d730: 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
d740: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
d750: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 28   assert( flags&(
d760: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
d770: 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d  ) );.  n = pMem-
d780: 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
d790: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
d7a0: 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69    n += pMem->u.i
d7b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d7c0: 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  n>=0 );.  return
d7d0: 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
d7e0: 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
d7f0: 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  =0));.}../*.** R
d800: 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
d810: 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
d820: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
d830: 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
d840: 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-type..*/.int s
d850: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d860: 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
d870: 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
d880: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
d890: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
d8a0: 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
d8b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
d8c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
d8d0: 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  Size[] = { 0, 1,
d8e0: 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20   2, 3, 4, 6, 8, 
d8f0: 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  8, 0, 0, 0, 0 };
d900: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a  .    return aSiz
d910: 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  e[serial_type];.
d920: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
d930: 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
d940: 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
d950: 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
d960: 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
d970: 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
d980: 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
d990: 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
d9a0: 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
d9b0: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
d9c0: 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
d9d0: 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
d9e0: 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
d9f0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
da00: 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
da10: 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
da20: 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
da30: 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
da40: 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
da50: 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
da60: 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
da70: 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
da80: 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
da90: 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
daa0: 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
dab0: 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
dac0: 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
dad0: 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
dae0: 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
daf0: 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
db00: 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
db10: 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
db20: 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
db30: 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
db40: 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
db50: 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
db60: 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
db70: 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
db80: 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
db90: 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
dba0: 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
dbb0: 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
dbc0: 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
dbd0: 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
dbe0: 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
dbf0: 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
dc00: 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
dc10: 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
dc20: 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
dc30: 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
dc40: 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
dc50: 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
dc60: 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
dc70: 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
dc80: 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
dc90: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
dca0: 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
dcb0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
dcc0: 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
dcd0: 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
dce0: 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
dcf0: 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
dd00: 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
dd10: 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
dd20: 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
dd30: 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
dd40: 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
dd50: 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
dd60: 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
dd70: 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
dd80: 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
dd90: 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
dda0: 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
ddb0: 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
ddc0: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
ddd0: 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
dde0: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
ddf0: 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
de00: 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
de10: 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
de20: 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
de30: 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
de40: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
de50: 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
de60: 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
de70: 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
de80: 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
de90: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
dea0: 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
deb0: 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
dec0: 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
ded0: 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
dee0: 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
def0: 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
df00: 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
df10: 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
df20: 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
df30: 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
df40: 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
df50: 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
df60: 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
df70: 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
df80: 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
df90: 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
dfa0: 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
dfb0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
dfc0: 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
dfd0: 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
dfe0: 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
dff0: 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
e000: 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
e010: 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
e020: 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
e030: 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
e040: 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
e050: 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
e060: 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
e070: 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
e080: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e090: 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
e0a0: 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
e0b0: 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
e0c0: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
e0d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
e0e0: 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
e0f0: 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
e100: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
e110: 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
e120: 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
e130: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
e140: 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
e150: 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
e160: 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
e170: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
e180: 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
e190: 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
e1a0: 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
e1b0: 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e  eft in buf[].  n
e1c0: 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20  Buf must always 
e1d0: 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75  be.** large enou
e1e0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  gh to hold the e
e1f0: 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78  ntire field.  Ex
e200: 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65  cept, if the fie
e210: 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20  ld is.** a blob 
e220: 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c  with a zero-fill
e230: 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75  ed tail, then bu
e240: 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73  f[] might be jus
e250: 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73  t the right.** s
e260: 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72  ize to hold ever
e270: 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f  ything except fo
e280: 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  r the zero-fille
e290: 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b  d tail.  If buf[
e2a0: 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67  ].** is only big
e2b0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
e2c0: 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65  the non-zero pre
e2d0: 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  fix, then only w
e2e0: 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65  rite that.** pre
e2f0: 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  fix into buf[]. 
e300: 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73   But if buf[] is
e310: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
e320: 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a   hold both the.*
e330: 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65  * prefix and the
e340: 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65   tail then write
e350: 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20   the prefix and 
e360: 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20  set the tail to 
e370: 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a  all.** zeros..**
e380: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
e390: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
e3a0: 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
e3b0: 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
e3c0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
e3d0: 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
e3e0: 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
e3f0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
e400: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
e410: 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
e420: 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
e430: 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74  n buf[]..*/ .int
e440: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e450: 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69  alPut(u8 *buf, i
e460: 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d  nt nBuf, Mem *pM
e470: 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
e480: 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69  mat){.  u32 seri
e490: 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
e4a0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
e4b0: 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pMem, file_forma
e4c0: 74 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a  t);.  int len;..
e4d0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
e4e0: 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
e4f0: 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
e500: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
e510: 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
e520: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
e530: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
e540: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
e550: 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
e560: 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20  f(pMem->r) );.  
e570: 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26      memcpy(&v, &
e580: 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28  pMem->r, sizeof(
e590: 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
e5a0: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
e5b0: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
e5c0: 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
e5d0: 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
e5e0: 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
e5f0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
e600: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
e610: 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d     assert( len<=
e620: 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c  nBuf );.    whil
e630: 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
e640: 62 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46  buf[i] = (v&0xFF
e650: 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
e660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
e670: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
e680: 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
e690: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
e6a0: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
e6b0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
e6c0: 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
e6d0: 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
e6e0: 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20 20  m->u.i:0).      
e6f0: 20 20 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65         == sqlite
e700: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
e710: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
e720: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e730: 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a  Mem->n<=nBuf );.
e740: 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
e750: 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75  n;.    memcpy(bu
e760: 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
e770: 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
e780: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
e790: 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d   ){.      len +=
e7a0: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
e7b0: 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29    if( len>nBuf )
e7c0: 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
e7d0: 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nBuf;.      }.  
e7e0: 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b      memset(&buf[
e7f0: 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e  pMem->n], 0, len
e800: 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d  -pMem->n);.    }
e810: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
e820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
e830: 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
e840: 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
e850: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  0;.}../*.** Dese
e860: 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
e870: 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
e880: 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
e890: 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
e8a0: 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
e8b0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
e8c0: 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
e8d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
e8e0: 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  read..*/ .int sq
e8f0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
e900: 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
e910: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
e920: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
e930: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
e940: 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
e950: 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
e960: 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
e970: 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
e980: 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
e990: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
e9a0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
e9b0: 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
e9c0: 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
e9d0: 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
e9e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
e9f0: 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
ea00: 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
ea10: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
ea20: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
ea30: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
ea40: 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
ea50: 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
ea60: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ea70: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
ea80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ea90: 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
eaa0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
eab0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
eac0: 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
ead0: 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
eae0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
eaf0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
eb00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
eb10: 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
eb20: 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
eb30: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
eb40: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
eb50: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
eb60: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
eb70: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
eb80: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
eb90: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
eba0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
ebb0: 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
ebc0: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
ebd0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
ebe0: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
ebf0: 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
ec00: 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
ec10: 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
ec20: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ec30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
ec40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ec50: 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
ec60: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
ec70: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
ec80: 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
ec90: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
eca0: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
ecb0: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
ecc0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ecd0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
ece0: 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
ecf0: 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
ed00: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
ed10: 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
ed20: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
ed30: 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
ed40: 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
ed50: 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
ed60: 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
ed70: 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
ed80: 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
ed90: 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
eda0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
edb0: 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
edc0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
edd0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
ede0: 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
edf0: 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
ee00: 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
ee10: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
ee20: 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
ee30: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
ee40: 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a  */.      u64 x;.
ee50: 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66        u32 y;.#if
ee60: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
ee70: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
ee80: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
ee90: 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
eea0: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
eeb0: 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
eec0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
eed0: 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
eee0: 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64       ** byte ord
eef0: 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
ef00: 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
ef10: 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
ef20: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66   is.      ** def
ef30: 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
ef40: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
ef50: 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
ef60: 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a  e mixed.      **
ef70: 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a   endian..      *
ef80: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
ef90: 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
efa0: 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
efb0: 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69  <32;.      stati
efc0: 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
efd0: 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75  1 = 1.0;.      u
efe0: 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
eff0: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
f000: 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
f010: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f020: 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
f030: 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
f040: 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
f050: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
f060: 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d       x = (buf[0]
f070: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
f080: 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
f090: 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
f0a0: 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c     y = (buf[4]<<
f0b0: 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31  24) | (buf[5]<<1
f0c0: 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29  6) | (buf[6]<<8)
f0d0: 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20   | buf[7];.     
f0e0: 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
f0f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
f100: 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
f110: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f120: 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
f130: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f140: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
f150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f160: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f170: 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
f180: 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20  pMem->r)==8 );. 
f190: 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64         swapMixed
f1a0: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
f1b0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
f1c0: 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a  pMem->r, &x, siz
f1d0: 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20  eof(x));.       
f1e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f1f0: 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
f200: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
f210: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f220: 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
f230: 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
f240: 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
f250: 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
f260: 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
f270: 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
f280: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f290: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
f2a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
f2b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
f2c0: 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
f2d0: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
f2e0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
f2f0: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
f300: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
f310: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
f320: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
f330: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
f340: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
f350: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
f360: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
f370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f380: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f390: 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
f3a0: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
f3b0: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
f3c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f3d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
f3e0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 72  he header of a r
f3f0: 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f  ecord consists o
f400: 66 20 61 20 73 65 71 75 65 6e 63 65 20 76 61 72  f a sequence var
f410: 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74  iable-length int
f420: 65 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20  egers..** These 
f430: 69 6e 74 65 67 65 72 73 20 61 72 65 20 61 6c 6d  integers are alm
f440: 6f 73 74 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c  ost always small
f450: 20 61 6e 64 20 61 72 65 20 65 6e 63 6f 64 65 64   and are encoded
f460: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74   as a single byt
f470: 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  e..** The follow
f480: 69 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  ing macro takes 
f490: 61 64 76 61 6e 74 61 67 65 20 74 68 69 73 20 66  advantage this f
f4a0: 61 63 74 20 74 6f 20 70 72 6f 76 69 64 65 20 61  act to provide a
f4b0: 20 66 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20   fast decode.** 
f4c0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  of the integers 
f4d0: 69 6e 20 61 20 72 65 63 6f 72 64 20 68 65 61 64  in a record head
f4e0: 65 72 2e 20 20 49 74 20 69 73 20 66 61 73 74 65  er.  It is faste
f4f0: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
f500: 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 74   case.** where t
f510: 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 61 20  he integer is a 
f520: 73 69 6e 67 6c 65 20 62 79 74 65 2e 20 20 49 74  single byte.  It
f530: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f   is a little slo
f540: 77 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  wer when the.** 
f550: 69 6e 74 65 67 65 72 20 69 73 20 74 77 6f 20 6f  integer is two o
f560: 72 20 6d 6f 72 65 20 62 79 74 65 73 2e 20 20 42  r more bytes.  B
f570: 75 74 20 6f 76 65 72 61 6c 6c 20 69 74 20 69 73  ut overall it is
f580: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   faster..**.** T
f590: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
f5a0: 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65 71 75  ressions are equ
f5b0: 69 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20  ivalent:.**.**  
f5c0: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 47 65     x = sqlite3Ge
f5d0: 74 56 61 72 69 6e 74 33 32 28 20 41 2c 20 26 42  tVarint32( A, &B
f5e0: 20 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20   );.**.**     x 
f5f0: 3d 20 47 65 74 56 61 72 69 6e 74 28 20 41 2c 20  = GetVarint( A, 
f600: 42 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69  B );.**.*/.#defi
f610: 6e 65 20 47 65 74 56 61 72 69 6e 74 28 41 2c 42  ne GetVarint(A,B
f620: 29 20 20 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d  )  ((B = *(A))<=
f630: 30 78 37 66 20 3f 20 31 20 3a 20 73 71 6c 69 74  0x7f ? 1 : sqlit
f640: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c  e3GetVarint32(A,
f650: 20 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   &B))../*.** Giv
f660: 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
f670: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
f680: 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
f690: 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65   parse the.** re
f6a0: 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61  cord into a Unpa
f6b0: 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
f6c0: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20  ture.  Return a 
f6d0: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
f6e0: 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  at structure..**
f6f0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
f700: 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70  function might p
f710: 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62  rovide szSpace b
f720: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
f730: 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63  * space at pSpac
f740: 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63  e.  This space c
f750: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f  an be used to ho
f760: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  ld the returned.
f770: 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63  ** VDbeParsedRec
f780: 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66  ord structure if
f790: 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
f7a0: 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a  ugh.  If it is.*
f7b0: 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68  * not big enough
f7c0: 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69  , space is obtai
f7d0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
f7e0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  _malloc()..**.**
f7f0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
f800: 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62  ructure should b
f810: 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61  e closed by a ca
f820: 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
f830: 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
f840: 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a  edRecord()..*/ .
f850: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
f860: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
f870: 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
f880: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
f890: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
f8a0: 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
f8b0: 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
f8c0: 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
f8d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f8e0: 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
f8f0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
f900: 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
f910: 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
f920: 72 64 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 53  rd */.  void *pS
f930: 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f  pace,          /
f940: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
f950: 65 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74  e to hold result
f960: 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ing object */.  
f970: 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20  int szSpace     
f980: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f990: 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
f9a0: 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  tes */.){.  cons
f9b0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
f9c0: 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
f9d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
f9e0: 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
f9f0: 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74 20  ecord *p;.  int 
fa00: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 2c 20  nByte;.  int i, 
fa10: 69 64 78 2c 20 64 3b 0a 20 20 75 33 32 20 73 7a  idx, d;.  u32 sz
fa20: 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
fa30: 3b 0a 20 20 0a 20 20 6e 42 79 74 65 20 3d 20 73  ;.  .  nByte = s
fa40: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
fa50: 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
fa60: 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
fa70: 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
fa80: 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  e ){.    p = sql
fa90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
faa0: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
fab0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  yte);.    if( p=
fac0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fad0: 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 3d     p->needFree =
fae0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
faf0: 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20   p = pSpace;.   
fb00: 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 3d 20 30   p->needFree = 0
fb10: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49  ;.  }.  p->pKeyI
fb20: 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
fb30: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
fb40: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
fb50: 20 31 3b 0a 20 20 70 2d 3e 6e 65 65 64 44 65 73   1;.  p->needDes
fb60: 74 72 6f 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 61  troy = 1;.  p->a
fb70: 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65  Mem = pMem = (Me
fb80: 6d 2a 29 26 70 5b 31 5d 3b 0a 20 20 69 64 78 20  m*)&p[1];.  idx 
fb90: 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79  = GetVarint(aKey
fba0: 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
fbb0: 73 7a 48 64 72 3b 0a 20 20 69 20 3d 20 30 3b 0a  szHdr;.  i = 0;.
fbc0: 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
fbd0: 64 72 20 26 26 20 69 3c 70 2d 3e 6e 46 69 65 6c  dr && i<p->nFiel
fbe0: 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  d ){.    u32 ser
fbf0: 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
fc00: 64 78 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28  dx += GetVarint(
fc10: 20 61 4b 65 79 2b 69 64 78 2c 20 73 65 72 69 61   aKey+idx, seria
fc20: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
fc30: 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c 69   d>=nKey && sqli
fc40: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
fc50: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
fc60: 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )>0 ) break;.   
fc70: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
fc80: 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
fc90: 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
fca0: 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65  nfo->db;.    pMe
fcb0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m->flags = 0;.  
fcc0: 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
fcd0: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
fce0: 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
fcf0: 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
fd00: 65 6d 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20  em++;.    i++;. 
fd10: 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d   }.  p->nField =
fd20: 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   i;.  return (vo
fd30: 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id*)p;.}../*.** 
fd40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73  This routine des
fd50: 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64  troys a Unpacked
fd60: 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f  Record object.*/
fd70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
fd80: 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
fd90: 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65  ecord(UnpackedRe
fda0: 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
fdb0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
fdc0: 6e 65 65 64 44 65 73 74 72 6f 79 20 29 7b 0a 20  needDestroy ){. 
fdd0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
fde0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20    Mem *pMem;.   
fdf0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d     for(i=0, pMem
fe00: 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
fe10: 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
fe20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
fe30: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
fe40: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
fe50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
fe60: 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
fe70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fe80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fe90: 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 29 7b 0a   p->needFree ){.
fea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
feb0: 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(p);.    }.  }
fec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
fed0: 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
fee0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
fef0: 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
ff00: 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
ff10: 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
ff20: 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
ff30: 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
ff40: 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
ff50: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
ff60: 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70  ger if {nKey1, p
ff70: 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68  Key1} is less th
ff80: 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
ff90: 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
ffa0: 20 70 50 4b 65 79 32 2e 20 20 54 68 65 20 7b 6e   pPKey2.  The {n
ffb0: 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
ffc0: 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
ffd0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
ffe0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
fff0: 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
10000 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
10010 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
10020 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
10030 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
10040 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
10050 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
10060 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
10070 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
10080 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
10090 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
100a0 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
100b0 6c 65 6e 67 74 68 73 20 64 69 66 66 65 72 2c 20  lengths differ, 
100c0 4b 65 79 32 20 6d 75 73 74 20 62 65 20 74 68 65  Key2 must be the
100d0 20 73 68 6f 72 74 65 72 20 6f 66 20 74 68 65 20   shorter of the 
100e0 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 48 69 73 74 6f  two..**.** Histo
100f0 72 69 63 61 6c 20 6e 6f 74 65 3a 20 49 6e 20 65  rical note: In e
10100 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
10110 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
10120 62 6f 74 68 20 4b 65 79 31 0a 2a 2a 20 61 6e 64  both Key1.** and
10130 20 4b 65 79 32 20 77 65 72 65 20 62 6c 6f 62 73   Key2 were blobs
10140 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 4f   obtained from O
10150 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 42  P_MakeRecord.  B
10160 75 74 20 77 65 20 66 6f 75 6e 64 0a 2a 2a 20 74  ut we found.** t
10170 68 61 74 20 69 6e 20 74 79 70 69 63 61 6c 20 75  hat in typical u
10180 73 65 20 74 68 65 20 73 61 6d 65 20 4b 65 79 32  se the same Key2
10190 20 77 6f 75 6c 64 20 62 65 20 73 75 62 6d 69 74   would be submit
101a0 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ted multiple tim
101b0 65 73 0a 2a 2a 20 69 6e 20 61 20 72 6f 77 2e 20  es.** in a row. 
101c0 20 53 6f 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   So an optimizat
101d0 69 6f 6e 20 77 61 73 20 61 64 64 65 64 20 74 6f  ion was added to
101e0 20 70 61 72 73 65 20 74 68 65 20 4b 65 79 32 20   parse the Key2 
101f0 6b 65 79 0a 2a 2a 20 73 65 70 61 72 61 74 65 6c  key.** separatel
10200 79 20 61 6e 64 20 73 75 62 6d 69 74 20 74 68 65  y and submit the
10210 20 70 61 72 73 65 64 20 76 65 72 73 69 6f 6e 2e   parsed version.
10220 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 77    In this way, w
10230 65 20 61 76 6f 69 64 0a 2a 2a 20 70 61 72 73 69  e avoid.** parsi
10240 6e 67 20 74 68 65 20 73 61 6d 65 20 4b 65 79 32  ng the same Key2
10250 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
10260 69 6e 20 61 20 72 6f 77 2e 0a 2a 2f 0a 69 6e 74  in a row..*/.int
10270 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
10280 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
10290 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
102a0 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 55 6e  id *pKey1, .  Un
102b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
102c0 4b 65 79 32 0a 29 7b 0a 20 20 75 33 32 20 64 31  Key2.){.  u32 d1
102d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
102e0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
102f0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
10300 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
10310 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
10320 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
10330 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
10340 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
10350 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
10360 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10370 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
10380 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
10390 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
103a0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
103b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
103c0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
103d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
103e0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
103f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
10400 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
10410 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
10420 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
10430 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
10440 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
10450 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
10460 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
10470 20 30 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   0;.  .  idx1 = 
10480 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c  GetVarint(aKey1,
10490 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
104a0 20 73 7a 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c   szHdr1;.  nFiel
104b0 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
104c0 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
104d0 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
104e0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
104f0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
10500 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
10510 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
10520 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
10530 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
10540 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
10550 64 78 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74  dx1 += GetVarint
10560 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
10570 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20  rial_type1 );.  
10580 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
10590 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
105a0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
105b0 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
105c0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  eak;..    /* Ext
105d0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
105e0 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
105f0 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
10600 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
10610 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
10620 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
10630 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
10640 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
10650 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
10660 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
10670 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
10680 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20  y2->aMem[i],.   
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64          i<nField
106b0 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
106c0 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
106d0 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 26 4d  if( mem1.flags&M
106e0 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
106f0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
10700 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  mem1);.    if( r
10710 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
10720 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
10730 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  ++;.  }..  /* On
10740 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
10750 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
10760 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
10770 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
10780 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
10790 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
107a0 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
107b0 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
107c0 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
107d0 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
107e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
107f0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
10800 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
10810 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
10820 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10830 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69  !pKeyInfo->prefi
10840 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20  xIsEqual ){.    
10850 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29    if( d1<nKey1 )
10860 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
10870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10880 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
10890 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
108a0 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e   && i<pKeyInfo->
108b0 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20  nField.         
108c0 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66        && pKeyInf
108d0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
108e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63   ){.    rc = -rc
108f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
10900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
10910 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
10920 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70  index entry comp
10930 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  osed using the O
10940 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
10950 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  ode..** The last
10960 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72   entry in this r
10970 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
10980 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63  an integer (spec
10990 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69  ifically.** an i
109a0 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20  nteger rowid).  
109b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
109c0 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
109d0 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74  of bytes in.** t
109e0 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  hat integer..*/.
109f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
10a00 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74  dxRowidLen(const
10a10 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
10a20 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
10a30 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
10a40 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
10a50 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
10a60 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
10a70 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73  he rowid */..  s
10a80 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
10a90 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b  2(aKey, &szHdr);
10aa0 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
10ab0 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64  int32(&aKey[szHd
10ac0 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
10ad0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
10ae0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
10af0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
10b00 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  .}.  ../*.** pCu
10b10 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
10b20 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
10b30 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
10b40 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
10b50 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
10b60 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
10b70 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
10b80 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
10b90 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
10ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10bb0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
10bc0 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
10bd0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
10be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10bf0 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75  dbeIdxRowid(BtCu
10c00 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
10c10 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
10c20 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
10c30 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
10c40 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
10c50 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
10c60 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
10c70 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
10c80 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
10c90 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
10ca0 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
10cb0 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
10cc0 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
10cd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
10ce0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
10cf0 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43  llKey);.  if( nC
10d00 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20  ellKey<=0 ){.   
10d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10d20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
10d30 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  .  m.flags = 0;.
10d40 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 72 63    m.db = 0;.  rc
10d50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
10d60 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
10d70 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
10d80 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
10d90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10da0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65  .  }.  sqlite3Ge
10db0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
10dc0 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  .z, &szHdr);.  s
10dd0 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
10de0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
10df0 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
10e00 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
10e10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10e20 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
10e30 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
10e40 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
10e50 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
10e60 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
10e70 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
10e80 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
10e90 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
10ea0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
10eb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10ec0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
10ed0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
10ee0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
10ef0 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
10f00 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
10f10 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
10f20 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
10f30 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
10f40 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
10f50 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
10f60 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
10f70 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
10f80 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
10f90 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
10fa0 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
10fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
10fc0 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
10fd0 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
10fe0 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
10ff0 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
11000 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
11010 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
11020 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
11030 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
11040 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
11050 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
11060 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
11070 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11080 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
11090 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20  (.  Cursor *pC, 
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
110c0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
110d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
110e0 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20  const u8 *pKey, 
110f0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20    /* The key to 
11100 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74  compare */.  int
11110 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
11120 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11130 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
11140 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
11150 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
11160 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
11170 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
11180 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
11190 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b  .  int lenRowid;
111a0 0a 20 20 4d 65 6d 20 6d 3b 0a 20 20 55 6e 70 61  .  Mem m;.  Unpa
111b0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
111c0 3b 0a 20 20 63 68 61 72 20 7a 53 70 61 63 65 5b  ;.  char zSpace[
111d0 32 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  200];..  sqlite3
111e0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
111f0 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
11200 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
11210 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
11220 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11230 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e  ITE_OK;.  }.  m.
11240 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67  db = 0;.  m.flag
11250 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  s = 0;.  rc = sq
11260 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
11270 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
11280 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
11290 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
112a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
112b0 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  c;.  }.  lenRowi
112c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  d = sqlite3VdbeI
112d0 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29  dxRowidLen((u8*)
112e0 6d 2e 7a 29 3b 0a 20 20 70 52 65 63 20 3d 20 73  m.z);.  pRec = s
112f0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
11300 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49  Unpack(pC->pKeyI
11310 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c  nfo, nKey, pKey,
11320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 20 7a 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   zSpace, sizeof(
11350 7a 53 70 61 63 65 29 29 3b 0a 20 20 69 66 28 20  zSpace));.  if( 
11360 70 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pRec==0 ){.    r
11370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11380 45 4d 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  EM;.  }.  *res =
11390 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
113a0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2d 6c 65  rdCompare(m.n-le
113b0 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 70 52 65  nRowid, m.z, pRe
113c0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  c);.  sqlite3Vdb
113d0 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
113e0 65 63 6f 72 64 28 70 52 65 63 29 3b 0a 20 20 73  ecord(pRec);.  s
113f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
11400 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
11410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11420 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11430 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
11440 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
11450 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
11460 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
11470 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
11480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11490 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
114a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
114b0 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
114c0 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
114d0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
114e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
114f0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
11500 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
11510 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
11520 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
11530 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
11540 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
11550 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
11560 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
11570 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
11580 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
11590 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
115a0 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
115b0 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
115c0 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
115d0 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
115e0 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
115f0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
11600 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
11610 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11620 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
11630 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
11640 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
11650 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
11660 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
11670 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
11680 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
11690 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
116a0 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
116b0 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
116c0 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
116d0 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
116e0 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
116f0 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
11700 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
11710 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
11720 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
11730 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
11740 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
11750 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
11760 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
11770 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
11780 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
11790 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
117a0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
117b0 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
117c0 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
117d0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
117e0 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
117f0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
11800 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
11810 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
11820 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
11830 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
11840 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
11850 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
11860 62 3b 0a 7d 0a                                   b;.}.