/ Hex Artifact Content
Login

Artifact f7460fac0c61d90edb245c66b7ac35254868c8e5:


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 70 4e 65 77  Op *pNew;.  pNew
0a30: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a40: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  loc(p->db, p->aO
0a50: 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f 70 29 29  p, N*sizeof(Op))
0a60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0a70: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0a80: 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20  = N;.    p->aOp 
0a90: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = pNew;.  }.}../
0aa0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0ab0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0ac0: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0ad0: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0ae0: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0af0: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0b00: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0b10: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0b20: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0b30: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0b40: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0b50: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0b60: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0b70: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0b80: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0b90: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0ba0: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0bb0: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0bc0: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0bd0: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0be0: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0bf0: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0c00: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0c10: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0c20: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0c30: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0c40: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0c50: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0c60: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0c70: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0c80: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0c90: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0ca0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0cb0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0cc0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0cd0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
0ce0: 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d  f( p->nOpAlloc<=
0cf0: 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f  i ){.    resizeO
0d00: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
0d10: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0d20: 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f 73 69 7a  loc*2 : 1024/siz
0d30: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66  eof(Op));.    if
0d40: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
0d50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
0d60: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
0d70: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20   }.  p->nOp++;. 
0d80: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
0d90: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ];.  pOp->opcode
0da0: 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35   = op;.  pOp->p5
0db0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0dc0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0dd0: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0de0: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0df0: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0e00: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0e10: 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  D;.  p->expired 
0e20: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
0e30: 54 45 5f 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e  TE_DEBUG.  pOp->
0e40: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  zComment = 0;.  
0e50: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  if( sqlite3VdbeA
0e60: 64 64 6f 70 54 72 61 63 65 20 29 20 73 71 6c 69  ddopTrace ) sqli
0e70: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
0e80: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
0e90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
0ea0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
0eb0: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
0ec0: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
0ed0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
0ee0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
0ef0: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
0f00: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
0f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
0f20: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
0f30: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
0f40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
0f50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0f60: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
0f70: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
0f80: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
0f90: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
0fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
0fb0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0fc0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
0fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
0fe0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
0ff0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1000: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  }.../*.** Add an
1010: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1020: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1030: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
1040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1050: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1060: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1070: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1080: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1090: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
10b0: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
10c0: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
10d0: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
10e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1100: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1110: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1120: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1130: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
1150: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1160: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1170: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
1180: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
1190: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
11a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11b0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
11c0: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
11d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
11e0: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
11f0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1200: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1210: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1220: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1230: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1240: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1250: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1260: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1270: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1280: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1290: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
12a0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
12b0: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
12c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
12d0: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
12e0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
12f0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
1300: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
1310: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
1320: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
1330: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1340: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1350: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1360: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1370: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1380: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1390: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
13a0: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
13b0: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
13c0: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
13d0: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
13e0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
13f0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
1400: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
1410: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
1420: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
1430: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1440: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1460: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1470: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1490: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
14a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
14b0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
14c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
14d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
14e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
14f0: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
1500: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
1510: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
1520: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
1530: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1540: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1550: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1560: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1590: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
15a0: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
15b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
15c0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
15d0: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
15e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
15f0: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
1600: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
1610: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
1620: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
1630: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
1640: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
1650: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1660: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1670: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1680: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1690: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16a0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
16d0: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
16e0: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
16f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1700: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1710: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
1720: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
1730: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1740: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1750: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20  }.}../*.** Loop 
1770: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
1780: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
1790: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
17a0: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
17b0: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
17c0: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
17d0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
17e0: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
17f0: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
1800: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
1810: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
1820: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
1830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1840: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
1850: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
1860: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
1870: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
1880: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
1890: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
18a0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
18b0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
18c0: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
18d0: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
18e0: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
18f0: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
1900: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
1910: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1920: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
1930: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
1940: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rray..**.** This
1950: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
1960: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
1970: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20   optimization:  
1980: 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20  It scans for.** 
1990: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
19a0: 74 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  t might cause a 
19b0: 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
19c0: 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74 72 75  ck.  Such instru
19d0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a  ctions.** are:.*
19e0: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  *.**   *  OP_Hal
19f0: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  t with P1=SQLITE
1a00: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
1a10: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
1a20: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
1a30: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
1a40: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
1a50: 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ename.**.** If n
1a60: 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74 69  o such instructi
1a70: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  on is found, the
1a80: 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e  n every Statemen
1a90: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a  t instruction .*
1aa0: 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  * is changed to 
1ab0: 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68 69 73  a Noop.  In this
1ac0: 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63   way, we avoid c
1ad0: 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61 74  reating the stat
1ae0: 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61  ement .** journa
1af0: 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61  l file unnecessa
1b00: 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rily..*/.static 
1b10: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
1b20: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
1b30: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
1b40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1b50: 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20   nMaxArgs = 0;. 
1b60: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20   Op *pOp;.  int 
1b70: 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61  *aLabel = p->aLa
1b80: 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53  bel;.  int doesS
1b90: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1ba0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53   = 0;.  int hasS
1bb0: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20  tatementBegin = 
1bc0: 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  0;.  for(pOp=p->
1bd0: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
1be0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
1bf0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64  +){.    u8 opcod
1c00: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
1c10: 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ..    if( opcode
1c20: 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b  ==OP_Function ){
1c30: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1c40: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
1c50: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
1c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
1c80: 65 70 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ep .#ifndef SQLI
1c90: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ca0: 41 42 4c 45 0a 20 20 20 20 20 20 20 20 7c 7c 20  ABLE.        || 
1cb0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
1cc0: 74 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b  te.#endif.    ){
1cd0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1ce0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
1cf0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
1d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
1d20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
1d30: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->p1==SQLITE_CON
1d40: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
1d50: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  p2==OE_Abort ){.
1d60: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1d70: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1d80: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1d90: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1da0: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
1db0: 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d  .      hasStatem
1dc0: 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20  entBegin = 1;.  
1dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1de0: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29  de==OP_Destroy )
1df0: 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61 74  {.      doesStat
1e00: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1e10: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1e20: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e30: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
1e40: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
1e50: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
1e60: 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20  OP_VRename ){.  
1e70: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
1e80: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
1e90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1ea0: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
1eb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
1ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1ed0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
1ee0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ef0: 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
1f00: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
1f10: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
1f20: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
1f30: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
1f40: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
1f50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
1f60: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48  lite3VdbeOpcodeH
1f70: 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64  asProperty(opcod
1f80: 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26  e, OPFLG_JUMP) &
1f90: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
1fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
1fb0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
1fc0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
1fd0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
1fe0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
1ff0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2000: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
2010: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a  p->aLabel = 0;..
2020: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
2030: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f  = nMaxArgs;..  /
2040: 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f  * If we never ro
2050: 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
2060: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
2070: 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20  then statement. 
2080: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
2090: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e   are not needed.
20a0: 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72    So change ever
20b0: 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20  y OP_Statement. 
20c0: 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20   ** opcode into 
20d0: 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69  an OP_Noop.  Thi
20e0: 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74  s avoid a call t
20f0: 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  o sqlite3OsOpenE
2100: 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20  xclusive().  ** 
2110: 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70  which can be exp
2120: 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70  ensive on some p
2130: 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20  latforms..  */. 
2140: 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e   if( hasStatemen
2150: 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53  tBegin && !doesS
2160: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
2170: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d   ){.    for(pOp=
2180: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
2190: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
21a0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
21b0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
21c0: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
21d0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
21e0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
21f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2210: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2220: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2230: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2240: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2250: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2260: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
2270: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2280: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2290: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
22a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
22b0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
22c0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
22d0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
22e0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
22f0: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
2300: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
2310: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
2320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
2330: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
2340: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
2350: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
2360: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
2370: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
2380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2390: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
23a0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
23b0: 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f  c ){.    resizeO
23c0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
23d0: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
23e0: 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f 73 69 7a  loc*2 : 1024/siz
23f0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 61 73  eof(Op));.    as
2400: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 2b 6e 4f 70  sert( p->nOp+nOp
2410: 3c 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 7c 7c  <=p->nOpAlloc ||
2420: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
2430: 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 20 20 69 66  iled );.  }.  if
2440: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
2450: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
2460: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64  urn 0;.  }.  add
2470: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  r = p->nOp;.  if
2480: 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69  ( nOp>0 ){.    i
2490: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
24a0: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
24b0: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
24c0: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
24d0: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
24e0: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
24f0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
2500: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
2510: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
2520: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
2530: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
2540: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
2550: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
2560: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f   && sqlite3VdbeO
2570: 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79  pcodeHasProperty
2580: 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f  (pOut->opcode, O
2590: 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20  PFLG_JUMP) ){.  
25a0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
25b0: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
25c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25d0: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
25e0: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
25f0: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
2600: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
2610: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
2620: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
2630: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
2640: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
2650: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2660: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75  _DEBUG.      pOu
2670: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
2680: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2690: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
26a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26b0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
26c0: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
26d0: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
26e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
26f0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
2700: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
2710: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2720: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2730: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
2740: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2750: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2760: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2770: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
2780: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
2790: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
27a0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
27b0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
27c0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
27d0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
27e0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
27f0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2800: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
2810: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2820: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2830: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2840: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2850: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2860: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2870: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
2880: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
2890: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
28a0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
28b0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
28c0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
28d0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
28e0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
28f0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2900: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2910: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
2920: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
2930: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
2940: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2950: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
2960: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
2970: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
2980: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
2990: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
29a0: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
29b0: 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f  addr>=0 && p->nO
29c0: 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70  p>addr && p->aOp
29d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
29e0: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
29f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
2a00: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2a10: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
2a20: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2a30: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
2a40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2a50: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
2a60: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
2a70: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
2a80: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
2a90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2aa0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
2ab0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
2ac0: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
2ad0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
2ae0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
2af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2b00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2b10: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
2b20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2b30: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
2b40: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
2b50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b60: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
2b70: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2b80: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2b90: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2ba0: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
2bb0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->aOp ){.    ass
2bc0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
2bd0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
2be0: 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a  Op-1].p5 = val;.
2bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2c00: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
2c10: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
2c20: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
2c30: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
2c40: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2c50: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2c60: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
2c70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2c80: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
2c90: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
2ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2cb0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
2cc0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
2cd0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
2ce0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
2cf0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
2d00: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
2d10: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
2d20: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
2d30: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
2d40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d50: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
2d60: 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a  nction(FuncDef *
2d70: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65  pDef){.  if( pDe
2d80: 66 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  f && (pDef->flag
2d90: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2da0: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
2db0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
2dc0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ef);.  }.}../*.*
2dd0: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
2de0: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
2df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e00: 20 66 72 65 65 50 34 28 69 6e 74 20 70 34 74 79   freeP4(int p4ty
2e10: 70 65 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20  pe, void *p3){. 
2e20: 20 69 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73   if( p3 ){.    s
2e30: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
2e40: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
2e50: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
2e60: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
2e70: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
2e80: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
2e90: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
2ea0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20  se P4_KEYINFO:. 
2eb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
2ec0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a  INFO_HANDOFF: {.
2ed0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ee0: 66 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20  free(p3);.      
2ef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2f00: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
2f10: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
2f20: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
2f30: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
2f40: 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20  nc *)p3;.       
2f50: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
2f60: 6e 63 74 69 6f 6e 28 70 56 64 62 65 46 75 6e 63  nction(pVdbeFunc
2f70: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  ->pFunc);.      
2f80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
2f90: 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65  eteAuxData(pVdbe
2fa0: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  Func, 0);.      
2fb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2fc0: 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20  VdbeFunc);.     
2fd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2fe0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
2ff0: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
3000: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
3010: 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44 65  Function((FuncDe
3020: 66 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20  f*)p3);.        
3030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3040: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d       case P4_MEM
3050: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
3060: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
3070: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29  lite3_value*)p3)
3080: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30a0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   }.}.../*.** Cha
30b0: 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74  nge N opcodes st
30c0: 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74  arting at addr t
30d0: 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69  o No-ops..*/.voi
30e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
30f0: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
3100: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3110: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
3120: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64  p->aOp ){.    Vd
3130: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
3140: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 77  aOp[addr];.    w
3150: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
3160: 20 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70     freeP4(pOp->p
3170: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
3180: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
3190: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
31a0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70  Op[0]));.      p
31b0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
31c0: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b  Noop;.      pOp+
31d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
31e0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
31f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
3200: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
3210: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
3220: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
3230: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
3240: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
3250: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
3260: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
3270: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
3280: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
3290: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
32a0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
32b0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
32c0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
32d0: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
32e0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
32f0: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
3300: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
3310: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
3320: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
3330: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
3340: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3350: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
3360: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
3370: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
3380: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
3390: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
33a0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
33b0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
33c0: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
33d0: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
33e0: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
33f0: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
3400: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
3410: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
3420: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
3430: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
3440: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
3450: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
3460: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
3470: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
3480: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
3490: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
34a0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
34b0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
34c0: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
34d0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
34e0: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
34f0: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
3500: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
3510: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3520: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
3530: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
3540: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
3550: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
3560: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
3570: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
3580: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
3590: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
35a0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
35b0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
35c0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
35d0: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
35e0: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
35f0: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
3600: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
3610: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
3620: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
3630: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
3640: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
3650: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
3660: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
3670: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
3680: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3690: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
36a0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
36b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
36c0: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
36d0: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
36e0: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
36f0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  .  Op *pOp;.  as
3700: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3710: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3720: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3730: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
3740: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  p==0 || p->db->m
3750: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
3760: 20 20 20 69 66 20 28 6e 20 21 3d 20 50 34 5f 4b     if (n != P4_K
3770: 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20  EYINFO) {.      
3780: 66 72 65 65 50 34 28 6e 2c 20 28 76 6f 69 64 2a  freeP4(n, (void*
3790: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
37a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
37b0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
37c0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
37d0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
37e0: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
37f0: 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61  p - 1;.    if( a
3800: 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ddr<0 ) return;.
3810: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
3820: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
3830: 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c  eP4(pOp->p4type,
3840: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
3850: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
3860: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
3870: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
3880: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
3890: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
38a0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
38b0: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
38c0: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
38d0: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
38e0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
38f0: 2d 3e 70 34 2e 69 20 3d 20 28 69 6e 74 29 28 73  ->p4.i = (int)(s
3900: 71 6c 69 74 65 33 5f 69 6e 74 70 74 72 5f 74 29  qlite3_intptr_t)
3910: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3920: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3930: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a  e if( zP4==0 ){.
3940: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
3950: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  0;.    pOp->p4ty
3960: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3970: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
3980: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
3990: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
39a0: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  nfo;.    int nFi
39b0: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20  eld, nByte;..   
39c0: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49   nField = ((KeyI
39d0: 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c  nfo*)zP4)->nFiel
39e0: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  d;.    nByte = s
39f0: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
3a00: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69   + (nField-1)*si
3a10: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  zeof(pKeyInfo->a
3a20: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c  Coll[0]) + nFiel
3a30: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  d;.    pKeyInfo 
3a40: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
3a50: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70  ( nByte );.    p
3a60: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
3a70: 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  = pKeyInfo;.    
3a80: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
3a90: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65        memcpy(pKe
3aa0: 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74  yInfo, zP4, nByt
3ab0: 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  e);.      /* In 
3ac0: 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
3ad0: 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 50 34 5f 4b  ementation, P4_K
3ae0: 45 59 49 4e 46 4f 20 69 73 20 6f 6e 6c 79 20 65  EYINFO is only e
3af0: 76 65 72 20 75 73 65 64 20 6f 6e 0a 20 20 20 20  ver used on.    
3b00: 20 20 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72    ** KeyInfo str
3b10: 75 63 74 75 72 65 73 20 74 68 61 74 20 68 61 76  uctures that hav
3b20: 65 20 6e 6f 20 61 53 6f 72 74 4f 72 64 65 72 20  e no aSortOrder 
3b30: 63 6f 6d 70 6f 6e 65 6e 74 2e 20 20 45 6c 65 6d  component.  Elem
3b40: 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 77 69  ents.      ** wi
3b50: 74 68 20 61 6e 20 61 53 6f 72 74 4f 72 64 65 72  th an aSortOrder
3b60: 20 61 6c 77 61 79 73 20 75 73 65 20 50 34 5f 4b   always use P4_K
3b70: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2e 20  EYINFO_HANDOFF. 
3b80: 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20   So we do not.  
3b90: 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
3ba0: 6f 74 68 65 72 20 77 69 74 68 20 64 75 70 6c 69  other with dupli
3bb0: 63 61 74 69 6e 67 20 74 68 65 20 61 53 6f 72 74  cating the aSort
3bc0: 4f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  Order. */.      
3bd0: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
3be0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20  ->aSortOrder==0 
3bf0: 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 61  );.#if 0.      a
3c00: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
3c10: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3c20: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f 72  ;.      if( aSor
3c30: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  tOrder ){.      
3c40: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
3c50: 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e  tOrder = (unsign
3c60: 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e  ed char*)&pKeyIn
3c70: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64  fo->aColl[nField
3c80: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
3c90: 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  y(pKeyInfo->aSor
3ca0: 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64  tOrder, aSortOrd
3cb0: 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20  er, nField);.   
3cc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3cd0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3ce0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20  P4_KEYINFO;.    
3cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
3d00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3d10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d   = 1;.      pOp-
3d20: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
3d30: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
3d40: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
3d50: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
3d60: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3d70: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
3d80: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3d90: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c  4_KEYINFO;.  }el
3da0: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
3db0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
3dc0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
3dd0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20  p->p4type = n;. 
3de0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3df0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65  n==0 ) n = strle
3e00: 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  n(zP4);.    pOp-
3e10: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
3e20: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
3e30: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
3e40: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
3e50: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
3e60: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
3e70: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
3e80: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65  mment on the the
3e90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
3ea0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
3eb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3ec0: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
3ed0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
3ee0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
3ef0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
3f00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3f10: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
3f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
3f30: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
3f40: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
3f50: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
3f60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3f70: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
3f80: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
3f90: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31  &p->aOp[p->nOp-1
3fa0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ].zComment;.    
3fb0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
3fc0: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
3fd0: 65 33 5f 66 72 65 65 28 2a 70 7a 29 3b 0a 20 20  e3_free(*pz);.  
3fe0: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
3ff0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
4000: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
4010: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
4020: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4030: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f   Return the opco
4040: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61  de for a given a
4050: 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f  ddress..*/.VdbeO
4060: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
4070: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
4080: 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74   addr){.  assert
4090: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
40a0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
40b0: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
40c0: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
40d0: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
40e0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 65  ocFailed );.  re
40f0: 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26  turn ((addr>=0 &
4100: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28  & addr<p->nOp)?(
4110: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30  &p->aOp[addr]):0
4120: 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  );.}..#if !defin
4130: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
4140: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
4150: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
4160: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
4170: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
4180: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
4190: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
41a0: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
41b0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
41c0: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
41d0: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
41e0: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
41f0: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
4200: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
4210: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
4220: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
4230: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
4240: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
4250: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
4260: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
4270: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
4280: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
4290: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
42a0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
42b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
42c0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
42d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
42e0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
42f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4300: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  p, zTemp, "keyin
4310: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
4320: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
4330: 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d   i = strlen(zTem
4340: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
4350: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
4360: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
4370: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
4380: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
4390: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
43a0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
43b0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
43c0: 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a   strlen(pColl->z
43d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
43e0: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
43f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4400: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
4410: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
4420: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4430: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4440: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4450: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20  = ',';.         
4460: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
4470: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65  SortOrder && pKe
4480: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4490: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
44a0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
44b0: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
44c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
44d0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43  py(&zTemp[i], pC
44e0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b  oll->zName,n+1);
44f0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
4500: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
4510: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
4520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
4530: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
4540: 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,nil",4);.      
4550: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
4560: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4570: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
4580: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
4590: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
45a0: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
45b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
45c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
45d0: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
45e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
45f0: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
4600: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
4610: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4620: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
4630: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
4640: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
4650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4660: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
4670: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
4680: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
4690: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
46a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
46b0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
46c0: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
46d0: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
46e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
46f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4700: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
4710: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4720: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4730: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
4740: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      brea
4750: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4760: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
4770: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4780: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4790: 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
47a0: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
47b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
47c0: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
47d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
47e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
47f0: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
4800: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
4810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4820: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
4830: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
4840: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
4850: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
4860: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4870: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20  M_Null)==0 );.  
4880: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
4890: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
48a0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
48b0: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
48c0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
48d0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
48e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
48f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4900: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
4910: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
4920: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4930: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
4940: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
4950: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4960: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
4970: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
4980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
49a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
49b0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
49c0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
49d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
49e0: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
49f0: 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20 20  >p4.pVtab;.     
4a00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4a10: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4a20: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
4a30: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
4a40: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
4a50: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4a60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4a70: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
4a80: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
4a90: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
4aa0: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
4ab0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
4ac0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
4ad0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4ae0: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
4af0: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
4b00: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  f../*.** Declare
4b10: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
4b20: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
4b30: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
4b40: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a   is used..**.*/.
4b50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4b60: 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a  UsesBtree(Vdbe *
4b70: 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74  p, int i){.  int
4b80: 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74 28   mask;.  assert(
4b90: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
4ba0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
4bb0: 74 28 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e 62  t( i<sizeof(p->b
4bc0: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
4bd0: 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20   mask = 1<<i;.  
4be0: 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  if( (p->btreeMas
4bf0: 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
4c00: 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b      p->btreeMask
4c10: 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71   |= mask;.    sq
4c20: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
4c30: 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61  rrayInsert(&p->a
4c40: 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44  Mutex, p->db->aD
4c50: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d  b[i].pBt);.  }.}
4c60: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  ...#if defined(V
4c70: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
4c80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
4c90: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
4ca0: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
4cb0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4cc0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
4cd0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
4ce0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4cf0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
4d00: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
4d10: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
4d20: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
4d30: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
4d40: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
4d50: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
4d60: 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20  4d %4d %4d %-4s 
4d70: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
4d80: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
4d90: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
4da0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
4db0: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
4dc0: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
4dd0: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
4de0: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
4df0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
4e00: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
4e10: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
4e20: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
4e30: 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  >p5,.#ifdef SQLI
4e40: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70  TE_DEBUG.      p
4e50: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70  Op->zComment ? p
4e60: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22  Op->zComment : "
4e70: 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22  ".#else.      ""
4e80: 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66  .#endif.  );.  f
4e90: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
4ea0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
4eb0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
4ec0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
4ed0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
4ee0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
4ef0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 69 6e  em *p, int N, in
4f00: 74 20 66 72 65 65 62 75 66 66 65 72 73 29 7b 0a  t freebuffers){.
4f10: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4f30: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 6e 74  = p->db;.    int
4f40: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d   malloc_failed =
4f50: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4f60: 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  d;.    while( N-
4f70: 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ->0 ){.      ass
4f80: 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b 30 5d  ert( N<2 || p[0]
4f90: 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a  .db==p[1].db );.
4fa0: 20 20 20 20 20 20 69 66 28 20 66 72 65 65 62 75        if( freebu
4fb0: 66 66 65 72 73 20 29 7b 0a 20 20 20 20 20 20 20  ffers ){.       
4fc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
4fd0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
4fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4ff0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
5000: 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28 70 29  leaseExternal(p)
5010: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5020: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  p->flags = MEM_N
5030: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2b 2b 3b 0a  ull;.      p++;.
5040: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61      }.    db->ma
5050: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
5060: 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  loc_failed;.  }.
5070: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5080: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5090: 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
50a0: 6c 69 74 65 33 56 64 62 65 52 65 6c 65 61 73 65  lite3VdbeRelease
50b0: 42 75 66 66 65 72 73 28 56 64 62 65 20 2a 70 29  Buffers(Vdbe *p)
50c0: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
50d0: 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 61  t nFree = 0;.  a
50e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
50f0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
5100: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
5110: 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d  (ii=1; ii<=p->nM
5120: 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d  em; ii++){.    M
5130: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
5140: 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  Mem[ii];.    if(
5150: 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d   pMem->z && pMem
5160: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20  ->flags&MEM_Dyn 
5170: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5180: 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a   !pMem->xDel );.
5190: 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73        nFree += s
51a0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
51b0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
51c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
51d0: 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
51e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
51f0: 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66   nFree;.}.#endif
5200: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5210: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
5220: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
5230: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
5240: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
5250: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
5260: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
5270: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
5280: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
5290: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
52a0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
52b0: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
52c0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
52d0: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
52e0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
52f0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
5300: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
5310: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
5320: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
5330: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
5340: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
5350: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
5360: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
5370: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
5380: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
5390: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
53a0: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
53b0: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
53c0: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
53d0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
53e0: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
53f0: 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   PLAN..*/.int sq
5400: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
5410: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
5420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5430: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73  e VDBE */.){.  s
5440: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
5450: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
5460: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5470: 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  K;.  Mem *pMem =
5480: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
5490: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20   &p->aMem[1];.. 
54a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
54b0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ain );.  if( p->
54c0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
54d0: 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53  C_RUN ) return S
54e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
54f0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69  assert( db->magi
5500: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
5510: 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74  BUSY );.  assert
5520: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
5530: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
5540: 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20 2f  ITE_BUSY );..  /
5550: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
5560: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
5570: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
5580: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
5590: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
55a0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
55b0: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
55c0: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
55d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
55e0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
55f0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
5600: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
5610: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
5620: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
5630: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 31 29  Mem, p->nMem, 1)
5640: 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  ;..  do{.    i =
5650: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
5660: 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20  le( i<p->nOp && 
5670: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
5680: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
5690: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
56a0: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70  .  if( i>=p->nOp
56b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
56c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
56d0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
56e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
56f0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
5700: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
5710: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
5720: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
5730: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
5740: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
5750: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  p->zErrMsg, sqli
5760: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
5770: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d  , (char*)0);.  }
5780: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
5790: 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  z;.    Op *pOp =
57a0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
57b0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
57c0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
57d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
57e0: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  t;.      pMem->t
57f0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5800: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
5810: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
5840: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
5850: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
5860: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
5870: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
5880: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
5890: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
58a0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
58b0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
58c0: 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63  opcode);  /* Opc
58d0: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
58e0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
58f0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
5900: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
5910: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
5920: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
5930: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
5940: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
5950: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
5960: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
5970: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
5980: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
5990: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
59c0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
59d0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
59e0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
59f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5a00: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
5a10: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
5a40: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
5a50: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5a60: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
5a70: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
5a80: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
5a90: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5aa0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
5ab0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
5ae0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  */.      pMem->t
5af0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5b00: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
5b10: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
5b20: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
5b30: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20  mGrow(pMem, 32, 
5b40: 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  0) ){           
5b50: 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20   /* P4 */.      
5b60: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5b70: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
5b80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5b90: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  EM;.    }.    pM
5ba0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5bb0: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
5bc0: 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69  Term;.    z = di
5bd0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
5be0: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
5bf0: 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b  f( z!=pMem->z ){
5c00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5c10: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
5c20: 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
5c30: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
5c40: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
5c50: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
5c60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
5c70: 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29   strlen(pMem->z)
5c80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
5c90: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
5ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
5cb0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5cc0: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  EXT;.    pMem++;
5cd0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
5ce0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
5cf0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
5d00: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c  MemGrow(pMem, 4,
5d10: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
5d20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5d30: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ed = 1;.        
5d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5d50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
5d60: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5d70: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
5d80: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
5d90: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
5da0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5db0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
5dc0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
5dd0: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
5de0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
5df0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
5e00: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
5e10: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
5e20: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
5e30: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5e40: 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  G.      if( pOp-
5e50: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
5e60: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
5e70: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
5e80: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
5e90: 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d  m->z = pOp->zCom
5ea0: 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  ment;.        pM
5eb0: 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  em->n = strlen(p
5ec0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
5ed0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
5ee0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
5ef0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
5f00: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65     {.        pMe
5f10: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
5f20: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
5f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
5f40: 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mment */.       
5f50: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5f60: 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  LITE_NULL;.     
5f70: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d   }.    }..    p-
5f80: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
5f90: 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 5*(p->explain-
5fa0: 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1);.    p->rc = 
5fb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
5fc0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
5fd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5fe0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5ff0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
6000: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
6010: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
6020: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
6030: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
6040: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
6050: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
6060: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
6070: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
6080: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
6090: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
60a0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
60b0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
60c0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
60d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
60e0: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
60f0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  .z!=0 ){.    con
6100: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70  st char *z = pOp
6110: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c  ->p4.z;.    whil
6120: 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a  e( isspace(*(u8*
6130: 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70  )z) ) z++;.    p
6140: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
6150: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
6160: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
6170: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6180: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
6190: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
61a0: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
61b0: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
61c0: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
61d0: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
61e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
61f0: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
6200: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
6210: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
6220: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
6230: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
6240: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6250: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
6260: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
6270: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
6280: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
6290: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
62a0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
62b0: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
62c0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
62d0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
62e0: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
62f0: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
6300: 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75 6e  i=0; isspace((un
6310: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d  signed char)z[i]
6320: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
6330: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
6340: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 73  ){.      if( iss
6350: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
6360: 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  har)z[i]) ){.   
6370: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
6380: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
6390: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
63a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
63b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
63c0: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
63d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
63e0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
63f0: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
6400: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
6410: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
6420: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
6430: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
6440: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a  _IOTRACE */.../*
6450: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
6460: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
6470: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
6480: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
6490: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
64a0: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
64b0: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
64c0: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
64d0: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
64e0: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
64f0: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
6500: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
6510: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
6520: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
6530: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
6540: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
6550: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
6560: 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56  ve a VDBE from V
6570: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74  DBE_MAGIC_INIT t
6580: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
6590: 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RUN..*/.void sql
65a0: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
65b0: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
65e0: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20  */.  int nVar,  
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6610: 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20   '?' see in the 
6620: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
6630: 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20  .  int nMem,    
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
6660: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61  emory cells to a
6670: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
6680: 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   nCursor,       
6690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
66a0: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
66b0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
66c0: 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20    int isExplain 
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
66f0: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73  EXPLAIN keywords
6700: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29   is present */.)
6710: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
6720: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
6730: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
6740: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6750: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6760: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
6770: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
6780: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
6790: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
67a0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
67b0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
67c0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
67d0: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
67e0: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
67f0: 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62  . This.   * is b
6800: 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
6810: 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  to resizeOpArray
6820: 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72  () below may shr
6830: 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e  ink the.   * p->
6840: 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73  aOp[] array to s
6850: 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61  ave memory if ca
6860: 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42  lled when in VDB
6870: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20  E_MAGIC_RUN .   
6880: 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20  * state..   */. 
6890: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
68a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f  _MAGIC_RUN;..  /
68b0: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
68c0: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
68d0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
68e0: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
68f0: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
6900: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
6910: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
6920: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
6930: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
6940: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
6950: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
6960: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
6970: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43 75 72 73  ce for.  ** Curs
6980: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75  or/BtCursor stru
6990: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62  ctures. The blob
69a0: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
69b0: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a  iated with .  **
69c0: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f   cursor 0 is sto
69d0: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  red in memory ce
69e0: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20  ll nMem. Memory 
69f0: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20  cell (nMem-1).  
6a00: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c  ** stores the bl
6a10: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
6a20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
6a30: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a  sor 1, etc..  **
6a40: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
6a50: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
6a60: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
6a70: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 0a   nCursor;..  /*.
6a80: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20    ** Allocation 
6a90: 73 70 61 63 65 20 66 6f 72 20 72 65 67 69 73 74  space for regist
6aa0: 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
6ab0: 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  p->aMem==0 ){.  
6ac0: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
6ad0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
6ae0: 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73 73  ber of args pass
6af0: 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e  ed to a user fun
6b00: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72 65  ction. */.    re
6b10: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
6b20: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 2f 2a 72   &nArg);.    /*r
6b30: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20  esizeOpArray(p, 
6b40: 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20 20 20 20 61  p->nOp);*/.    a
6b50: 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20 29  ssert( nVar>=0 )
6b60: 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78 70 6c  ;.    if( isExpl
6b70: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29  ain && nMem<10 )
6b80: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  {.      p->nMem 
6b90: 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20  = nMem = 10;.   
6ba0: 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d   }.    p->aMem =
6bb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6bc0: 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
6bd0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
6be0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
6bf0: 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20  /* aMem */.     
6c00: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d   + nVar*sizeof(M
6c10: 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20  em)             
6c20: 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20    /* aVar */.   
6c30: 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66     + nArg*sizeof
6c40: 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20  (Mem*)          
6c50: 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a      /* apArg */.
6c60: 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a        + nVar*siz
6c70: 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20 20  eof(char*)      
6c80: 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20         /* azVar 
6c90: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73  */.      + nCurs
6ca0: 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f 72  or*sizeof(Cursor
6cb0: 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20 61 70 43  *) + 1    /* apC
6cc0: 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20  sr */.    );.   
6cd0: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
6ce0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
6cf0: 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20  p->aMem--;      
6d00: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d         /* aMem[]
6d10: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d   goes from 1..nM
6d20: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e  em */.      p->n
6d30: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
6d40: 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20     /*       not 
6d50: 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a  from 0..nMem-1 *
6d60: 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20  /.      p->aVar 
6d70: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b  = &p->aMem[nMem+
6d80: 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61  1];.      p->nVa
6d90: 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20  r = nVar;.      
6da0: 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20  p->okVar = 0;.  
6db0: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28      p->apArg = (
6dc0: 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e  Mem**)&p->aVar[n
6dd0: 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Var];.      p->a
6de0: 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26  zVar = (char**)&
6df0: 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a  p->apArg[nArg];.
6e00: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d        p->apCsr =
6e10: 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61   (Cursor**)&p->a
6e20: 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  zVar[nVar];.    
6e30: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
6e40: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f  Cursor;.      fo
6e50: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
6e60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
6e70: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
6e80: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
6e90: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
6ea0: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = db;.      }.  
6eb0: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
6ec0: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
6ed0: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
6ee0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
6ef0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
6f00: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
6f10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
6f20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
6f30: 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c  UG.  for(n=1; n<
6f40: 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  p->nMem; n++){. 
6f50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
6f60: 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a  em[n].db==db );.
6f70: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d    }.#endif..  p-
6f80: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
6f90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6fa0: 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20   p->uniqueCnt = 
6fb0: 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65  0;.  p->returnDe
6fc0: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72  pth = 0;.  p->er
6fd0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
6fe0: 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  bort;.  p->expla
6ff0: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
7000: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
7010: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
7020: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
7030: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
7040: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
7050: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
7060: 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61  ;.  p->openedSta
7070: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64  tement = 0;.#ifd
7080: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
7090: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
70a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
70b0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
70c0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
70d0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
70e0: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
70f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
7100: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
7110: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
7120: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
7130: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
7140: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
7150: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
7160: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7170: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
7180: 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78   *p, Cursor *pCx
7190: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
71a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
71b0: 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 43   }.  if( pCx->pC
71c0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
71d0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
71e0: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
71f0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  r);.  }.  if( pC
7200: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
7210: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
7220: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23  pCx->pBt);.  }.#
7230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7240: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7250: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
7260: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
7270: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
7280: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
7290: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
72a0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
72b0: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
72c0: 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64  dule = pCx->pMod
72d0: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
72e0: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
72f0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
7300: 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b  afetyOff(p->db);
7310: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
7320: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
7330: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
7340: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e  ite3SafetyOn(p->
7350: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  db);.    p->inVt
7360: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
7370: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  }.#endif.  if( !
7380: 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f  pCx->ephemPseudo
7390: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
73a0: 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70  ite3_free(pCx->p
73b0: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  Data);.  }.  /* 
73c0: 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73  memset(pCx, 0, s
73d0: 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29 3b 20  izeof(Cursor)); 
73e0: 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  */.  /* sqlite3_
73f0: 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29  free(pCx->aType)
7400: 3b 20 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65  ; */.  /* sqlite
7410: 33 5f 66 72 65 65 28 70 43 78 29 3b 20 2a 2f 0a  3_free(pCx); */.
7420: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7430: 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70  ll cursors excep
7440: 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73 6f  t for VTab curso
7450: 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  rs that are curr
7460: 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e  ently.** in use.
7470: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7480: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
7490: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
74a0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
74b0: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
74c0: 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  sr==0 ) return;.
74d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
74e0: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
74f0: 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20     Cursor *pC = 
7500: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
7510: 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d 3e   if( pC && (!p->
7520: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20  inVtabMethod || 
7530: 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  !pC->pVtabCursor
7540: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7550: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
7560: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70  (p, pC);.      p
7570: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
7580: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7590: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
75a0: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
75b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
75c0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
75d0: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
75e0: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
75f0: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
7600: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
7610: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
7620: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
7630: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
7640: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
7650: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
7660: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
7670: 75 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  up(Vdbe *p, int 
7680: 66 72 65 65 62 75 66 66 65 72 73 29 7b 0a 20 20  freebuffers){.  
7690: 69 6e 74 20 69 3b 0a 20 20 63 6c 6f 73 65 41 6c  int i;.  closeAl
76a0: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
76b0: 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20  tiveVtabs(p);.  
76c0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
76d0: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Mem; i++){.    M
76e0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26 70  emSetTypeFlag(&p
76f0: 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e  ->aMem[i], MEM_N
7700: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ull);.  }.  rele
7710: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
7720: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
7730: 2c 20 66 72 65 65 62 75 66 66 65 72 73 29 3b 0a  , freebuffers);.
7740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 66    sqlite3VdbeFif
7750: 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f  oClear(&p->sFifo
7760: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74  );.  if( p->cont
7770: 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  extStack ){.    
7780: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f  for(i=0; i<p->co
7790: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69  ntextStackTop; i
77a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
77b0: 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28  e3VdbeFifoClear(
77c0: 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  &p->contextStack
77d0: 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20  [i].sFifo);.    
77e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
77f0: 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  ee(p->contextSta
7800: 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ck);.  }.  p->co
7810: 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ntextStack = 0;.
7820: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
7830: 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  kDepth = 0;.  p-
7840: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
7850: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
7860: 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29  free(p->zErrMsg)
7870: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
7880: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
7890: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
78a0: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
78b0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
78c0: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
78d0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
78e0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
78f0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
7900: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
7910: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
7920: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
7930: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
7940: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
7950: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
7960: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
7970: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
7980: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
7990: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
79a0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
79b0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
79c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
79d0: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
79e0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
79f0: 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  t n;..  releaseM
7a00: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
7a10: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
7a20: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29  mn*COLNAME_N, 1)
7a30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
7a40: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20  (p->aColName);. 
7a50: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
7a60: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
7a70: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  nResColumn = nRe
7a80: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
7a90: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
7aa0: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
7ab0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d  3DbMallocZero(p-
7ac0: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  >db, sizeof(Mem)
7ad0: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
7ae0: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
7af0: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
7b00: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
7b10: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
7b20: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
7b30: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
7b40: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
7b50: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
7b60: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
7b70: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
7b80: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
7b90: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
7ba0: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
7bb0: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
7bc0: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
7bd0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
7be0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
7bf0: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
7c00: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
7c10: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
7c20: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d  ()..**.** If N==
7c30: 50 34 5f 53 54 41 54 49 43 20 20 69 74 20 6d 65  P4_STATIC  it me
7c40: 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20 69  ans that zName i
7c50: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
7c60: 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69 63   constant static
7c70: 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20 77  .** string and w
7c80: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
7c90: 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66 20  the pointer. If 
7ca0: 69 74 20 69 73 20 50 34 5f 44 59 4e 41 4d 49 43  it is P4_DYNAMIC
7cb0: 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73  , then .** the s
7cc0: 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20 75  tring is freed u
7cd0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
7ce0: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
7cf0: 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 69  e is finished wi
7d00: 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77  th.** it. Otherw
7d10: 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20  ise, N bytes of 
7d20: 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64  zName are copied
7d30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7d40: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56  VdbeSetColName(V
7d50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  dbe *p, int idx,
7d60: 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20   int var, const 
7d70: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
7d80: 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   N){.  int rc;. 
7d90: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
7da0: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
7db0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
7dc0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
7dd0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
7de0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7df0: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
7e00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73  ITE_NOMEM;.  ass
7e10: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
7e20: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
7e30: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
7e40: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
7e50: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28  sColumn]);.  if(
7e60: 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 7c   N==P4_DYNAMIC |
7e70: 7c 20 4e 3d 3d 50 34 5f 53 54 41 54 49 43 20 29  | N==P4_STATIC )
7e80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7e90: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
7ea0: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
7eb0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
7ec0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7ee0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
7ef0: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
7f00: 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c  e, zName, N, SQL
7f10: 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f  ITE_UTF8,SQLITE_
7f20: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
7f30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7f40: 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34 5f 44 59 4e  _OK && N==P4_DYN
7f50: 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c  AMIC ){.    pCol
7f60: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 3d 20 28  Name->flags &= (
7f70: 7e 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20  ~MEM_Static);.  
7f80: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61 6c    pColName->zMal
7f90: 6c 6f 63 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d 3e  loc = pColName->
7fa0: 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  z;.  }.  return 
7fb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
7fc0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
7fd0: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
7fe0: 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
7ff0: 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
8000: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
8010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8020: 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
8030: 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
8040: 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
8050: 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
8060: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
8070: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
8080: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
8090: 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
80a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
80b0: 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
80c0: 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
80d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
80e0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
80f0: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
8100: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
8110: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
8120: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
8130: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
8140: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
8150: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
8160: 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  ;..  /* Before d
8170: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
8180: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
8190: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
81a0: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
81b0: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
81c0: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
81d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
81e0: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
81f0: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
8200: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
8210: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
8220: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
8230: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
8240: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
8250: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
8260: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
8270: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
8280: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
8290: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
82a0: 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20 69  ync(db, rc);.  i
82b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
82d0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
82e0: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
82f0: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
8300: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
8310: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
8320: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
8330: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
8340: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
8350: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
8360: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
8370: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
8380: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
8390: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
83a0: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
83b0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
83c0: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
83d0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
83e0: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
83f0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
8400: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
8410: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
8420: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
8430: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8440: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
8450: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8460: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
8470: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
8480: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
8490: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
84a0: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
84b0: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
84c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
84d0: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
84e0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
84f0: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
8500: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
8510: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
8520: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
8530: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
8540: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
8550: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
8560: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
8570: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
8580: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28  ommitArg);.    (
8590: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
85a0: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
85b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
85c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
85d0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
85e0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
85f0: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
8600: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
8610: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
8620: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
8630: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
8640: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
8650: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
8660: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
8670: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
8680: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
8690: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
86a0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
86b0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
86c0: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
86d0: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
86e0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
86f0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
8700: 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68  :memory:.  In th
8710: 61 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20  at case we do.  
8720: 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  ** not support a
8730: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
8740: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
8750: 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   the simple case
8760: 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a   then.  ** too..
8770: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74    */.  if( 0==st
8780: 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  rlen(sqlite3Btre
8790: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
87a0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c  >aDb[0].pBt)) ||
87b0: 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20   nTrans<=1 ){.  
87c0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
87d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
87e0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
87f0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8800: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8810: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
8820: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8830: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
8840: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
8850: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8860: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
8870: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
8880: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
8890: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
88a0: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
88b0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
88c0: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
88d0: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
88e0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
88f0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
8900: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
8910: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
8920: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
8930: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
8940: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
8950: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
8960: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
8970: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
8980: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
8990: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
89a0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
89b0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
89c0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
89d0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
89e0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
89f0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
8a00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8a10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
8a20: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
8a30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8a40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8a50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8a60: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
8a70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
8a80: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
8a90: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
8aa0: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
8ab0: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
8ac0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
8ad0: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
8ae0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
8af0: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
8b00: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
8b10: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
8b20: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
8b30: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
8b40: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
8b50: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
8b60: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
8b70: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
8b80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
8b90: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
8ba0: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
8bb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
8bc0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
8bd0: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
8be0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
8bf0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
8c00: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
8c10: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
8c20: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
8c30: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  set = 0;..    /*
8c40: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
8c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8c60: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
8c70: 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b       u32 random;
8c80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8c90: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
8cb0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61  omness(sizeof(ra
8cc0: 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b  ndom), &random);
8cd0: 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  .      zMaster =
8ce0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8cf0: 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c  db, "%s-mj%08X",
8d00: 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64   zMainFile, rand
8d10: 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a  om&0x7fffffff);.
8d20: 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
8d30: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  er ){.        re
8d40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8d50: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
8d60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
8d70: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
8d80: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
8d90: 53 53 5f 45 58 49 53 54 53 29 3b 0a 20 20 20 20  SS_EXISTS);.    
8da0: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 31 20 29 3b  }while( rc==1 );
8db0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
8dc0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
8dd0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
8de0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8df0: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
8e00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
8e10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8e20: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
8e30: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
8e40: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
8e50: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
8e60: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
8e70: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
8e80: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8e90: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
8ea0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
8eb0: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
8ec0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
8ed0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8ee0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8ef0: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
8f00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8f10: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
8f20: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
8f30: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
8f40: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
8f50: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
8f60: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
8f70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8f80: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
8f90: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
8fa0: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
8fb0: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
8fc0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8fd0: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
8fe0: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
8ff0: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
9000: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
9010: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9020: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
9030: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
9040: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
9050: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
9060: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
9070: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
9080: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9090: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
90a0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
90b0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
90c0: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
90d0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
90e0: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a   TEMP database *
90f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
9100: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
9110: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
9120: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
9130: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
9140: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
9150: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
9160: 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29  f( zFile[0]==0 )
9170: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
9180: 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64  gnore :memory: d
9190: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
91a0: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
91b0: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
91c0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
91d0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
91e0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
91f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
9210: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
9220: 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c  ile, strlen(zFil
9230: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
9240: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
9250: 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31   strlen(zFile)+1
9260: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9280: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9290: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
92a0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
92b0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
92c0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
92d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
92e0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
92f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
9300: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
9310: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9320: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
9330: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9340: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
9350: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
9360: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
9370: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
9380: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
9390: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46     */.    zMainF
93a0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
93b0: 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d  eeGetDirname(db-
93c0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
93d0: 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20    if( (needSync 
93e0: 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71  .     && (0==(sq
93f0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
9400: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
9410: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
9420: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a  AP_SEQUENTIAL)).
9430: 20 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69       && (rc=sqli
9440: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
9450: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
9460: 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f  ORMAL))!=SQLITE_
9470: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OK) ){.      sql
9480: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
9490: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
94a0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
94b0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
94c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
94d0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
94e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
94f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9500: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
9510: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
9520: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9530: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
9540: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
9550: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9560: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
9570: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
9580: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
9590: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
95a0: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
95b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
95c0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
95d0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
95e0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
95f0: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
9600: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
9610: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
9620: 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
9630: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
9640: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
9650: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9660: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
9670: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
9680: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
9690: 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
96a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
96b0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
96c0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
96d0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
96e0: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
96f0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e  failure occured.
9700: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9710: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
9720: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
9730: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
9740: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
9750: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
9760: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
9770: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9780: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9790: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
97a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
97b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
97c0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
97d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
97e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
97f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
9800: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
9810: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
9820: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
9830: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9840: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
9850: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
9860: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
9870: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
9880: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
9890: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
98a0: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
98b0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
98c0: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
98d0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
98e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
98f0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
9900: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
9910: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
9920: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
9930: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
9940: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9950: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
9960: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
9970: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
9980: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
9990: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
99a0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
99b0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
99c0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
99d0: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
99e0: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
99f0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
9a00: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
9a10: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
9a20: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
9a30: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
9a40: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
9a50: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
9a60: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
9a70: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
9a80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9a90: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
9aa0: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
9ab0: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
9ac0: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
9ad0: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
9ae0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
9af0: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
9b00: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
9b10: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
9b20: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
9b30: 73 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  s();.    for(i=0
9b40: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9b50: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
9b60: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
9b70: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
9b80: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
9b90: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
9ba0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
9bb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9bc0: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
9bd0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
9be0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
9bf0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
9c00: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
9c10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
9c20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
9c30: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
9c40: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
9c50: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
9c60: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
9c70: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
9c80: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
9c90: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
9ca0: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
9cb0: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
9cc0: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
9cd0: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
9ce0: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
9cf0: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
9d00: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
9d10: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
9d20: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
9d30: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
9d40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
9d50: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
9d60: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
9d70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
9d80: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
9d90: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
9da0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
9db0: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
9dc0: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
9dd0: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
9de0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
9df0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
9e00: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
9e10: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
9e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
9e30: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
9e40: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
9e50: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
9e60: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
9e70: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
9e80: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
9e90: 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  /*.** For every 
9ea0: 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61  Btree that in da
9eb0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9ec0: 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68  n db which .** h
9ed0: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
9ee0: 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61  , "trip" or inva
9ef0: 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73  lidate each curs
9f00: 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74  or in.** that Bt
9f10: 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  ree might have b
9f20: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
9f30: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
9f40: 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  ** can never be 
9f50: 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69  used again.  Thi
9f60: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
9f70: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63   rollback.*** oc
9f80: 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74  curs.  We have t
9f90: 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f  o trip all the o
9fa0: 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76  ther cursors, ev
9fb0: 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f  en.** cursor fro
9fc0: 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64  m other VMs in d
9fd0: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
9fe0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a  e connections,.*
9ff0: 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f  * so that none o
a000: 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73  f them try to us
a010: 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68  e the data at wh
a020: 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65  ich they.** were
a030: 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68   pointing and wh
a040: 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65  ich now may have
a050: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75   been changed du
a060: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c  e.** to the roll
a070: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65  back..**.** Reme
a080: 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c  mber that a roll
a090: 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20  back can delete 
a0a0: 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20  tables complete 
a0b0: 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72  and.** reorder r
a0c0: 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74  ootpages.  So it
a0d0: 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
a0e0: 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a  nt just to save.
a0f0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ** the state of 
a100: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20  the cursor.  We 
a110: 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61  have to invalida
a120: 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  te the cursor.**
a130: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
a140: 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e  ever used again.
a150: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a160: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
a170: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
a180: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
a190: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a1a0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
a1b0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
a1c0: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
a1d0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26  Bt;.    if( p &&
a1e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
a1f0: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
a200: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
a210: 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
a220: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a   SQLITE_ABORT);.
a230: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
a240: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a250: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
a260: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
a270: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
a280: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
a290: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
a2a0: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
a2b0: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
a2c0: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
a2d0: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
a2e0: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
a2f0: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
a300: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
a310: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
a320: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
a330: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
a340: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
a350: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
a360: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
a370: 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
a380: 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
a390: 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
a3a0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
a3b0: 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
a3c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
a3d0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
a3e0: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
a3f0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
a400: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
a410: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
a420: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
a430: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
a440: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
a450: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
a460: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
a470: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
a480: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
a490: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
a4a0: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  lt(Vdbe *p){.  s
a4b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
a4c0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
a4d0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65  nt (*xFunc)(Btre
a4e0: 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a  e *pBt) = 0;  /*
a4f0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
a500: 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20  l on each btree 
a510: 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  backend */.  int
a520: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
a530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a540: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51  et to true if SQ
a550: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f  LITE_NOMEM or IO
a560: 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ERR */..  /* Thi
a570: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
a580: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
a590: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
a5a0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
a5b0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
a5c0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
a5d0: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
a5e0: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
a5f0: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
a600: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
a610: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
a620: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
a630: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
a640: 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
a650: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
a660: 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
a670: 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
a680: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
a690: 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
a6a0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
a6b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
a6c0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
a6d0: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
a6e0: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
a6f0: 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
a700: 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
a710: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
a720: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
a730: 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
a740: 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
a750: 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
a760: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
a770: 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
a780: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
a790: 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
a7a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a7b0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a7c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
a7d0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
a7e0: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
a7f0: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
a800: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
a810: 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
a820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
a830: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
a840: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
a850: 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
a860: 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
a870: 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
a880: 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  r started */.  i
a890: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
a8a0: 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
a8b0: 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
a8c0: 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
a8d0: 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
a8e0: 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
a8f0: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
a900: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
a910: 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  reeMutexArrayEnt
a920: 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  er(&p->aMutex);.
a930: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
a940: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
a950: 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
a960: 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
a970: 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
a980: 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
a990: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
a9a0: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
a9b0: 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
a9c0: 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
a9d0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a9e0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
a9f0: 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
aa00: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
aa10: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f        /* This lo
aa20: 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63 20 61  op does static a
aa30: 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 71  nalysis of the q
aa40: 75 65 72 79 20 74 6f 20 73 65 65 20 77 68 69 63  uery to see whic
aa50: 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  h of the.      *
aa60: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  * following thre
aa70: 65 20 63 61 74 65 67 6f 72 69 65 73 20 69 74 20  e categories it 
aa80: 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20  falls into:.    
aa90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
aaa0: 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20    Read-only.    
aab0: 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77    **     Query w
aac0: 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  ith statement jo
aad0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20  urnal.      **  
aae0: 20 20 20 51 75 65 72 79 20 77 69 74 68 6f 75 74     Query without
aaf0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ab00: 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  al.      **.    
ab10: 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f    ** We could do
ab20: 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20   something more 
ab30: 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68 69  elegant than thi
ab40: 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  s static analysi
ab50: 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a  s (i.e..      **
ab60: 20 73 74 6f 72 65 20 74 68 65 20 74 79 70 65 20   store the type 
ab70: 6f 66 20 71 75 65 72 79 20 61 73 20 70 61 72 74  of query as part
ab80: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61 74   of the compliat
ab90: 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74 20  ion phase), but 
aba0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69  .      ** handli
abb0: 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49  ng malloc() or I
abc0: 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61 20 66  O failure is a f
abd0: 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 65 64  airly obscure ed
abe0: 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20 20 20  ge case so .    
abf0: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 72 6f    ** this is pro
ac00: 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20 54 6f  bably easier. To
ac10: 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61 6e 20  do: Might be an 
ac20: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
ac30: 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  educe .      ** 
ac40: 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65 72 79  code size a very
ac50: 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68   small amount th
ac60: 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  ough....      */
ac70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74 52 65  .      int notRe
ac80: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
ac90: 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65 6e    int isStatemen
aca0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  t = 0;.      ass
acb0: 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d  ert(p->aOp || p-
acc0: 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20  >nOp==0);.      
acd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
ace0: 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  p; i++){ .      
acf0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f 70    switch( p->aOp
ad00: 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  [i].opcode ){.  
ad10: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
ad20: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20  Transaction:.   
ad30: 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61 64           notRead
ad40: 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69  Only |= p->aOp[i
ad50: 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ].p2;.          
ad60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ad70: 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61 74 65     case OP_State
ad80: 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ment:.          
ad90: 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20    isStatement = 
ada0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
adb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
adc0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20        }..   .   
add0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
ade0: 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
adf0: 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20  , we need do no 
ae00: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e  rollback at all.
ae10: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
ae20: 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74    ** proceed wit
ae30: 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61  h the special ha
ae40: 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  ndling..      */
ae50: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74 52 65  .      if( notRe
ae60: 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
ae70: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
ae80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
ae90: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc==SQLITE_IOE
aea0: 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20 69 73  RR_BLOCKED && is
aeb0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
aec0: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
aed0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
aee0: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  ackStmt;.       
aef0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
af00: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
af10: 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72 63 3d  } else if( (mrc=
af20: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
af30: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
af40: 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d 65 6e  L) && isStatemen
af50: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  t ){.          x
af60: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
af70: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b  reeRollbackStmt;
af80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
af90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
afa0: 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
afb0: 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
afc0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
afd0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
afe0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
aff0: 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
b000: 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
b010: 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
b020: 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
b030: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b040: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
b050: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
b060: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
b070: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
b080: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
b090: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
b0a0: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
b0b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b0c0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b0d0: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
b0e0: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
b0f0: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
b100: 63 74 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e  ctive vdbe, then
b110: 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69  .    ** we do ei
b120: 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
b130: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
b140: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
b150: 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
b160: 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
b170: 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
b180: 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
b190: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
b1a0: 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
b1b0: 76 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20  ve has occured. 
b1c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b1d0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26  db->autoCommit &
b1e0: 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  & db->activeVdbe
b1f0: 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Cnt==1 ){.      
b200: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b210: 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
b220: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
b230: 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
b240: 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
b250: 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
b260: 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
b270: 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72   and the vdbe pr
b280: 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20  ogram was .     
b290: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
b2a0: 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
b2b0: 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e  AIL' constraint.
b2c0: 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
b2d0: 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  mmit .        **
b2e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
b2f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b300: 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f   int rc = vdbeCo
b310: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  mmit(db);.      
b320: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b330: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
b340: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
b350: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
b360: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
b370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b380: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
b390: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
b3a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b3b0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
b3c0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
b3d0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
b3e0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  db);.        }el
b3f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
b400: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
b410: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
b420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b440: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
b450: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
b460: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46     }else if( !xF
b470: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  unc ){.      if(
b480: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b490: 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
b4a0: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
b4b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
b4c0: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29  penedStatement )
b4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b4e0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b4f0: 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20  CommitStmt;.    
b500: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
b510: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
b520: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
b530: 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63  ){.        xFunc
b540: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
b550: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
b560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b570: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
b580: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
b590: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
b5a0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
b5b0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
b5c0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
b5d0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b5e0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
b5f0: 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  xFunc is not NUL
b600: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e  L, then it is on
b610: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
b620: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72  eRollbackStmt or
b630: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
b640: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20  treeCommitStmt. 
b650: 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20  Call it once on 
b660: 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66  each backend. If
b670: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b680: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
b690: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
b6a0: 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  till SQLITE_OK, 
b6b0: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
b6c0: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ode to the new. 
b6d0: 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75     ** error valu
b6e0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
b6f0: 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20  sert(!xFunc ||. 
b700: 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69       xFunc==sqli
b710: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
b720: 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e  mt ||.      xFun
b730: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52  c==sqlite3BtreeR
b740: 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20  ollbackStmt.    
b750: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
b760: 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e  xFunc && i<db->n
b770: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
b780: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42   int rc;.      B
b790: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
b7a0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
b7b0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
b7c0: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28       rc = xFunc(
b7d0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
b7e0: 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d  ( rc && (p->rc==
b7f0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
b800: 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
b810: 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20  RAINT) ){.      
b820: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b830: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b840: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
b850: 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
b860: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b870: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
b880: 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
b890: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
b8a0: 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 73 74  ELETE and the st
b8b0: 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d  atement was comm
b8c0: 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  itted, .    ** s
b8d0: 65 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  et the change co
b8e0: 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
b8f0: 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
b900: 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d  CntOn && p->pc>=
b910: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
b920: 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d  xFunc || xFunc==
b930: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
b940: 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  itStmt ){.      
b950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b960: 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
b970: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
b980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b990: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
b9a0: 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
b9b0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
b9c0: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
b9d0: 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61    .    /* Rollba
b9e0: 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79  ck or commit any
b9f0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
ba00: 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a  that occurred. *
ba10: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21  /.    if( p->rc!
ba20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62  =SQLITE_OK && db
ba30: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
ba40: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
ba50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
ba60: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
ba70: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  (db, 0);.      d
ba80: 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e  b->flags = (db->
ba90: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49  flags | SQLITE_I
baa0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20  nternChanges);. 
bab0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
bac0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
bad0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
bae0: 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76  eeMutexArrayLeav
baf0: 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20  e(&p->aMutex);. 
bb00: 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
bb10: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
bb20: 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
bb30: 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
bb40: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
bb50: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
bb60: 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
bb70: 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70  beCnt--;.  }.  p
bb80: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
bb90: 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
bba0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
bbb0: 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  db);.  if( p->db
bbc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bbd0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
bbe0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
bbf0: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
bc00: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74  eCnt(db);..  ret
bc10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bc20: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
bc30: 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
bc40: 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
bc50: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
bc60: 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
bc70: 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
bc80: 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
bc90: 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
bca0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
bcb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
bcc0: 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
bcd0: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
bce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bcf0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
bd00: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
bd10: 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
bd20: 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
bd30: 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
bd40: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
bd50: 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
bd60: 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
bd70: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
bd80: 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
bd90: 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
bda0: 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
bdb0: 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
bdc0: 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
bdd0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
bde0: 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
bdf0: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
be00: 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
be10: 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
be20: 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
be30: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
be40: 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
be50: 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
be60: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
be70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
be80: 52 65 73 65 74 28 56 64 62 65 20 2a 70 2c 20 69  Reset(Vdbe *p, i
be90: 6e 74 20 66 72 65 65 62 75 66 66 65 72 73 29 7b  nt freebuffers){
bea0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
beb0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
bec0: 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
bed0: 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
bee0: 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
bef0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
bf00: 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
bf10: 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
bf20: 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
bf30: 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
bf40: 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
bf50: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
bf60: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
bf70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
bf80: 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64 29 73  lt(p);.  (void)s
bf90: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
bfa0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
bfb0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
bfc0: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
bfd0: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
bfe0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
bff0: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
c000: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
c010: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
c020: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
c030: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
c040: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
c050: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
c060: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
c070: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
c080: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
c090: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
c0a0: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
c0b0: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
c0c0: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
c0d0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
c0e0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
c0f0: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
c100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
c110: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
c120: 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
c130: 53 51 4c 49 54 45 5f 55 54 46 38 2c 73 71 6c 69  SQLITE_UTF8,sqli
c140: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20  te3_free);.     
c150: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
c160: 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ->rc;.      p->z
c170: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
c180: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
c190: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c1a0: 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
c1b0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
c1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c1d0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
c1e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
c1f0: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
c200: 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
c210: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
c220: 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
c230: 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
c240: 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
c250: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
c260: 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
c270: 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
c280: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
c290: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
c2a0: 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
c2b0: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
c2c0: 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
c2d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
c2e0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
c2f0: 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >rc, 0);.    sql
c300: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
c310: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
c320: 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
c330: 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
c340: 72 65 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  ree);.    p->zEr
c350: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
c360: 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
c370: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
c380: 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
c390: 6c 65 61 6e 75 70 28 70 2c 20 66 72 65 65 62 75  leanup(p, freebu
c3a0: 66 66 65 72 73 29 3b 0a 0a 20 20 2f 2a 20 53 61  ffers);..  /* Sa
c3b0: 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
c3c0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
c3d0: 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
c3e0: 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
c3f0: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
c400: 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
c410: 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
c420: 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
c430: 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
c440: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
c450: 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
c460: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
c470: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
c480: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
c490: 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
c4a0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
c4b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c4c0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
c4d0: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
c4e0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
c4f0: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
c500: 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
c510: 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
c520: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
c530: 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
c540: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
c550: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
c560: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
c570: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
c580: 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
c590: 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
c5a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c5b0: 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
c5c0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
c5d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
c5e0: 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
c5f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
c600: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
c610: 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62  IC_INIT;.  p->ab
c620: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72 65 74  orted = 0;.  ret
c630: 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
c640: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
c650: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
c660: 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
c670: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
c680: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
c690: 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
c6a0: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
c6b0: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
c6c0: 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
c6d0: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
c6e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
c6f0: 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
c700: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c710: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
c720: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
c730: 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
c740: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
c750: 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
c760: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
c770: 28 70 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  (p, 1);.    asse
c780: 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
c790: 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
c7a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
c7b0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
c7c0: 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65  C_INIT ){.    re
c7d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
c7e0: 53 45 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  SE;.  }.  releas
c7f0: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
c800: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20  em[1], p->nMem, 
c810: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
c820: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
c830: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c840: 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
c850: 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
c860: 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
c870: 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
c880: 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
c890: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
c8a0: 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
c8b0: 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
c8c0: 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
c8d0: 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
c8e0: 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
c8f0: 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
c900: 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
c910: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
c920: 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
c930: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
c940: 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
c950: 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
c960: 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
c970: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
c980: 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
c990: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
c9a0: 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
c9b0: 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
c9c0: 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
c9d0: 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31  >31 || !(mask&(1
c9e0: 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
c9f0: 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
ca00: 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
ca10: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
ca20: 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
ca30: 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
ca40: 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
ca50: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
ca60: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
ca70: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
ca80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
ca90: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
caa0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
cab0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
cac0: 20 20 43 6c 65 61 6e 75 70 28 70 2c 20 31 29 3b    Cleanup(p, 1);
cad0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
cae0: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
caf0: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
cb00: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
cb10: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70  assert( p->db->p
cb20: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Vdbe==p );.    p
cb30: 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d  ->db->pVdbe = p-
cb40: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
cb50: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
cb60: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
cb70: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
cb80: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29  }.  if( p->aOp )
cb90: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  {.    Op *pOp = 
cba0: 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p->aOp;.    for(
cbb0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
cbc0: 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
cbd0: 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34    freeP4(pOp->p4
cbe0: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
cbf0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
cc00: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
cc10: 74 65 33 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43  te3_free(pOp->zC
cc20: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
cc30: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73      .    }.    s
cc40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
cc50: 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  Op);.  }.  relea
cc60: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
cc70: 61 72 2c 20 70 2d 3e 6e 56 61 72 2c 20 31 29 3b  ar, p->nVar, 1);
cc80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
cc90: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 69 66  p->aLabel);.  if
cca0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
ccb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 26 70   sqlite3_free(&p
ccc0: 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20 7d 0a  ->aMem[1]);.  }.
ccd0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
cce0: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
ccf0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
cd00: 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20 20 73 71  NAME_N, 1);.  sq
cd10: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43  lite3_free(p->aC
cd20: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
cd30: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29  e3_free(p->zSql)
cd40: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
cd50: 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
cd60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cd70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  );.}../*.** If a
cd80: 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
cd90: 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
cda0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
cdb0: 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
cdc0: 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52  * MoveTo now.  R
cdd0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
cde0: 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65  ode.  If no Move
cdf0: 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74  To is pending, t
ce00: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  his.** routine d
ce10: 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20  oes nothing and 
ce20: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
ce30: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
ce40: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
ce50: 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  o(Cursor *p){.  
ce60: 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
ce70: 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
ce80: 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
ce90: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
cea0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
ceb0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
cec0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
ced0: 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
cee0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
cef0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
cf00: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c  ->pCursor, 0, 0,
cf10: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
cf20: 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
cf30: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
cf40: 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63  rc;.    *p->pInc
cf50: 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rKey = 0;.    p-
cf60: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79  >lastRowid = key
cf70: 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54  ToInt(p->movetoT
cf80: 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72  arget);.    p->r
cf90: 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65  owidIsValid = re
cfa0: 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65  s==0;.    if( re
cfb0: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  s<0 ){.      rc 
cfc0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
cfd0: 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  xt(p->pCursor, &
cfe0: 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
cff0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d000: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
d010: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
d020: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
d030: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
d040: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
d050: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
d060: 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
d070: 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72  E_STALE;.  }.  r
d080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
d0a0: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
d0b0: 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
d0c0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
d0d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d0e0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
d0f0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
d100: 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c  ialRead().** sql
d110: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
d120: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
d130: 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a  beSerialWrite().
d140: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
d150: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
d160: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
d170: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
d180: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
d190: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
d1a0: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
d1b0: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
d1c0: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
d1d0: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
d1e0: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
d1f0: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
d200: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
d210: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
d220: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
d230: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
d240: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
d250: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
d260: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
d270: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
d280: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
d290: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
d2a0: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
d2b0: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
d2c0: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
d2d0: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
d2e0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
d2f0: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
d300: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
d310: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
d320: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
d330: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
d340: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
d350: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
d360: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
d370: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
d380: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
d390: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
d3a0: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
d3b0: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
d3c0: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
d3d0: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
d3e0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
d3f0: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
d400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
d410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
d420: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d430: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
d460: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
d490: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
d4a0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
d4b0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
d4c0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
d4d0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
d500: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d510: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
d530: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
d540: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
d550: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
d560: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
d570: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
d580: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
d5b0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
d5c0: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
d5e0: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
d5f0: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
d620: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
d630: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
d660: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
d670: 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
d6a0: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
d6b0: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
d6c0: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
d6d0: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
d6e0: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
d6f0: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
d700: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
d710: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
d720: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
d730: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
d740: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
d750: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
d760: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
d770: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
d780: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
d790: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
d7a0: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
d7b0: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
d7c0: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
d7d0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
d7e0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
d7f0: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
d800: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
d810: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
d820: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
d830: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
d840: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
d850: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
d860: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
d870: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
d880: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
d890: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
d8a0: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
d8b0: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
d8c0: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
d8d0: 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  1000)<<32)-1).  
d8e0: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
d8f0: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
d900: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
d910: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
d920: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
d930: 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20  rn 8+i;.    }.  
d940: 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a    u = i<0 ? -i :
d950: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
d960: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
d970: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
d980: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
d990: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
d9a0: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
d9b0: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
d9c0: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
d9d0: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
d9e0: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
d9f0: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
da00: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
da10: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
da20: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
da30: 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53  rt( flags&(MEM_S
da40: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
da50: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
da60: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
da70: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
da80: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d  = pMem->u.i;.  }
da90: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
daa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
dab0: 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
dac0: 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
dad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
dae0: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
daf0: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
db00: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
db10: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
db20: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
db30: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
db40: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
db50: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
db60: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
db70: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
db80: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
db90: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
dba0: 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
dbb0: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
dbc0: 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
dbd0: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
dbe0: 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
dbf0: 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
dc00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
dc10: 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
dc20: 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
dc30: 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
dc40: 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
dc50: 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
dc60: 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
dc70: 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
dc80: 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
dc90: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
dca0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
dcb0: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
dcc0: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
dcd0: 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
dce0: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
dcf0: 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
dd00: 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
dd10: 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
dd20: 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
dd30: 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
dd40: 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
dd50: 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
dd60: 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
dd70: 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
dd80: 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
dd90: 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
dda0: 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
ddb0: 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
ddc0: 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
ddd0: 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
dde0: 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
ddf0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
de00: 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
de10: 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
de20: 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
de30: 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
de40: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
de50: 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
de60: 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
de70: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
de80: 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
de90: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
dea0: 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
deb0: 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
dec0: 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
ded0: 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
dee0: 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
def0: 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
df00: 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
df10: 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
df20: 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
df30: 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
df40: 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
df50: 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
df60: 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
df70: 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
df80: 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
df90: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
dfa0: 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
dfb0: 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
dfc0: 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
dfd0: 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
dfe0: 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
dff0: 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
e000: 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
e010: 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
e020: 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
e030: 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
e040: 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
e050: 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
e060: 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
e070: 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
e080: 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
e090: 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
e0a0: 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
e0b0: 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
e0c0: 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
e0d0: 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
e0e0: 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
e0f0: 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
e100: 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
e110: 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
e120: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
e130: 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
e140: 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
e150: 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
e160: 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
e170: 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
e180: 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
e190: 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
e1a0: 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
e1b0: 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
e1c0: 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
e1d0: 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
e1e0: 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
e1f0: 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
e200: 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
e210: 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
e220: 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
e230: 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
e240: 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
e250: 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
e260: 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
e270: 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
e280: 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
e290: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
e2a0: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
e2b0: 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
e2c0: 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
e2d0: 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
e2e0: 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
e2f0: 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
e300: 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
e310: 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
e320: 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
e330: 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
e340: 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
e350: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
e360: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
e370: 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
e380: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
e390: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
e3a0: 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
e3b0: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
e3c0: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
e3d0: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
e3e0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
e3f0: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
e400: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
e410: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
e420: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
e430: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
e440: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
e450: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
e460: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
e470: 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
e480: 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
e490: 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
e4a0: 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
e4b0: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
e4c0: 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
e4d0: 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
e4e0: 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
e4f0: 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
e500: 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
e510: 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
e520: 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
e530: 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
e540: 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
e550: 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
e560: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
e570: 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
e580: 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
e590: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
e5a0: 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
e5b0: 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
e5c0: 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
e5d0: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
e5e0: 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
e5f0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
e600: 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
e610: 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
e620: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
e630: 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
e640: 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
e650: 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
e660: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
e670: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
e680: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
e690: 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
e6a0: 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
e6b0: 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
e6c0: 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
e6d0: 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
e6e0: 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
e6f0: 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
e700: 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
e710: 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  []..*/ .int sqli
e720: 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
e730: 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
e740: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
e750: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
e760: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
e770: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
e780: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
e790: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
e7a0: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
e7b0: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
e7c0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
e7d0: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
e7e0: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
e7f0: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
e800: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
e810: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
e820: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e830: 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
e840: 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
e850: 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
e860: 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
e870: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
e880: 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
e890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e8a0: 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
e8b0: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
e8c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
e8d0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
e8e0: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
e8f0: 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20  sert( len<=nBuf 
e900: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
e910: 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
e920: 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20  ] = (v&0xFF);.  
e930: 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
e940: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
e950: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
e960: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
e970: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e980: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
e990: 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
e9a0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
e9b0: 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
e9c0: 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  i:0).           
e9d0: 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65    == sqlite3Vdbe
e9e0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
e9f0: 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
ea00: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
ea10: 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
ea20: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
ea30: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
ea40: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
ea50: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
ea60: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
ea70: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
ea80: 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28  ->u.i;.      if(
ea90: 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20   len>nBuf ){.   
eaa0: 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b       len = nBuf;
eab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
eac0: 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
ead0: 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
eae0: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
eaf0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
eb00: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
eb10: 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
eb20: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
eb30: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
eb40: 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
eb50: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
eb60: 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
eb70: 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
eb80: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
eb90: 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
eba0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
ebb0: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
ebc0: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
ebd0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
ebe0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
ebf0: 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
ec00: 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
ec10: 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
ec20: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
ec30: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
ec40: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
ec50: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
ec60: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
ec90: 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
eca0: 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
ecb0: 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
ecc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
ecd0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
ece0: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
ecf0: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
ed00: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
ed10: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
ed20: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
ed30: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
ed40: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
ed50: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
ed60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ed70: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
ed80: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
ed90: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
eda0: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
edb0: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
edc0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
edd0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
ede0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
edf0: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
ee00: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
ee10: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
ee20: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
ee30: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
ee40: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
ee50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ee60: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
ee70: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
ee80: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
ee90: 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
eea0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
eeb0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
eec0: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
eed0: 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
eee0: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
eef0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ef00: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
ef10: 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
ef20: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
ef30: 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
ef40: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
ef50: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
ef60: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
ef70: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
ef80: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
ef90: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
efa0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
efb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
efc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
efd0: 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
efe0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
eff0: 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
f000: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
f010: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
f020: 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
f030: 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
f040: 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
f050: 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
f060: 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
f070: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
f080: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
f090: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
f0a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f0b0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f0c0: 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
f0d0: 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
f0e0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f0f0: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
f100: 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
f110: 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
f120: 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
f130: 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
f140: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
f150: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f160: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
f170: 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
f180: 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
f190: 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
f1a0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
f1b0: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
f1c0: 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
f1d0: 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
f1e0: 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
f1f0: 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
f200: 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
f210: 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
f220: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
f230: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
f240: 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
f250: 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
f260: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f270: 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
f280: 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
f290: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
f2a0: 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
f2b0: 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
f2c0: 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
f2d0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
f2e0: 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
f2f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
f300: 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
f310: 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
f320: 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
f330: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
f340: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
f350: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
f360: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
f370: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
f380: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
f390: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
f3a0: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
f3b0: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
f3c0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
f3d0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
f3e0: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
f3f0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
f400: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
f410: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f420: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
f430: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
f440: 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
f450: 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
f460: 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
f470: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
f480: 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
f490: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
f4a0: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
f4b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
f4c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65  ->flags = MEM_Re
f4d0: 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
f4e0: 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
f4f0: 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
f500: 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
f510: 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
f520: 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
f530: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f540: 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
f550: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f560: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
f570: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f580: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
f590: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e   {.      int len
f5a0: 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
f5b0: 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
f5c0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
f5d0: 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
f5e0: 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
f5f0: 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
f600: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
f610: 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20  type&0x01 ){.   
f620: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f630: 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d   = MEM_Str | MEM
f640: 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65  _Ephem;.      }e
f650: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
f660: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
f670: 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  lob | MEM_Ephem;
f680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f690: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
f6a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f6b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65  .}../*.** The he
f6c0: 61 64 65 72 20 6f 66 20 61 20 72 65 63 6f 72 64  ader of a record
f6d0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
f6e0: 65 71 75 65 6e 63 65 20 76 61 72 69 61 62 6c 65  equence variable
f6f0: 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73  -length integers
f700: 2e 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67  ..** These integ
f710: 65 72 73 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  ers are almost a
f720: 6c 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20  lways small and 
f730: 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61  are encoded as a
f740: 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a   single byte..**
f750: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
f760: 61 63 72 6f 20 74 61 6b 65 73 20 61 64 76 61 6e  acro takes advan
f770: 74 61 67 65 20 74 68 69 73 20 66 61 63 74 20 74  tage this fact t
f780: 6f 20 70 72 6f 76 69 64 65 20 61 20 66 61 73 74  o provide a fast
f790: 20 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68   decode.** of th
f7a0: 65 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20  e integers in a 
f7b0: 72 65 63 6f 72 64 20 68 65 61 64 65 72 2e 20 20  record header.  
f7c0: 49 74 20 69 73 20 66 61 73 74 65 72 20 66 6f 72  It is faster for
f7d0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
f7e0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 69 6e  .** where the in
f7f0: 74 65 67 65 72 20 69 73 20 61 20 73 69 6e 67 6c  teger is a singl
f800: 65 20 62 79 74 65 2e 20 20 49 74 20 69 73 20 61  e byte.  It is a
f810: 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 20 77   little slower w
f820: 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67  hen the.** integ
f830: 65 72 20 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72  er is two or mor
f840: 65 20 62 79 74 65 73 2e 20 20 42 75 74 20 6f 76  e bytes.  But ov
f850: 65 72 61 6c 6c 20 69 74 20 69 73 20 66 61 73 74  erall it is fast
f860: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  er..**.** The fo
f870: 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
f880: 6f 6e 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ons are equivale
f890: 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20  nt:.**.**     x 
f8a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
f8b0: 6e 74 33 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a  nt32( A, &B );.*
f8c0: 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47 65 74  *.**     x = Get
f8d0: 56 61 72 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a  Varint( A, B );.
f8e0: 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65  **.*/.#define Ge
f8f0: 74 56 61 72 69 6e 74 28 41 2c 42 29 20 20 28 28  tVarint(A,B)  ((
f900: 42 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37 66 20  B = *(A))<=0x7f 
f910: 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 47 65 74  ? 1 : sqlite3Get
f920: 56 61 72 69 6e 74 33 32 28 41 2c 20 26 42 29 29  Varint32(A, &B))
f930: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
f940: 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
f950: 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
f960: 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
f970: 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
f980: 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
f990: 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
f9a0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
f9b0: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
f9c0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
f9d0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
f9e0: 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
f9f0: 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
fa00: 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
fa10: 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
fa20: 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
fa30: 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
fa40: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
fa50: 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
fa60: 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
fa70: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
fa80: 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
fa90: 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
faa0: 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
fab0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
fac0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
fad0: 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
fae0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
faf0: 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
fb00: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
fb10: 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
fb20: 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
fb30: 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
fb40: 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
fb50: 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
fb60: 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
fb70: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
fb80: 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
fb90: 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
fba0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
fbb0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
fbc0: 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
fbd0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
fbe0: 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
fbf0: 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
fc00: 0a 20 20 76 6f 69 64 20 2a 70 53 70 61 63 65 2c  .  void *pSpace,
fc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
fc20: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ce available to 
fc30: 68 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20 6f  hold resulting o
fc40: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73  bject */.  int s
fc50: 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20 20  zSpace          
fc60: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
fc70: 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
fc80: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
fc90: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
fca0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
fcb0: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
fcc0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
fcd0: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65   *p;.  int nByte
fce0: 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 78 2c 20  ;.  int i, idx, 
fcf0: 64 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  d;.  u32 szHdr;.
fd00: 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 0a    Mem *pMem;.  .
fd10: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
fd20: 28 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a 70 29  (Mem)>sizeof(*p)
fd30: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   );.  nByte = si
fd40: 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
fd50: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29 3b 0a  nfo->nField+2);.
fd60: 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
fd70: 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  ace ){.    p = s
fd80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
fd90: 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
fda0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
fdb0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
fdc0: 0a 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65  .    p->needFree
fdd0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
fde0: 20 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20     p = pSpace;. 
fdf0: 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 3d     p->needFree =
fe00: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65   0;.  }.  p->pKe
fe10: 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
fe20: 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
fe30: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
fe40: 20 2b 20 31 3b 0a 20 20 70 2d 3e 6e 65 65 64 44   + 1;.  p->needD
fe50: 65 73 74 72 6f 79 20 3d 20 31 3b 0a 20 20 70 2d  estroy = 1;.  p-
fe60: 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 26  >aMem = pMem = &
fe70: 28 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b 0a 20 20  ((Mem*)p)[1];.  
fe80: 69 64 78 20 3d 20 47 65 74 56 61 72 69 6e 74 28  idx = GetVarint(
fe90: 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
fea0: 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 69 20 3d  d = szHdr;.  i =
feb0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
fec0: 3c 73 7a 48 64 72 20 26 26 20 69 3c 70 2d 3e 6e  <szHdr && i<p->n
fed0: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
fee0: 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
fef0: 20 20 20 69 64 78 20 2b 3d 20 47 65 74 56 61 72     idx += GetVar
ff00: 69 6e 74 28 20 61 4b 65 79 2b 69 64 78 2c 20 73  int( aKey+idx, s
ff10: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
ff20: 20 69 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20   if( d>=nKey && 
ff30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ff40: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
ff50: 74 79 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b  type)>0 ) break;
ff60: 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
ff70: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
ff80: 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
ff90: 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
ffa0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
ffb0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  ;.    pMem->zMal
ffc0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
ffd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
ffe0: 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
fff0: 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
10000 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
10010 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
10020 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 3b 0a 20  p->nField = i;. 
10030 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
10040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
10050 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73  routine destroys
10060 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72   a UnpackedRecor
10070 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  d object.*/.void
10080 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
10090 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
100a0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
100b0 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
100c0 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 44      if( p->needD
100d0 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
100e0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 4d 65 6d  int i;.      Mem
100f0 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 66 6f   *pMem;.      fo
10100 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61  r(i=0, pMem=p->a
10110 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64  Mem; i<p->nField
10120 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a  ; i++, pMem++){.
10130 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
10140 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
10150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10160 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
10170 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  m);.        }.  
10180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10190 69 66 28 20 70 2d 3e 6e 65 65 64 46 72 65 65 20  if( p->needFree 
101a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
101b0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a  _free(p);.    }.
101c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
101d0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
101e0 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
101f0 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
10200 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
10210 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
10220 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
10230 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
10240 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
10250 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
10260 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31  nteger if {nKey1
10270 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73  , pKey1} is less
10280 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
10290 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
102a0 68 61 6e 20 70 50 4b 65 79 32 2e 20 20 54 68 65  han pPKey2.  The
102b0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
102c0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
102d0 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
102e0 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   th OP_MakeRecor
102f0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
10300 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
10310 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
10320 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
10330 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
10340 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
10350 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
10360 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
10370 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
10380 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
10390 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
103a0 6c 64 73 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  lds..** But if t
103b0 68 65 20 6c 65 6e 67 74 68 73 20 64 69 66 66 65  he lengths diffe
103c0 72 2c 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20  r, Key2 must be 
103d0 74 68 65 20 73 68 6f 72 74 65 72 20 6f 66 20 74  the shorter of t
103e0 68 65 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 48 69  he two..**.** Hi
103f0 73 74 6f 72 69 63 61 6c 20 6e 6f 74 65 3a 20 49  storical note: I
10400 6e 20 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f  n earlier versio
10410 6e 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ns of this routi
10420 6e 65 20 62 6f 74 68 20 4b 65 79 31 0a 2a 2a 20  ne both Key1.** 
10430 61 6e 64 20 4b 65 79 32 20 77 65 72 65 20 62 6c  and Key2 were bl
10440 6f 62 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  obs obtained fro
10450 6d 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  m OP_MakeRecord.
10460 20 20 42 75 74 20 77 65 20 66 6f 75 6e 64 0a 2a    But we found.*
10470 2a 20 74 68 61 74 20 69 6e 20 74 79 70 69 63 61  * that in typica
10480 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 4b  l use the same K
10490 65 79 32 20 77 6f 75 6c 64 20 62 65 20 73 75 62  ey2 would be sub
104a0 6d 69 74 74 65 64 20 6d 75 6c 74 69 70 6c 65 20  mitted multiple 
104b0 74 69 6d 65 73 0a 2a 2a 20 69 6e 20 61 20 72 6f  times.** in a ro
104c0 77 2e 20 20 53 6f 20 61 6e 20 6f 70 74 69 6d 69  w.  So an optimi
104d0 7a 61 74 69 6f 6e 20 77 61 73 20 61 64 64 65 64  zation was added
104e0 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 4b 65   to parse the Ke
104f0 79 32 20 6b 65 79 0a 2a 2a 20 73 65 70 61 72 61  y2 key.** separa
10500 74 65 6c 79 20 61 6e 64 20 73 75 62 6d 69 74 20  tely and submit 
10510 74 68 65 20 70 61 72 73 65 64 20 76 65 72 73 69  the parsed versi
10520 6f 6e 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  on.  In this way
10530 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 70 61  , we avoid.** pa
10540 72 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 4b  rsing the same K
10550 65 79 32 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ey2 multiple tim
10560 65 73 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2f 0a  es in a row..*/.
10570 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
10580 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
10590 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
105a0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
105b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
105c0 2a 70 50 4b 65 79 32 0a 29 7b 0a 20 20 75 33 32  *pPKey2.){.  u32
105d0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
105e0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
105f0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
10600 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
10610 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
10620 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
10630 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
10640 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
10650 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
10660 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10670 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
10680 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
10690 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
106a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
106b0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
106c0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
106d0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
106e0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
106f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
10700 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
10710 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
10720 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
10730 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
10740 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
10750 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
10760 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67  >db;.  mem1.flag
10770 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d  s = 0;.  mem1.zM
10780 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20  alloc = 0;.  .  
10790 69 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e 74  idx1 = GetVarint
107a0 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
107b0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
107c0 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
107d0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77  nfo->nField;.  w
107e0 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
107f0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
10800 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
10810 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
10820 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
10830 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
10840 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
10850 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
10860 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 47 65  /.    idx1 += Ge
10870 74 56 61 72 69 6e 74 28 20 61 4b 65 79 31 2b 69  tVarint( aKey1+i
10880 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
10890 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  1 );.    if( d1>
108a0 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65  =nKey1 && sqlite
108b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
108c0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
108d0 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
108e0 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
108f0 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
10900 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
10910 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
10920 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
10930 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
10940 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
10950 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
10960 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
10970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10980 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
10990 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
109a0 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
109c0 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
109d0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
109e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
109f0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
10a00 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
10a10 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31 2e 7a    }.  if( mem1.z
10a20 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
10a30 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
10a40 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 65  mem1);..  /* One
10a50 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
10a60 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20   out of fields, 
10a70 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c  but all the fiel
10a80 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
10a90 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71  int.  ** were eq
10aa0 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72  ual. If the incr
10ab0 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  Key flag is true
10ac0 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
10ad0 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72  d key is.  ** tr
10ae0 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e  eated as larger.
10af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
10b00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65  0 ){.    if( pKe
10b10 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29  yInfo->incrKey )
10b20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
10b30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
10b40 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69 78  pKeyInfo->prefix
10b50 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20 20  IsEqual ){.     
10b60 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b   if( d1<nKey1 ){
10b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
10b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10b90 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
10ba0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
10bb0 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
10bc0 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20  Field.          
10bd0 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f       && pKeyInfo
10be0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
10bf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
10c00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
10c10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
10c20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69  argument is an i
10c30 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f  ndex entry compo
10c40 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  sed using the OP
10c50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
10c60 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  de..** The last 
10c70 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65  entry in this re
10c80 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61  cord should be a
10c90 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69  n integer (speci
10ca0 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  fically.** an in
10cb0 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54  teger rowid).  T
10cc0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10cd0 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
10ce0 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68  f bytes in.** th
10cf0 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  at integer..*/.i
10d00 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
10d10 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20  xRowidLen(const 
10d20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
10d30 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
10d40 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
10d50 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
10d60 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
10d70 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
10d80 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71  e rowid */..  sq
10d90 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
10da0 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a  (aKey, &szHdr);.
10db0 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
10dc0 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72  nt32(&aKey[szHdr
10dd0 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
10de0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
10df0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
10e00 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
10e10 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  }.  ../*.** pCur
10e20 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
10e30 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
10e40 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
10e50 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
10e60 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
10e70 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
10e80 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
10e90 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
10ea0 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
10eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
10ec0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
10ed0 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
10ee0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
10ef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
10f00 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72  beIdxRowid(BtCur
10f10 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
10f20 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
10f30 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
10f40 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
10f50 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
10f60 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
10f70 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
10f80 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
10f90 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
10fa0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
10fb0 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
10fc0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
10fd0 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
10fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
10ff0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
11000 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
11010 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
11020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11030 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
11040 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20    m.flags = 0;. 
11050 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a   m.db = 0;.  m.z
11060 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63  Malloc = 0;.  rc
11070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
11080 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
11090 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
110a0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
110b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
110c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65  .  }.  sqlite3Ge
110d0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
110e0 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73  .z, &szHdr);.  s
110f0 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
11100 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
11110 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64  r-1], &typeRowid
11120 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
11130 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11140 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
11150 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
11160 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
11170 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
11180 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
11190 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
111a0 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
111b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
111c0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
111d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
111e0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
111f0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
11200 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
11210 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
11220 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
11230 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
11240 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
11250 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
11260 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
11270 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
11280 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
11290 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
112a0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
112b0 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
112c0 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
112d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
112e0 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
112f0 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
11300 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
11310 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
11320 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
11330 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
11340 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
11350 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
11360 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
11370 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
11380 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
11390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
113a0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
113b0 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20  (.  Cursor *pC, 
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
113e0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
113f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
11400 63 6f 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20  const u8 *pKey, 
11410 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20    /* The key to 
11420 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74  compare */.  int
11430 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
11440 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11450 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
11460 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
11470 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
11480 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
11490 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
114a0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
114b0 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b  .  int lenRowid;
114c0 0a 20 20 4d 65 6d 20 6d 3b 0a 20 20 55 6e 70 61  .  Mem m;.  Unpa
114d0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
114e0 3b 0a 20 20 63 68 61 72 20 7a 53 70 61 63 65 5b  ;.  char zSpace[
114f0 32 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  200];..  sqlite3
11500 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
11510 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
11520 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
11530 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
11540 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11550 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e  ITE_OK;.  }.  m.
11560 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67  db = 0;.  m.flag
11570 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c  s = 0;.  m.zMall
11580 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  oc = 0;.  rc = s
11590 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
115a0 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
115b0 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  or, 0, nCellKey,
115c0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
115d0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
115e0 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  rc;.  }.  lenRow
115f0 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
11600 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a  IdxRowidLen((u8*
11610 29 6d 2e 7a 29 3b 0a 20 20 70 52 65 63 20 3d 20  )m.z);.  pRec = 
11620 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
11630 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79  dUnpack(pC->pKey
11640 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  Info, nKey, pKey
11650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 20 7a 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    zSpace, sizeof
11680 28 7a 53 70 61 63 65 29 29 3b 0a 20 20 69 66 28  (zSpace));.  if(
11690 20 70 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pRec==0 ){.    
116a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
116b0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20  MEM;.  }.  *res 
116c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
116d0 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2d 6c  ordCompare(m.n-l
116e0 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 70 52  enRowid, m.z, pR
116f0 65 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ec);.  sqlite3Vd
11700 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
11710 52 65 63 6f 72 64 28 70 52 65 63 29 3b 0a 20 20  Record(pRec);.  
11720 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
11730 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
11740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11750 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11760 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
11770 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
11780 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
11790 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
117a0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
117b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
117c0 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
117d0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
117e0 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
117f0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
11800 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
11810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11820 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
11830 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
11840 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
11850 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
11860 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
11870 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
11880 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
11890 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
118a0 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
118b0 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
118c0 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
118d0 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
118e0 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
118f0 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
11900 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
11910 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
11920 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
11930 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
11940 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11950 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
11960 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
11970 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
11980 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
11990 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
119a0 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
119b0 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
119c0 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
119d0 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
119e0 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
119f0 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
11a00 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
11a10 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
11a20 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
11a30 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
11a40 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
11a50 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
11a60 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
11a70 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
11a80 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
11a90 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
11aa0 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
11ab0 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
11ac0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
11ad0 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
11ae0 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
11af0 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
11b00 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
11b10 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
11b20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
11b30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
11b40 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
11b50 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
11b60 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
11b70 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
11b80 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
11b90 64 62 3b 0a 7d 0a                                db;.}.