/ Hex Artifact Content
Login

Artifact 67fb11dbb83fb18bebc877c5a2e23fbe07a5df77:


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 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 36 39 20 32  eaux.c,v 1.469 2
02c0: 30 30 39 2f 30 37 2f 30 37 20 30 32 3a 34 34 3a  009/07/07 02:44:
02d0: 30 37 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  07 drh Exp $.*/.
02e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0300: 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 0a 0a 2f  "vdbeInt.h"..../
0310: 2a 0a 2a 2a 20 57 68 65 6e 20 64 65 62 75 67 67  *.** When debugg
0320: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ing the code gen
0330: 65 72 61 74 6f 72 20 69 6e 20 61 20 73 79 6d 62  erator in a symb
0340: 6f 6c 69 63 20 64 65 62 75 67 67 65 72 2c 20 6f  olic debugger, o
0350: 6e 65 20 63 61 6e 0a 2a 2a 20 73 65 74 20 74 68  ne can.** set th
0360: 65 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  e sqlite3VdbeAdd
0370: 6f 70 54 72 61 63 65 20 74 6f 20 31 20 61 6e 64  opTrace to 1 and
0380: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 77 69 6c   all opcodes wil
0390: 6c 20 62 65 20 70 72 69 6e 74 65 64 0a 2a 2a 20  l be printed.** 
03a0: 61 73 20 74 68 65 79 20 61 72 65 20 61 64 64 65  as they are adde
03b0: 64 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  d to the instruc
03c0: 74 69 6f 6e 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a  tion stream..*/.
03d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
03e0: 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  BUG.int sqlite3V
03f0: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 3d 20  dbeAddopTrace = 
0400: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0;.#endif.../*.*
0410: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 76  * Create a new v
0420: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
0430: 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20  engine..*/.Vdbe 
0440: 2a 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61  *sqlite3VdbeCrea
0450: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  te(sqlite3 *db){
0460: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20  .  Vdbe *p;.  p 
0470: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0480: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0490: 28 56 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20  (Vdbe) );.  if( 
04a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
04b0: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
04c0: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
04d0: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
04e0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
04f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0500: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0510: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
0520: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
0530: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
0540: 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
0550: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  p;.}../*.** Reme
0560: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
0570: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
0580: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
0590: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05a0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
05b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
05c0: 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65  int n, int isPre
05d0: 70 61 72 65 56 32 29 7b 0a 20 20 69 66 28 20 70  pareV2){.  if( p
05e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
05f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0600: 5f 54 52 41 43 45 0a 20 20 69 66 28 20 21 69 73  _TRACE.  if( !is
0610: 50 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75  PrepareV2 ) retu
0620: 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  rn;.#endif.  ass
0630: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
0640: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
0650: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
0660: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20  p->db, z, n);.  
0670: 70 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d  p->isPrepareV2 =
0680: 20 69 73 50 72 65 70 61 72 65 56 32 20 3f 20 31   isPrepareV2 ? 1
0690: 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
06a0: 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73  eturn the SQL as
06b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
06c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
06d0: 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  nt.*/.const char
06e0: 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71   *sqlite3_sql(sq
06f0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
0700: 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20  t){.  Vdbe *p = 
0710: 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20  (Vdbe *)pStmt;. 
0720: 20 72 65 74 75 72 6e 20 28 70 2d 3e 69 73 50 72   return (p->isPr
0730: 65 70 61 72 65 56 32 20 3f 20 70 2d 3e 7a 53 71  epareV2 ? p->zSq
0740: 6c 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l : 0);.}../*.**
0750: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0760: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0770: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0780: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0790: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
07a0: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
07b0: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
07c0: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74   char *zTmp;.  t
07d0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
07e0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07f0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0800: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0810: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0820: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0830: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0840: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0850: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0860: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0870: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0880: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0890: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08a0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08b0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
08c0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
08d0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65  pareV2;.}..#ifde
08e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
08f0: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0900: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0910: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0920: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0930: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0940: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
0950: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0960: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0970: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0980: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
0990: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74   one op larger t
09a0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a  han .** it was..
09b0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
09c0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
09d0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
09e0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
09f0: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0a00: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0a10: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0a20: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63  nd Vdbe.nOpAlloc
0a30: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
0a40: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
0a50: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a60: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a70: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a80: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0a90: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0aa0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0ab0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0ac0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0ad0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64  y(Vdbe *p){.  Vd
0ae0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0af0: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70  t nNew = (p->nOp
0b00: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0b10: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30  loc*2 : (int)(10
0b20: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b  24/sizeof(Op)));
0b30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b40: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0b50: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , p->aOp, nNew*s
0b60: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0b70: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0b80: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0b90: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0ba0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0bb0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e  eof(Op);.    p->
0bc0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0bd0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0be0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0bf0: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0c00: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c10: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c20: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c30: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c40: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c50: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c60: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c70: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0c80: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0c90: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0ca0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cb0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0cc0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0cd0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0ce0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0cf0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d00: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0d10: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0d20: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0d30: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0d40: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0d50: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0d60: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0d70: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0d80: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0d90: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0da0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0db0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0dc0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0dd0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0de0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0df0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0e00: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0e10: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0e20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0e30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
0e40: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
0e50: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
0e60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0e70: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70  {.    if( growOp
0e80: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
0e90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0ea0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0eb0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0ec0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ed0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
0ee0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
0ef0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
0f00: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
0f10: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
0f20: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
0f30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
0f40: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0f50: 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  xpired = 0;.#ifd
0f60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0f70: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
0f80: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
0f90: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
0fa0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72   ) sqlite3VdbePr
0fb0: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
0fc0: 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a  aOp[i]);.#endif.
0fd0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
0fe0: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
0ff0: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1000: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  t = 0;.#endif.  
1010: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20  return i;.}.int 
1020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1030: 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  0(Vdbe *p, int o
1040: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
1050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1060: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  , op, 0, 0, 0);.
1070: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1080: 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c  eAddOp1(Vdbe *p,
1090: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29   int op, int p1)
10a0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
10b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
10c0: 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d  op, p1, 0, 0);.}
10d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10e0: 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20  AddOp2(Vdbe *p, 
10f0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
1100: 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72  int p2){.  retur
1110: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1120: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  Op3(p, op, p1, p
1130: 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  2, 0);.}.../*.**
1140: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
1150: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
1160: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70   p4 value as a p
1170: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1190: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
11a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
11b0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
11c0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
11d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11e0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
11f0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1200: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1210: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1220: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1230: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1240: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1250: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1260: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1270: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1280: 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65   *zP4,    /* The
1290: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
12a0: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
12b0: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
12c0: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
12d0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
12e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
12f0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
1300: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1310: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1320: 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  zP4, p4type);.  
1330: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1340: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1350: 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  ew symbolic labe
1360: 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63  l for an instruc
1370: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65  tion that has ye
1380: 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64  t to be.** coded
1390: 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20  .  The symbolic 
13a0: 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20  label is really 
13b0: 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20  just a negative 
13c0: 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20  number.  The.** 
13d0: 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65  label can be use
13e0: 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75  d as the P2 valu
13f0: 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  e of an operatio
1400: 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a  n.  Later, when.
1410: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20  ** the label is 
1420: 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70  resolved to a sp
1430: 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20  ecific address, 
1440: 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63  the VDBE will sc
1450: 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74  an.** through it
1460: 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74  s operation list
1470: 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20   and change all 
1480: 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69  values of P2 whi
1490: 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20  ch match.** the 
14a0: 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72  label into the r
14b0: 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e  esolved address.
14c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
14d0: 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20  knows that a P2 
14e0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
14f0: 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20   because labels 
1500: 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65  are.** always ne
1510: 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61  gative and P2 va
1520: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
1530: 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74   to be non-negat
1540: 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  ive..** Hence, a
1550: 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c   negative P2 val
1560: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68  ue is a label th
1570: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1580: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a   resolved..**.**
1590: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
15a0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  d if a malloc() 
15b0: 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fails..*/.int sq
15c0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15d0: 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  el(Vdbe *p){.  i
15e0: 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  nt i;.  i = p->n
15f0: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
1600: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1610: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1620: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62    if( i>=p->nLab
1630: 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  elAlloc ){.    i
1640: 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  nt n = p->nLabel
1650: 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
1660: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
1670: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1680: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
1690: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73               n*s
16c0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
16d0: 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61  0]));.    p->nLa
16e0: 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  belAlloc = sqlit
16f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1700: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
1710: 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  /sizeof(p->aLabe
1720: 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l[0]);.  }.  if(
1730: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1740: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
1750: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
1760: 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n -1-i;.}../*.**
1770: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
1780: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
1790: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
17a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
17b0: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
17c0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
17d0: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
17e0: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
17f0: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
1800: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
1810: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
1820: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1830: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
1840: 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e  *p, int x){.  in
1850: 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73  t j = -1-x;.  as
1860: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1870: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
1890: 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  0 && j<p->nLabel
18a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61   );.  if( p->aLa
18b0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
18c0: 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70  abel[j] = p->nOp
18d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
18e0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
18f0: 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20  program looking 
1900: 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68  for P2 values th
1910: 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a  at are negative.
1920: 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72  ** on jump instr
1930: 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73  uctions.  Each s
1940: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1950: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1960: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73  he.** label by s
1970: 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61  etting the P2 va
1980: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
1990: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
19a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
19b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19c0: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
19d0: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
19e0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
19f0: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1a00: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1a10: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1a20: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1a30: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1a40: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
1a50: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
1a60: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
1a70: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
1a80: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
1a90: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
1aa0: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
1ab0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
1ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
1ad0: 6f 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f  o does the follo
1ae0: 77 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f  wing optimizatio
1af0: 6e 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72  n:  It scans for
1b00: 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  .** instructions
1b10: 20 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73   that might caus
1b20: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  e a statement ro
1b30: 6c 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e  llback.  Such in
1b40: 73 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72  structions.** ar
1b50: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  e:.**.**   *  OP
1b60: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
1b70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1b80: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
1b90: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
1ba0: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
1bb0: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
1bc0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  P_VRename.**.** 
1bd0: 49 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72  If no such instr
1be0: 75 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  uction is found,
1bf0: 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74   then every Stat
1c00: 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  ement instructio
1c10: 6e 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64  n .** is changed
1c20: 20 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20   to a Noop.  In 
1c30: 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f  this way, we avo
1c40: 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  id creating the 
1c50: 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f  statement .** jo
1c60: 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63  urnal file unnec
1c70: 65 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61  essarily..*/.sta
1c80: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
1c90: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
1ca0: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
1cb0: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgs){.  int i;. 
1cc0: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
1cd0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
1ce0: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
1cf0: 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64  >aLabel;.  int d
1d00: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
1d10: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  back = 0;.  int 
1d20: 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69  hasStatementBegi
1d30: 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 61 64  n = 0;.  p->read
1d40: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 75  Only = 1;.  p->u
1d50: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
1d60: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
1d70: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
1d80: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
1d90: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
1da0: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
1db0: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  ;..    if( opcod
1dc0: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c  e==OP_Function |
1dd0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67  | opcode==OP_Agg
1de0: 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66  Step ){.      if
1df0: 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72  ( pOp->p5>nMaxAr
1e00: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
1e10: 70 4f 70 2d 3e 70 35 3b 0a 23 69 66 6e 64 65 66  pOp->p5;.#ifndef
1e20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e30: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
1e40: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1e50: 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20  OP_VUpdate ){.  
1e60: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
1e70: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1e80: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23  rgs = pOp->p2;.#
1e90: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1ea0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  if( opcode==OP_H
1eb0: 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  alt ){.      if(
1ec0: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
1ed0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
1ee0: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
1ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73   ){.        does
1f00: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1f10: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
1f20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1f30: 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e  ode==OP_Statemen
1f40: 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74  t ){.      hasSt
1f50: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31  atementBegin = 1
1f60: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 73 65 73 53  ;.      p->usesS
1f70: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  tmtJournal = 1;.
1f80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1f90: 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79  code==OP_Destroy
1fa0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74   ){.      doesSt
1fb0: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1fc0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
1fd0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  f( opcode==OP_Tr
1fe0: 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70  ansaction && pOp
1ff0: 2d 3e 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2!=0 ){.     
2000: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2010: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2030: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
2040: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2050: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2060: 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20  P_VRename ){.   
2070: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
2080: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
2090: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
20a0: 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29  de==OP_VFilter )
20b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
20c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
20d0: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
20e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
20f0: 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
2100: 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20  _Integer );.    
2110: 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31    n = pOp[-1].p1
2120: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d  ;.      if( n>nM
2130: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2140: 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  s = n;.#endif.  
2150: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c    }..    if( sql
2160: 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61  ite3VdbeOpcodeHa
2170: 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65  sProperty(opcode
2180: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26 26  , OPFLG_JUMP) &&
2190: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
21a0: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
21b0: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
21c0: 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   );.      pOp->p
21d0: 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f  2 = aLabel[-1-pO
21e0: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20  p->p2];.    }.  
21f0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
2200: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
2210: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
2220: 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75   = 0;..  *pMaxFu
2230: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
2240: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e  s;..  /* If we n
2250: 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20  ever rollback a 
2260: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2270: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74  ction, then stat
2280: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
2290: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
22a0: 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e  needed.  So chan
22b0: 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74  ge every OP_Stat
22c0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64  ement.  ** opcod
22d0: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  e into an OP_Noo
22e0: 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61  p.  This avoid a
22f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2300: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2310: 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e  ).  ** which can
2320: 20 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e   be expensive on
2330: 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e   some platforms.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53  .  */.  if( hasS
2350: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26  tatementBegin &&
2360: 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52   !doesStatementR
2370: 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  ollback ){.    p
2380: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
2390: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
23a0: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
23b0: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
23c0: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
23d0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
23e0: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
23f0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
2400: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
2410: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2420: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2430: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
2440: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2450: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
2460: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
2470: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2480: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
2490: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
24a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
24b0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
24c0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  >nOp;.}../*.** A
24d0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
24e0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
24f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
2500: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
2510: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
2520: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
2530: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
2540: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
2550: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
2560: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
2570: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
2580: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
2590: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
25a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
25b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
25c0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
25d0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
25e0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
25f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
2600: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
2610: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
2620: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2630: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
2640: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
2650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2660: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
2670: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
2680: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
2690: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
26a0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
26b0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
26c0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
26d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
26e0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
26f0: 20 69 66 28 20 70 32 3c 30 20 26 26 20 73 71 6c   if( p2<0 && sql
2700: 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61  ite3VdbeOpcodeHa
2710: 73 50 72 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e  sProperty(pOut->
2720: 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55  opcode, OPFLG_JU
2730: 4d 50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  MP) ){.        p
2740: 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b  Out->p2 = addr +
2750: 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20   ADDR(p2);.     
2760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2770: 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20  pOut->p2 = p2;. 
2780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
2790: 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b  t->p3 = pIn->p3;
27a0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  .      pOut->p4t
27b0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
27c0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
27d0: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  .p = 0;.      pO
27e0: 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64  ut->p5 = 0;.#ifd
27f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2800: 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d        pOut->zCom
2810: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ment = 0;.      
2820: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  if( sqlite3VdbeA
2830: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
2840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2850: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
2860: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
2870: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
2880: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
2890: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
28a0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
28b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
28c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
28d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
28e0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
28f0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2900: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2910: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
2920: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
2930: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
2940: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
2950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2960: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
2970: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
2980: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
2990: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
29a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
29b0: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
29c0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
29d0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
29e0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
29f0: 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20  t( addr>=0 );.  
2a00: 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20  if( p->nOp>addr 
2a10: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2a20: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
2a30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2a40: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2a50: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
2a60: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2a70: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2a80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2a90: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
2aa0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
2ab0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2ac0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2ad0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2ae0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2af0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
2b00: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
2b10: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
2b20: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
2b30: 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76  aOp[addr].p2 = v
2b40: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2b50: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2b60: 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72  e of the P3 oper
2b70: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
2b80: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
2b90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2ba0: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
2bb0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2bc0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2bd0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
2be0: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
2bf0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64    if( p->nOp>add
2c00: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
2c10: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
2c20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2c30: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2c40: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
2c50: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
2c60: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
2c70: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
2c80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2c90: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
2ca0: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
2cb0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
2cc0: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->aOp ){.    as
2cd0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
2ce0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
2cf0: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b  nOp-1].p5 = val;
2d00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
2d10: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
2d20: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
2d30: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
2d40: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
2d50: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2d60: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2d70: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
2d80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
2da0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
2db0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2dc0: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
2dd0: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
2de0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
2df0: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
2e00: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
2e10: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
2e20: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
2e30: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
2e40: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
2e50: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
2e60: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
2e70: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
2e80: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
2e90: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
2ea0: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
2eb0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2ec0: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
2ed0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2ee0: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
2ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
2f00: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
2f10: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
2f20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2f30: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
2f40: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
2f50: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
2f60: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
2f70: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  4type ){.      c
2f80: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
2f90: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
2fa0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2fb0: 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63  MPRINTF:.      c
2fc0: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
2fd0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
2fe0: 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73  YINFO:.      cas
2ff0: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20  e P4_INTARRAY:. 
3000: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
3010: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a  INFO_HANDOFF: {.
3020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3030: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
3040: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3050: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3060: 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a   P4_VDBEFUNC: {.
3070: 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63          VdbeFunc
3080: 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56   *pVdbeFunc = (V
3090: 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20  dbeFunc *)p4;.  
30a0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
30b0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
30c0: 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63  pVdbeFunc->pFunc
30d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30e0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
30f0: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
3100: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3110: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
3120: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
3130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3140: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
3150: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
3160: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3170: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
3180: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
3190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
31a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
31b0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  EM: {.        sq
31c0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
31d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
31e0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
31f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3200: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
3210: 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20  hange N opcodes 
3220: 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72  starting at addr
3230: 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76   to No-ops..*/.v
3240: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3250: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
3260: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
3270: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  nt N){.  if( p->
3280: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
3290: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
32a0: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
32b0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
32c0: 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  .    while( N-- 
32d0: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
32e0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
32f0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
3300: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
3310: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
3320: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  );.      pOp->op
3330: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
3340: 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20        pOp++;.   
3350: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
3360: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3370: 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61   of the P4 opera
3380: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3390: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
33a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
33b0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
33c0: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
33d0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
33e0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
33f0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
3400: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
3410: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
3420: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
3430: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
3440: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
3450: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f  =0 then the P4 o
3460: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
3470: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
3480: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
3490: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
34a0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
34b0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
34c0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  3_malloc()..** A
34d0: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
34e0: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
34f0: 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64  of zP4 up to and
3500: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
3510: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
3520: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
3530: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
3540: 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP4..**.** If 
3550: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74  n==P4_KEYINFO it
3560: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20   means that zP4 
3570: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
3580: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
3590: 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69  ure..** A copy i
35a0: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65  s made of the Ke
35b0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
35c0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
35d0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
35e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20  ite3_malloc, to 
35f0: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
3600: 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69  e Vdbe is finali
3610: 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45  zed..** n==P4_KE
3620: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e  YINFO_HANDOFF in
3630: 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 34  dicates that zP4
3640: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
3650: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
3660: 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  * stored in memo
3670: 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ry that the call
3680: 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  er has obtained 
3690: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
36a0: 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c  loc. The .** cal
36b0: 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66  ler should not f
36c0: 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ree the allocati
36d0: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66  on, it will be f
36e0: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
36f0: 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a  be is.** finaliz
3700: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  ed..** .** Other
3710: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
3720: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
3730: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
3740: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
3750: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
3760: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
3770: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
3780: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
3790: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
37a0: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
37b0: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
37c0: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
37d0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
37e0: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
37f0: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
3800: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
3810: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
3820: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3830: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
3840: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3850: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
3860: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
3870: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
3880: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
3890: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
38a0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
38b0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
38c0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
38d0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64  ( p->aOp==0 || d
38e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
38f0: 29 7b 0a 20 20 20 20 69 66 20 28 6e 20 21 3d 20  ){.    if (n != 
3900: 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20  P4_KEYINFO) {.  
3910: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e      freeP4(db, n
3920: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
3930: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP4);.    }. 
3940: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3950: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3960: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
3970: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
3980: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
3990: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
39a0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
39b0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
39c0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
39d0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
39e0: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
39f0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
3a00: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
3a10: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
3a20: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
3a30: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
3a40: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
3a50: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
3a60: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
3a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
3a80: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
3a90: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
3aa0: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
3ab0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
3ac0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
3ad0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
3ae0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
3af0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3b00: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
3b10: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
3b20: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
3b30: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
3b40: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
3b50: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
3b60: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
3b70: 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP4)->nField;. 
3b80: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3b90: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3ba0: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3bb0: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3bc0: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3bd0: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3be0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79  lite3Malloc( nBy
3bf0: 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  te );.    pOp->p
3c00: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  4.pKeyInfo = pKe
3c10: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
3c20: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
3c30: 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b   u8 *aSortOrder;
3c40: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  .      memcpy(pK
3c50: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
3c60: 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74  te);.      aSort
3c70: 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
3c80: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ->aSortOrder;.  
3c90: 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64      if( aSortOrd
3ca0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  er ){.        pK
3cb0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3cc0: 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  er = (unsigned c
3cd0: 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e  har*)&pKeyInfo->
3ce0: 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aColl[nField];. 
3cf0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b         memcpy(pK
3d00: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3d10: 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20  er, aSortOrder, 
3d20: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d  nField);.      }
3d30: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3d40: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
3d50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3d60: 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46    p->db->mallocF
3d70: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
3d80: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3d90: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d  4_NOTUSED;.    }
3da0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
3db0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
3dc0: 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  FF ){.    pOp->p
3dd0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
3de0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
3df0: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
3e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
3e10: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
3e20: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
3e30: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3e40: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
3e50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3e60: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
3e70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
3e80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
3e90: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
3ea0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
3eb0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
3ec0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
3ed0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3ee0: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
3ef0: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
3f00: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
3f10: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
3f20: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
3f30: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
3f40: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
3f50: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
3f60: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
3f70: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
3f80: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
3f90: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
3fa0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
3fb0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
3fc0: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
3fd0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
3fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
3ff0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
4000: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
4010: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
4020: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
4030: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
4040: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
4050: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
4060: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
4070: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
4080: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4090: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
40a0: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
40b0: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
40c0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
40d0: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
40e0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
40f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4100: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
4110: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
4120: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
4130: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
4140: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
4150: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
4160: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
4170: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
4180: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
4190: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
41a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41b0: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
41c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
41d0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
41e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
41f0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
4200: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4210: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
4220: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4230: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
4240: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
4250: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
4260: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  -1].zComment;.  
4270: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
4280: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
4290: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
42a0: 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  , *pz);.    *pz 
42b0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
42c0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
42d0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
42e0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
42f0: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
4300: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
4310: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
4320: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
4330: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
4340: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
4350: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
4360: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
4370: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
4380: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
4390: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
43a0: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
43b0: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
43c0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
43d0: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
43e0: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
43f0: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
4400: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
4410: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
4420: 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2c 20 62   and writable, b
4430: 75 74 20 69 74 20 68 61 73 20 6e 6f 20 65 66 66  ut it has no eff
4440: 65 63 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ect.  The return
4450: 20 6f 66 20 61 20 64 75 6d 6d 79 0a 2a 2a 20 6f   of a dummy.** o
4460: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
4470: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
4480: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 20 61 66  e functioning af
4490: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
44a0: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
44b0: 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65  g to check to se
44c0: 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20  e if the return 
44d0: 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74 69 6e  from this routin
44e0: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
44f0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75  nter..**.** Abou
4500: 74 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c  t the #ifdef SQL
4510: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20  ITE_OMIT_TRACE: 
4520: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
4530: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
4540: 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73   called.** unles
4550: 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69  s p->nOp>0.  Thi
4560: 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
4570: 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53  the absense of S
4580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
4590: 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65  ,.** an OP_Trace
45a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
45b0: 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20  always inserted 
45c0: 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  by sqlite3VdbeGe
45d0: 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a  t() as soon as.*
45e0: 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20  * a new VDBE is 
45f0: 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20  created.  So we 
4600: 61 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20  are free to set 
4610: 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31  addr to p->nOp-1
4620: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
4630: 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65  ng to double-che
4640: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
4650: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
4660: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  is non-negative.
4670: 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54   But.** if SQLIT
4680: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20  E_OMIT_TRACE is 
4690: 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f  defined, the OP_
46a0: 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64  Trace is omitted
46b0: 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20   and we do need 
46c0: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20  to.** check the 
46d0: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d  value of p->nOp-
46e0: 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  1 before continu
46f0: 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ing..*/.VdbeOp *
4700: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4710: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4720: 64 72 29 7b 0a 20 20 73 74 61 74 69 63 20 56 64  dr){.  static Vd
4730: 62 65 4f 70 20 64 75 6d 6d 79 3b 0a 20 20 61 73  beOp dummy;.  as
4740: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
4750: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4760: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
4770: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
4780: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
4790: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20  if( p->nOp==0 ) 
47a0: 72 65 74 75 72 6e 20 26 64 75 6d 6d 79 3b 0a 23  return &dummy;.#
47b0: 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20 3d  endif.    addr =
47c0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
47d0: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
47e0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
47f0: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
4800: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
4810: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
4820: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
4830: 65 74 75 72 6e 20 26 64 75 6d 6d 79 3b 0a 20 20  eturn &dummy;.  
4840: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
4850: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
4860: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
4870: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4880: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
4890: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
48a0: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
48b0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
48c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
48d0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
48e0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
48f0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
4900: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
4910: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
4920: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
4930: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
4940: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
4950: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
4960: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
4970: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
4980: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
4990: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
49a0: 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  mp;.  assert( nT
49b0: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69  emp>=20 );.  swi
49c0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
49d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
49e0: 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a  KEYINFO_STATIC:.
49f0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
4a00: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
4a10: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
4a20: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
4a30: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4a40: 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
4a50: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4a60: 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f   zTemp, "keyinfo
4a70: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
4a80: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69  nField);.      i
4a90: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
4aa0: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  30(zTemp);.     
4ab0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
4ac0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
4ad0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
4ae0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
4af0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
4b00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
4b10: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
4b20: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4b30: 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a  trlen30(pColl->z
4b40: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
4b50: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
4b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4b70: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
4b80: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
4b90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4ba0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4bb0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4bc0: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20  = ',';.         
4bd0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
4be0: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65  SortOrder && pKe
4bf0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4c00: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
4c10: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
4c20: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
4c30: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
4c40: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43  py(&zTemp[i], pC
4c50: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b  oll->zName,n+1);
4c60: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
4c70: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
4c80: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
4c90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
4ca0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
4cb0: 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,nil",4);.      
4cc0: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
4cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4ce0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
4cf0: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
4d00: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
4d10: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
4d20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4d30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4d40: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
4d50: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
4d60: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
4d70: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
4d80: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4d90: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
4da0: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
4db0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
4dc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4dd0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
4de0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
4df0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
4e00: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
4e10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4e20: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
4e30: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
4e40: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
4e50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4e60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4e70: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
4e80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4e90: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4ea0: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
4eb0: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      brea
4ec0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4ed0: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
4ee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4ef0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4f00: 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
4f10: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
4f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4f30: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
4f40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4f50: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4f60: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
4f70: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
4f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4f90: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
4fa0: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
4fb0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
4fc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
4fd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4fe0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20  M_Null)==0 );.  
4ff0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
5000: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
5010: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
5020: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
5030: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
5040: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
5050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5060: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
5070: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
5080: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
5090: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
50a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
50b0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
50c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
50d0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
50e0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
50f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5100: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
5110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5120: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
5130: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
5140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
5150: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
5160: 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20 20  >p4.pVtab;.     
5170: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
5180: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
5190: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
51a0: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
51b0: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
51c0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
51d0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
51e0: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
51f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
5200: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
5210: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
5220: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5230: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5240: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
5250: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
5260: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
5270: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
5280: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
5290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
52a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
52b0: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
52c0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
52d0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
52e0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
52f0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
5300: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
5310: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69   used..**.*/.voi
5320: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
5330: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
5340: 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61  int i){.  int ma
5350: 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  sk;.  assert( i>
5360: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
5370: 44 62 20 26 26 20 69 3c 73 69 7a 65 6f 66 28 75  Db && i<sizeof(u
5380: 33 32 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72  32)*8 );.  asser
5390: 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  t( i<(int)sizeof
53a0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38  (p->btreeMask)*8
53b0: 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 28 75   );.  mask = ((u
53c0: 33 32 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20  32)1)<<i;.  if( 
53d0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
53e0: 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
53f0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20  p->btreeMask |= 
5400: 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  mask;.    sqlite
5410: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
5420: 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74 65  Insert(&p->aMute
5430: 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  x, p->db->aDb[i]
5440: 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23  .pBt);.  }.}...#
5450: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
5460: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
5470: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5480: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
5490: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
54a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
54b0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
54c0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
54d0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
54e0: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
54f0: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
5500: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
5510: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
5520: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
5530: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
5540: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
5550: 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58  4d %4d %-4s %.2X
5560: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
5570: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
5580: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
5590: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
55a0: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
55b0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  );.  fprintf(pOu
55c0: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c  t, zFormat1, pc,
55d0: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f   .      sqlite3O
55e0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
55f0: 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c  pcode), pOp->p1,
5600: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
5610: 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c  3, zP4, pOp->p5,
5620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5630: 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e  EBUG.      pOp->
5640: 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e  zComment ? pOp->
5650: 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65  zComment : "".#e
5660: 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e  lse.      "".#en
5670: 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  dif.  );.  fflus
5680: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
5690: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  f../*.** Release
56a0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d   an array of N M
56b0: 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73  em elements.*/.s
56c0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
56d0: 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  seMemArray(Mem *
56e0: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  p, int N){.  if(
56f0: 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d   p && N ){.    M
5700: 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71  em *pEnd;.    sq
5710: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
5720: 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  b;.    u8 malloc
5730: 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  _failed = db->ma
5740: 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
5750: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
5760: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
5770: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
5780: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
5790: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
57a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
57b0: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
57c0: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
57d0: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
57e0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
57f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
5800: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
5810: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
5820: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
5830: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
5840: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
5850: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
5860: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
5870: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
5880: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
5890: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
58a0: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
58b0: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
58c0: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
58d0: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
58e0: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
58f0: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
5900: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
5910: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
5920: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
5930: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
5940: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
5950: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
5960: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
5970: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
5980: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
5990: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
59a0: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
59b0: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
59c0: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
59d0: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
59e0: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
59f0: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
5a00: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
5a10: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
5a20: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
5a30: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
5a40: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
5a50: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
5a60: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
5a70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5a80: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
5a90: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29  M_Agg|MEM_Dyn) )
5aa0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5ab0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
5ac0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
5ad0: 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  if( p->zMalloc )
5ae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5af0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
5b00: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
5b10: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b   p->zMalloc = 0;
5b20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
5b30: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  p->flags = MEM_N
5b40: 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ull;.    }.    d
5b50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5b60: 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b  = malloc_failed;
5b70: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53  .  }.}..#ifdef S
5b80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
5b90: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69  ORY_MANAGEMENT.i
5ba0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
5bb0: 6c 65 61 73 65 42 75 66 66 65 72 73 28 56 64 62  leaseBuffers(Vdb
5bc0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69 3b  e *p){.  int ii;
5bd0: 0a 20 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 30  .  int nFree = 0
5be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5bf0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5c00: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
5c10: 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 3d    for(ii=1; ii<=
5c20: 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a  p->nMem; ii++){.
5c30: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
5c40: 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20  &p->aMem[ii];.  
5c50: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
5c60: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29  s & MEM_RowSet )
5c70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
5c80: 6f 77 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d  owSetClear(pMem-
5c90: 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 20  >u.pRowSet);.   
5ca0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d   }.    if( pMem-
5cb0: 3e 7a 20 26 26 20 70 4d 65 6d 2d 3e 66 6c 61 67  >z && pMem->flag
5cc0: 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  s&MEM_Dyn ){.   
5cd0: 20 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d     assert( !pMem
5ce0: 2d 3e 78 44 65 6c 20 29 3b 0a 20 20 20 20 20 20  ->xDel );.      
5cf0: 6e 46 72 65 65 20 2b 3d 20 73 71 6c 69 74 65 33  nFree += sqlite3
5d00: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65  DbMallocSize(pMe
5d10: 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 29 3b  m->db, pMem->z);
5d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5d30: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
5d40: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
5d50: 72 65 74 75 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a  return nFree;.}.
5d60: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
5d70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
5d80: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
5d90: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
5da0: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
5db0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
5dc0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
5dd0: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
5de0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
5df0: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
5e00: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
5e10: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
5e20: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
5e30: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
5e40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
5e50: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
5e60: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
5e70: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
5e80: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
5e90: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
5ea0: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
5eb0: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
5ec0: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
5ed0: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
5ee0: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
5ef0: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
5f00: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
5f10: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
5f20: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
5f30: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
5f40: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
5f50: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a   QUERY PLAN..*/.
5f60: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c  int sqlite3VdbeL
5f70: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20  ist(.  Vdbe *p  
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
5fa0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
5fb0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
5fc0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
5fd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a  LITE_OK;.  Mem *
5fe0: 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c  pMem = p->pResul
5ff0: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
6000: 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  1];..  assert( p
6010: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
6020: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
6030: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
6040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
6050: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
6060: 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61  AGIC_BUSY );.  a
6070: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
6080: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
6090: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
60a0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
60b0: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  OMEM );..  /* Ev
60c0: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
60d0: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75  pcode does not u
60e0: 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  se dynamic strin
60f0: 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  gs for.  ** the 
6100: 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63  result, result c
6110: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d  olumns may becom
6120: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
6130: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
6140: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
6150: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
6160: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
6170: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
6180: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ng..  */.  relea
6190: 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c  seMemArray(pMem,
61a0: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 0a 20 20 69 66   p->nMem);..  if
61b0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
61c0: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
61d0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
61e0: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
61f0: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
6200: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
6210: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
6220: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
6230: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
6240: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
6250: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
6260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
6270: 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  R;.  }..  do{.  
6280: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
6290: 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f   }while( i<p->nO
62a0: 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  p && p->explain=
62b0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
62c0: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
62d0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  in );.  if( i>=p
62e0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->nOp ){.    p->
62f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6300: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6310: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
6320: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
6330: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
6340: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
6350: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
6360: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
6370: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
6380: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
6390: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
63a0: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
63b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
63c0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
63d0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
63e0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ;.    if( p->exp
63f0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
6400: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
6410: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
6420: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
6430: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  E_INTEGER;.     
6440: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6470: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
6480: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
6490: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
64a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
64b0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
64c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
64d0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
64e0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
64f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f  pOp->opcode);  /
6500: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
6510: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
6520: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
6530: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
6540: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
6550: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
6560: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
6570: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
6580: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
6590: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
65a0: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
65b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
65c0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
65d0: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
6600: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
6610: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
6620: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
6630: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
6640: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
6650: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
6680: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
6690: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
66a0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
66b0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
66c0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
66d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
66e0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
66f0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
6720: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
6730: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
6740: 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ER;.      pMem++
6750: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
6760: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
6770: 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29  row(pMem, 32, 0)
6780: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f   ){            /
6790: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
67a0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
67b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
67c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
67d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
67e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
67f0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
6800: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20  MEM_Term;.    z 
6810: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
6820: 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20   pMem->z, 32);. 
6830: 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e     if( z!=pMem->
6840: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
6850: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
6860: 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pMem, z, -1, SQL
6870: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
6880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6890: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
68a0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
68b0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
68c0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
68d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
68e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
68f0: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79    }.    pMem->ty
6900: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
6910: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
6920: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
6930: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
6940: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
6950: 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29  Grow(pMem, 4, 0)
6960: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6970: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
6980: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
6990: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
69a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
69b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
69c0: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
69d0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
69e0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
69f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6a00: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
6a10: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
6a20: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
6a30: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
6a40: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
6a50: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
6a60: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
6a70: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
6a80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6a90: 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70  EBUG.      if( p
6aa0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
6ab0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
6ac0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
6ad0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
6ae0: 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a  pMem->z = pOp->z
6af0: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20  Comment;.       
6b00: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
6b10: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
6b20: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
6b30: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
6b40: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
6b50: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
6b60: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65  E_TEXT;.      }e
6b70: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
6b80: 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   {.        pMem-
6b90: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
6ba0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
6bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
6bc0: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ent */.        p
6bd0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
6be0: 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_NULL;.      }
6bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
6c00: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
6c10: 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  5*(p->explain-1)
6c20: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
6c30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
6c40: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
6c50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6c60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6c70: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
6c80: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6c90: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
6ca0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
6cb0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
6cc0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
6cd0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
6ce0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
6cf0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6d00: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
6d10: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
6d20: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
6d30: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
6d40: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
6d50: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
6d60: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
6d70: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=0 ){.    const
6d80: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
6d90: 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28  p4.z;.    while(
6da0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
6db0: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70  *z) ) z++;.    p
6dc0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
6dd0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
6de0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
6df0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6e00: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
6e10: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
6e20: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
6e30: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
6e40: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
6e50: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
6e60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6e70: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
6e80: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
6e90: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
6ea0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
6eb0: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
6ec0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6ed0: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
6ee0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
6ef0: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
6f00: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
6f10: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
6f20: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
6f30: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
6f40: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
6f50: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
6f60: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
6f70: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
6f80: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
6f90: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
6fa0: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
6fb0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
6fc0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
6fd0: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
6fe0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
6ff0: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
7000: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
7010: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
7030: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
7040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7050: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
7060: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
7070: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
7080: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
7090: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
70a0: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
70b0: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  _IOTRACE */../*.
70c0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
70d0: 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73  e from a fixed s
70e0: 69 7a 65 20 62 75 66 66 65 72 2e 20 20 4d 61 6b  ize buffer.  Mak
70f0: 65 20 2a 70 70 20 70 6f 69 6e 74 20 74 6f 20 74  e *pp point to t
7100: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  he.** allocated 
7110: 73 70 61 63 65 2e 20 20 28 4e 6f 74 65 3a 20 20  space.  (Note:  
7120: 70 70 20 69 73 20 61 20 63 68 61 72 2a 20 72 61  pp is a char* ra
7130: 74 68 65 72 20 74 68 61 6e 20 61 20 76 6f 69 64  ther than a void
7140: 2a 2a 20 74 6f 0a 2a 2a 20 77 6f 72 6b 20 61 72  ** to.** work ar
7150: 6f 75 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72  ound the pointer
7160: 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 20   aliasing rules 
7170: 6f 66 20 43 2e 29 20 20 2a 70 70 20 73 68 6f 75  of C.)  *pp shou
7180: 6c 64 20 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a 20  ld initially.** 
7190: 62 65 20 7a 65 72 6f 2e 20 20 49 66 20 2a 70 70  be zero.  If *pp
71a0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
71b0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
71c0: 65 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  e space has alre
71d0: 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  ady.** been allo
71e0: 63 61 74 65 64 20 61 6e 64 20 74 68 69 73 20 72  cated and this r
71f0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 6f 70  outine is a noop
7200: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73  ..**.** nByte is
7210: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7220: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
7230: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46  eded..**.** *ppF
7240: 72 6f 6d 20 70 6f 69 6e 74 20 74 6f 20 61 76 61  rom point to ava
7250: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
7260: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
7270: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
7280: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
7290: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65  e..**.** *pnByte
72a0: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
72b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
72c0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
72d0: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
72e0: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
72f0: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
7300: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
7310: 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74  n *ppFrom to sat
7320: 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75  isfy the.** requ
7330: 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  est, then increm
7340: 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74  ent *pnByte by t
7350: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
7360: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
7370: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 53 70  tic void allocSp
7380: 61 63 65 28 0a 20 20 63 68 61 72 20 2a 70 70 2c  ace(.  char *pp,
7390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
73a0: 4e 2f 4f 55 54 3a 20 53 65 74 20 2a 70 70 20 74  N/OUT: Set *pp t
73b0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6c 6c 6f 63  o point to alloc
73c0: 61 74 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 20  ated buffer */. 
73d0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
73e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
73f0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
7400: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
7410: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
7420: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
7430: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
7440: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
7450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
7460: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
7470: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
7480: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
7490: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
74b0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
74c0: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
74d0: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
74e0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
74f0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
7500: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
7510: 28 20 28 2a 28 76 6f 69 64 2a 2a 29 70 70 29 3d  ( (*(void**)pp)=
7520: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
7530: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
7540: 0a 20 20 20 20 69 66 28 20 28 70 45 6e 64 20 2d  .    if( (pEnd -
7550: 20 2a 70 70 46 72 6f 6d 29 3e 3d 6e 42 79 74 65   *ppFrom)>=nByte
7560: 20 29 7b 0a 20 20 20 20 20 20 2a 28 76 6f 69 64   ){.      *(void
7570: 2a 2a 29 70 70 20 3d 20 28 76 6f 69 64 20 2a 29  **)pp = (void *)
7580: 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 20 20 2a  *ppFrom;.      *
7590: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
75a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
75b0: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
75c0: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  te;.    }.  }.}.
75d0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
75e0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
75f0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20   for execution. 
7600: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
7610: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
7620: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
7630: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
7640: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
7650: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
7660: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
7670: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
7680: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
7690: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
76a0: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
76b0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
76c0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73    .**.** This is
76d0: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
76e0: 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f   move a VDBE fro
76f0: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  m VDBE_MAGIC_INI
7700: 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  T to.** VDBE_MAG
7710: 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  IC_RUN..**.** Th
7720: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
7730: 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65 20 74  be called more t
7740: 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20 73 69  han once on a si
7750: 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d 61 63  ngle virtual mac
7760: 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72  hine..** The fir
7770: 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 20  st call is made 
7780: 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20  while compiling 
7790: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
77a0: 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a 2a 2a  t. Subsequent.**
77b0: 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 20   calls are made 
77c0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  as part of the p
77d0: 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65 74 74  rocess of resett
77e0: 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ing a statement 
77f0: 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78 65 63  to be.** re-exec
7800: 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63 61 6c  uted (from a cal
7810: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73  l to sqlite3_res
7820: 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61 72 2c  et()). The nVar,
7830: 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 0a   nMem, nCursor .
7840: 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e  ** and isExplain
7850: 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
7860: 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f 72 72  only passed corr
7870: 65 63 74 20 76 61 6c 75 65 73 20 74 68 65 20 66  ect values the f
7880: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 65  irst time.** the
7890: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
78a0: 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71 75 65  led. On subseque
78b0: 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d 20 73  nt calls, from s
78c0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c 20  qlite3_reset(), 
78d0: 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73 73 65  nVar.** is passe
78e0: 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e  d -1 and nMem, n
78f0: 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45 78 70  Cursor and isExp
7900: 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70 61 73  lain are all pas
7910: 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69  sed zero..*/.voi
7920: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
7930: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
7940: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
7950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7960: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  VDBE */.  int nV
7970: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
7980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7990: 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e  er of '?' see in
79a0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
79b0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  nt */.  int nMem
79c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
79d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
79e0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
79f0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
7a00: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20    int nCursor,  
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
7a30: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  rsors to allocat
7a40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70  e */.  int isExp
7a50: 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
7a60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7a70: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
7a80: 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74  words is present
7a90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
7aa0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7ab0: 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  p->db;..  assert
7ac0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
7ad0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
7ae0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
7af0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
7b00: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
7b10: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
7b20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
7b30: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
7b40: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
7b50: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
7b60: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
7b70: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
7b80: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
7b90: 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72  C_RUN;..  /* For
7ba0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
7bb0: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
7bc0: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
7bd0: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
7be0: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
7bf0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
7c00: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
7c10: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
7c20: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
7c30: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
7c40: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
7c50: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
7c60: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
7c70: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
7c80: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
7c90: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
7ca0: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
7cb0: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
7cc0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
7cd0: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
7ce0: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
7cf0: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
7d00: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
7d10: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
7d20: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
7d30: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
7d40: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
7d50: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
7d60: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
7d70: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
7d80: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
7d90: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
7da0: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
7db0: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
7dc0: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
7dd0: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
7de0: 65 6e 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73  ents in. This is
7df0: 20 6f 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20   only done the. 
7e00: 20 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74   ** first time t
7e10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7e20: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76  called for a giv
7e30: 65 6e 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65  en VDBE, not whe
7e40: 6e 20 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69  n it is.  ** bei
7e50: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73  ng called from s
7e60: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 74  qlite3_reset() t
7e70: 6f 20 72 65 73 65 74 20 74 68 65 20 76 69 72 74  o reset the virt
7e80: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a  ual machine..  *
7e90: 2f 0a 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20  /.  if( nVar>=0 
7ea0: 26 26 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61  && ALWAYS(db->ma
7eb0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29  llocFailed==0) )
7ec0: 7b 0a 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d  {.    u8 *zCsr =
7ed0: 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70   (u8 *)&p->aOp[p
7ee0: 2d 3e 6e 4f 70 5d 3b 0a 20 20 20 20 75 38 20 2a  ->nOp];.    u8 *
7ef0: 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26 70 2d  zEnd = (u8 *)&p-
7f00: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  >aOp[p->nOpAlloc
7f10: 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ];.    int nByte
7f20: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20  ;.    int nArg; 
7f30: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
7f40: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
7f50: 70 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72  passed to a user
7f60: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
7f70: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
7f80: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20  s(p, &nArg);.   
7f90: 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26   if( isExplain &
7fa0: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
7fb0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
7fc0: 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20    }.    zCsr += 
7fd0: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
7fe0: 37 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45  7;.    assert( E
7ff0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
8000: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 20  ENT(zCsr) );.   
8010: 20 69 66 28 20 7a 45 6e 64 3c 7a 43 73 72 20 29   if( zEnd<zCsr )
8020: 20 7a 45 6e 64 20 3d 20 7a 43 73 72 3b 0a 0a 20   zEnd = zCsr;.. 
8030: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 6d 65     do {.      me
8040: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
8050: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 20 20 20 20  nd-zCsr);.      
8060: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  nByte = 0;.     
8070: 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61   allocSpace((cha
8080: 72 2a 29 26 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  r*)&p->aMem, nMe
8090: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  m*sizeof(Mem), &
80a0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
80b0: 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63  te);.      alloc
80c0: 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d  Space((char*)&p-
80d0: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
80e0: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
80f0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
8100: 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28       allocSpace(
8110: 28 63 68 61 72 2a 29 26 70 2d 3e 61 70 41 72 67  (char*)&p->apArg
8120: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
8130: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
8140: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
8150: 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61   allocSpace((cha
8160: 72 2a 29 26 70 2d 3e 61 7a 56 61 72 2c 20 6e 56  r*)&p->azVar, nV
8170: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
8180: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
8190: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c  nByte);.      al
81a0: 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29  locSpace((char*)
81b0: 26 70 2d 3e 61 70 43 73 72 2c 20 0a 20 20 20 20  &p->apCsr, .    
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 75               nCu
81d0: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
81e0: 43 75 72 73 6f 72 2a 29 2c 20 26 7a 43 73 72 2c  Cursor*), &zCsr,
81f0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 0a 20 20   zEnd, &nByte.  
8200: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
8210: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
8220: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
8230: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8240: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
8250: 20 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20 3d    }.      zCsr =
8260: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 20   p->pFree;.     
8270: 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42   zEnd = &zCsr[nB
8280: 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  yte];.    }while
8290: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
82a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
82b0: 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
82c0: 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a  = (u16)nCursor;.
82d0: 20 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20      if( p->aVar 
82e0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72  ){.      p->nVar
82f0: 20 3d 20 28 75 31 36 29 6e 56 61 72 3b 0a 20 20   = (u16)nVar;.  
8300: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
8310: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
8320: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
8330: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
8340: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
8350: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
8360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8370: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
8380: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65     /* aMem[] goe
83b0: 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a  s from 1..nMem *
83c0: 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  /.      p->nMem 
83d0: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  = nMem;         
83e0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
83f0: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
8400: 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  m-1 */.      for
8410: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e  (n=1; n<=nMem; n
8420: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
8430: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
8440: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
8450: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20    p->aMem[n].db 
8460: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = db;.      }.  
8470: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
8480: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
8490: 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d  r(n=1; n<p->nMem
84a0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; n++){.    asse
84b0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64  rt( p->aMem[n].d
84c0: 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  b==db );.  }.#en
84d0: 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  dif..  p->pc = -
84e0: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
84f0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
8500: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
8510: 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69  ort;.  p->explai
8520: 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a  n |= isExplain;.
8530: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
8540: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
8550: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
8560: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
8570: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
8580: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
8590: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
85a0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
85b0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
85c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
85d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
85e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i++){.      p->a
85f0: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
8600: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
8610: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d  ycles = 0;.    }
8620: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
8630: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
8640: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
8650: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
8660: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
8670: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
8680: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
8690: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
86a0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
86b0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
86c0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
86d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
86e0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
86f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
8700: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
8710: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
8720: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
8730: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
8740: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
8750: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
8760: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
8770: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
8780: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
8790: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
87a0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
87b0: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
87c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
87d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
87e0: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
87f0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
8800: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
8810: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
8820: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
8830: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
8840: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
8850: 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64  dule = pCx->pMod
8860: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
8870: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
8880: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
8890: 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b  afetyOff(p->db);
88a0: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
88b0: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
88c0: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
88d0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e  ite3SafetyOn(p->
88e0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  db);.    p->inVt
88f0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
8900: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  }.#endif.  if( !
8910: 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f  pCx->ephemPseudo
8920: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
8930: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
8940: 2c 20 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20  , pCx->pData);. 
8950: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
8960: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
8970: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
8980: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
8990: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
89a0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d  .  if( p->apCsr=
89b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
89c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
89d0: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
89e0: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
89f0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
8a00: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
8a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
8a20: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
8a30: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
8a40: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
8a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
8a60: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
8a70: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
8a80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
8a90: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
8aa0: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
8ab0: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
8ac0: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
8ad0: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
8ae0: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
8af0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
8b00: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
8b10: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
8b20: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
8b30: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
8b40: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
8b50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
8b60: 64 62 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  db;.  Mem *pMem;
8b70: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
8b80: 72 73 28 70 29 3b 0a 20 20 66 6f 72 28 70 4d 65  rs(p);.  for(pMe
8b90: 6d 3d 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 69  m=&p->aMem[1], i
8ba0: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
8bb0: 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  i++, pMem++){.  
8bc0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
8bd0: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29  s & MEM_RowSet )
8be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
8bf0: 6f 77 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d  owSetClear(pMem-
8c00: 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 20  >u.pRowSet);.   
8c10: 20 7d 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70   }.    MemSetTyp
8c20: 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f  eFlag(pMem, MEM_
8c30: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  Null);.  }.  rel
8c40: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
8c50: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
8c60: 6d 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e  m);.  if( p->con
8c70: 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20  textStack ){.   
8c80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8c90: 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  b, p->contextSta
8ca0: 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ck);.  }.  p->co
8cb0: 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ntextStack = 0;.
8cc0: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
8cd0: 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  kDepth = 0;.  p-
8ce0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
8cf0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
8d00: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
8d10: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
8d20: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
8d30: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
8d40: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
8d50: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
8d60: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
8d70: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
8d80: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
8d90: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
8da0: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
8db0: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
8dc0: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
8dd0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
8de0: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
8df0: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
8e00: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
8e10: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
8e20: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
8e30: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
8e40: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
8e50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
8e60: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
8e70: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
8e80: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
8e90: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
8ea0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
8eb0: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
8ec0: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
8ed0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
8ee0: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
8ef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8f00: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
8f10: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
8f20: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
8f30: 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
8f40: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
8f50: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
8f60: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
8f70: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8f80: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
8f90: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
8fa0: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
8fb0: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
8fc0: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
8fd0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
8fe0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
8ff0: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
9000: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
9010: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
9020: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
9030: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
9040: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
9050: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
9060: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
9070: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
9080: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
9090: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
90a0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
90b0: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
90c0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
90d0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
90e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
90f0: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
9100: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
9110: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
9120: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
9130: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
9140: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
9150: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
9160: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
9170: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
9180: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
9190: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
91a0: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
91b0: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
91c0: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
91d0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
91e0: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
9210: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
9220: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9250: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
9260: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
9270: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
92a0: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
92b0: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
92c0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
92d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
92e0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
92f0: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
9300: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
9310: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
9320: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
9330: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
9340: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
9350: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
9360: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
9370: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
9380: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
9390: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
93a0: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
93b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
93c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
93d0: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
93e0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
93f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9400: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9410: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
9420: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
9430: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
9440: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
9450: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
9460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
9470: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
9480: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
9490: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
94a0: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
94b0: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
94c0: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
94d0: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
94e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
94f0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
9500: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
9510: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
9520: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
9530: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
9540: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
9550: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
9560: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
9570: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
9580: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
9590: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
95a0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
95b0: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
95c0: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
95d0: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
95e0: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
95f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9600: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
9610: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
9620: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
9630: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
9640: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
9650: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
9660: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
9670: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
9680: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9690: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
96a0: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
96b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
96c0: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
96d0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
96e0: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
96f0: 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
9700: 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
9710: 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
9720: 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
9730: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9740: 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
9750: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
9760: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
9770: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
9780: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
9790: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
97a0: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
97b0: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
97c0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
97d0: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
97e0: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
97f0: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
9800: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9810: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
9820: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
9830: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
9840: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
9850: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
9860: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
9870: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
9880: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
9890: 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29  db, &p->zErrMsg)
98a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
98b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
98c0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
98d0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
98e0: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
98f0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
9900: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
9910: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
9920: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
9930: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
9940: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
9950: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
9960: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
9970: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
9980: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
9990: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
99a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
99b0: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
99c0: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
99d0: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
99e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
99f0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
9a00: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
9a10: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
9a20: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
9a30: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
9a40: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
9a50: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
9a60: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
9a70: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
9a80: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
9a90: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
9aa0: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
9ab0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9ac0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
9ad0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
9ae0: 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
9af0: 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
9b00: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
9b10: 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
9b20: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
9b30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 64  {.    assert( (d
9b40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9b50: 45 5f 43 6f 6d 6d 69 74 42 75 73 79 29 3d 3d 30  E_CommitBusy)==0
9b60: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   );.    db->flag
9b70: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 6d 6d  s |= SQLITE_Comm
9b80: 69 74 42 75 73 79 3b 0a 20 20 20 20 28 76 6f 69  itBusy;.    (voi
9b90: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
9ba0: 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ff(db);.    rc =
9bb0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
9bc0: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
9bd0: 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  Arg);.    (void)
9be0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
9bf0: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  db);.    db->fla
9c00: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f  gs &= ~SQLITE_Co
9c10: 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20 20 69 66  mmitBusy;.    if
9c20: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
9c30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
9c40: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
9c50: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
9c60: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
9c70: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
9c80: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
9c90: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
9ca0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
9cb0: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
9cc0: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
9cd0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
9ce0: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
9cf0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
9d00: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
9d10: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
9d20: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
9d30: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
9d40: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
9d50: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
9d60: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
9d70: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
9d80: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
9d90: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
9da0: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
9db0: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
9dc0: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
9dd0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
9de0: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
9df0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
9e00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
9e10: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
9e20: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
9e30: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
9e40: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
9e50: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
9e60: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
9e70: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
9e80: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
9e90: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9ea0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
9eb0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9ec0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9ed0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
9ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9ef0: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
9f00: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
9f10: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
9f20: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
9f30: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
9f40: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
9f50: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9f60: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
9f70: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
9f80: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
9f90: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
9fa0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
9fb0: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
9fc0: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
9fd0: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
9fe0: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
9ff0: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
a000: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
a010: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
a020: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a030: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
a040: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
a050: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
a060: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
a070: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
a080: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
a090: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
a0a0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
a0b0: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
a0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a0d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
a0f0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
a100: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
a110: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
a120: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
a130: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
a140: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
a150: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
a160: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
a170: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
a180: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
a190: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
a1a0: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
a1b0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
a1c0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
a1d0: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
a1e0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
a1f0: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
a200: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
a210: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
a220: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
a230: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
a240: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
a250: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
a260: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
a270: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
a280: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
a290: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
a2a0: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
a2b0: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
a2c0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
a2d0: 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  es;..    /* Sele
a2e0: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
a2f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
a300: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
a310: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
a320: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a330: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
a340: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
a350: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
a360: 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
a370: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
a380: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
a390: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38  tf(db, "%s-mj%08
a3a0: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69  X", zMainFile, i
a3b0: 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66  Random&0x7ffffff
a3c0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  f);.      if( !z
a3d0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
a3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a3f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
a400: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a410: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
a420: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
a430: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
a440: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
a450: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a460: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
a470: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a480: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
a490: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a4a0: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
a4b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
a4c0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
a4d0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
a4e0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
a4f0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
a500: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
a510: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
a520: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
a530: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
a540: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
a550: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
a560: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
a570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a580: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a590: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
a5a0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a5b0: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
a5c0: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
a5d0: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
a5e0: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
a5f0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
a600: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
a610: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
a620: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a630: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
a640: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
a650: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a660: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a670: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
a680: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
a690: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
a6a0: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
a6b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a6c0: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
a6d0: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
a6e0: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
a6f0: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
a700: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
a710: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a720: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
a730: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
a740: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
a750: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
a760: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f   ) continue;   /
a770: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d  * Ignore the TEM
a780: 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
a790: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
a7a0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
a7b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
a7c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
a7d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
a7e0: 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
a7f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
a800: 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e  File[0]==0 ) con
a810: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
a820: 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  e :memory: datab
a830: 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
a840: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
a850: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
a860: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
a870: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
a880: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
a890: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
a8a0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a8b0: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
a8c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a8d0: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
a8e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
a8f0: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
a900: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
a910: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
a940: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
a950: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
a960: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
a970: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
a980: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a990: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
a9a0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
a9b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a9c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a9d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
a9e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a9f0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
aa00: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
aa10: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
aa20: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
aa30: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
aa40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
aa50: 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
aa60: 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
aa70: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
aa80: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
aa90: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
aaa0: 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
aab0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
aac0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
aad0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
aae0: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
aaf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ab00: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
ab10: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
ab20: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
ab30: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
ab40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
ab50: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
ab60: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
ab70: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
ab80: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
ab90: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
aba0: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
abb0: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
abc0: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
abd0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
abe0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
abf0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
ac00: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
ac10: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
ac20: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
ac30: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
ac40: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
ac50: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
ac60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
ac70: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
ac80: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
ac90: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
aca0: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
acb0: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
acc0: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
acd0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
ace0: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
acf0: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
ad00: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
ad10: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
ad20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ad30: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
ad40: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
ad50: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
ad60: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
ad70: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
ad80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
ad90: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
ada0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
adb0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
adc0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
add0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ade0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
adf0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
ae00: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
ae10: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
ae20: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
ae30: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
ae40: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
ae50: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
ae60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ae70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ae80: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
ae90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
aea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
aeb0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
aec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
aed0: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
aee0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
aef0: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
af00: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
af10: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
af20: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
af30: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
af40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
af50: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
af60: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
af70: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
af80: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
af90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
afa0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
afb0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
afc0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
afd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
afe0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
aff0: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
b000: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
b010: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
b020: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
b030: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
b040: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
b050: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
b060: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
b070: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
b080: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
b090: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
b0a0: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
b0b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
b0c0: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
b0d0: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
b0e0: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
b0f0: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
b100: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
b110: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
b120: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
b130: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
b140: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
b150: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
b160: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
b170: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
b180: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
b190: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
b1a0: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
b1b0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
b1c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
b1d0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
b1e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b1f0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
b200: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
b210: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
b220: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
b230: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b240: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
b250: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
b260: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b270: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
b280: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
b290: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
b2a0: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
b2b0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
b2c0: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
b2d0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
b2e0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
b2f0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
b300: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
b310: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
b320: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
b330: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
b340: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
b350: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
b360: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
b370: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
b380: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
b390: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
b3a0: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
b3b0: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
b3c0: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
b3d0: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
b3e0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
b3f0: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
b400: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
b410: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
b420: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
b430: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
b440: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
b450: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
b460: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
b470: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
b480: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
b490: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
b4a0: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
b4b0: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
b4c0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
b4d0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
b4e0: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
b4f0: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
b500: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
b510: 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
b520: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
b530: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
b540: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
b550: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b560: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
b570: 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56  rite==db->writeV
b580: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
b590: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
b5a0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
b5b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
b5c0: 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68  r every Btree th
b5d0: 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  at in database c
b5e0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69  onnection db whi
b5f0: 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ch .** has been 
b600: 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22  modified, "trip"
b610: 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65   or invalidate e
b620: 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a  ach cursor in.**
b630: 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68   that Btree migh
b640: 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  t have been modi
b650: 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  fied so that the
b660: 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e   cursor.** can n
b670: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61  ever be used aga
b680: 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  in.  This happen
b690: 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  s when a rollbac
b6a0: 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57  k.*** occurs.  W
b6b0: 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61  e have to trip a
b6c0: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72  ll the other cur
b6d0: 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75  sors, even.** cu
b6e0: 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20  rsor from other 
b6f0: 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  VMs in different
b700: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
b710: 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61  tions,.** so tha
b720: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74  t none of them t
b730: 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61  ry to use the da
b740: 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79  ta at which they
b750: 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e  .** were pointin
b760: 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20  g and which now 
b770: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68  may have been ch
b780: 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20  anged due.** to 
b790: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
b7a0: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
b7b0: 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e  t a rollback can
b7c0: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63   delete tables c
b7d0: 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72  omplete and.** r
b7e0: 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73  eorder rootpages
b7f0: 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20  .  So it is not 
b800: 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20  sufficient just 
b810: 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73  to save.** the s
b820: 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
b830: 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  or.  We have to 
b840: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
b850: 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74  ursor.** so that
b860: 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65   it is never use
b870: 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  d again..*/.stat
b880: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
b890: 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
b8a0: 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65  iedBtrees(sqlite
b8b0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
b8c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
b8d0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
b8e0: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
b8f0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
b900: 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33  if( p && sqlite3
b910: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
b920: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b930: 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
b940: 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f  rsors(p, SQLITE_
b950: 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20  ABORT);.    }.  
b960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
b970: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
b980: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
b990: 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
b9a0: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
b9b0: 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
b9c0: 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
b9d0: 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
b9e0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
b9f0: 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
ba00: 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
ba10: 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
ba20: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
ba30: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
ba40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
ba50: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
ba60: 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
ba70: 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
ba80: 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
ba90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
baa0: 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ommtted..**.** I
bab0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
bac0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
bad0: 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
bae0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
baf0: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
bb00: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
bb10: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
bb20: 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
bb30: 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
bb40: 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
bb50: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
bb60: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bb70: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74  ;.  if( p->iStat
bb80: 65 6d 65 6e 74 20 26 26 20 41 4c 57 41 59 53 28  ement && ALWAYS(
bb90: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 29 20  db->nStatement) 
bba0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
bbb0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
bbc0: 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
bbd0: 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61  tement-1;..    a
bbe0: 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
bbf0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
bc00: 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
bc10: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61  _RELEASE);.    a
bc20: 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
bc30: 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61  ement>0 );.    a
bc40: 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
bc50: 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
bc60: 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
bc70: 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f  oint) );..    fo
bc80: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
bc90: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
bca0: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
bcb0: 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  OK;.      Btree 
bcc0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
bcd0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
bce0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
bcf0: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
bd00: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
bd10: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
bd20: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
bd30: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
bd40: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
bd50: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
bd60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
bd70: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
bd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
bd90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
bda0: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
bdb0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
bdc0: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
bdd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bde0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bdf0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
be00: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20  c = rc2;.       
be10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
be20: 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  .    db->nStatem
be30: 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53  ent--;.    p->iS
be40: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
be50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
be60: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ../*.** If SQLit
be70: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
be80: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
be90: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
bea0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
beb0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
bec0: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
bed0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
bee0: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
bef0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
bf00: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
bf10: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
bf20: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
bf30: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
bf40: 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  it.** sets the B
bf50: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
bf60: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
bf70: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
bf80: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
bf90: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
bfa0: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
bfb0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
bfc0: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
bfd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
bfe0: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
bff0: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
c000: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
c010: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
c020: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c030: 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  All() is invoked
c040: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
c050: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
c060: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
c070: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
c080: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
c090: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
c0a0: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
c0b0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
c0c0: 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79  . Of course only
c0d0: 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65   a subset of the
c0e0: 73 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  se structures.**
c0f0: 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73 65   will be accesse
c100: 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e 64  d by the VM, and
c110: 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56 64   we could use Vd
c120: 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f 20  be.btreeMask to 
c130: 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20 73  figure.** that s
c140: 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20 74  ubset out, but t
c150: 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e  here is no advan
c160: 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f  tage to doing so
c170: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
c180: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
c190: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
c1a0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
c1b0: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
c1c0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
c1d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e  a no-op..*/.#ifn
c1e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c1f0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f 69  SHARED_CACHE.voi
c200: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74  d sqlite3VdbeMut
c210: 65 78 41 72 72 61 79 45 6e 74 65 72 28 56 64 62  exArrayEnter(Vdb
c220: 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  e *p){.#if SQLIT
c230: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73  E_THREADSAFE.  s
c240: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
c250: 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61  ArrayEnter(&p->a
c260: 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20  Mutex);.#else.  
c270: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c280: 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e  rAll(p->db);.#en
c290: 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  dif.}.#endif../*
c2a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c2b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
c2c0: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
c2d0: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
c2e0: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
c2f0: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
c300: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
c310: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
c320: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
c330: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
c340: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
c350: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
c360: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
c370: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
c380: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
c390: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
c3a0: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
c3b0: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
c3c0: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
c3d0: 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
c3e0: 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
c3f0: 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
c400: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
c410: 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
c420: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
c430: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
c440: 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
c450: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
c460: 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
c470: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
c480: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
c490: 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
c4a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
c4b0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
c4c0: 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
c4d0: 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
c4e0: 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
c4f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
c500: 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
c510: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
c540: 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
c550: 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
c560: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c570: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
c580: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
c590: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
c5a0: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
c5b0: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
c5c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
c5d0: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
c5e0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
c5f0: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
c600: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
c610: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
c620: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
c630: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
c640: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
c650: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
c660: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
c670: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
c680: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
c690: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
c6a0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
c6b0: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
c6c0: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
c6d0: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
c6e0: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
c6f0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
c700: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
c710: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
c720: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
c730: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
c740: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
c750: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
c760: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
c770: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
c780: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
c790: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
c7a0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
c7b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
c7c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
c7d0: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
c7e0: 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
c7f0: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
c800: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
c810: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c820: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
c830: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
c840: 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
c850: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
c860: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
c870: 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
c880: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
c890: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  pc>=0 ){.    int
c8a0: 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
c8b0: 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
c8c0: 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
c8d0: 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
c8e0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
c8f0: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
c900: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
c910: 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
c920: 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
c930: 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
c940: 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
c950: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
c960: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c970: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
c980: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
c990: 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
c9a0: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
c9b0: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
c9c0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  rc & 0xff;.    a
c9d0: 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
c9e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
c9f0: 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65  ED );  /* This e
ca00: 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65  rror no longer e
ca10: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53  xists */.    isS
ca20: 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
ca30: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
ca40: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
ca50: 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
ca60: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
ca70: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
ca80: 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
ca90: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
caa0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
cab0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
cac0: 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
cad0: 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64  -only, we need d
cae0: 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74  o no rollback at
caf0: 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c   all. Otherwise,
cb00: 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65  .      ** procee
cb10: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
cb20: 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
cb30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
cb40: 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
cb50: 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
cb60: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
cb70: 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
cb80: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
cb90: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
cba0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
cbb0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
cbc0: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
cbd0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
cbe0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
cbf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
cc00: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
cc10: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
cc20: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
cc30: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
cc40: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
cc50: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
cc60: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
cc70: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
cc80: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
cc90: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cca0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
ccb0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
ccc0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
ccd0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
cce0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
ccf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
cd00: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
cd10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
cd20: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
cd30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cd40: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
cd50: 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
cd60: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
cd70: 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
cd80: 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72  e only active wr
cd90: 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c  iter .    ** VM,
cda0: 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68   then we do eith
cdb0: 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72  er a commit or r
cdc0: 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63  ollback of the c
cdd0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
cde0: 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on. .    **.    
cdf0: 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c  ** Note: This bl
ce00: 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66  ock also runs if
ce10: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
ce20: 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c  ial errors handl
ce30: 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ed .    ** above
ce40: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
ce50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
ce60: 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e  sqlite3VtabInSyn
ce70: 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64  c(db) .     && d
ce80: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20  b->autoCommit . 
ce90: 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65      && db->write
cea0: 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61  VdbeCnt==(p->rea
ceb0: 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 20  dOnly==0) .     
cec0: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
ced0: 53 51 4c 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73  SQLITE_CommitBus
cee0: 79 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  y)==0.    ){.   
cef0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
cf00: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
cf10: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
cf20: 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
cf30: 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
cf40: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
cf50: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
cf60: 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65  ue, and the vdbe
cf70: 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20   program was .  
cf80: 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73        ** success
cf90: 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f  ful or hit an 'O
cfa0: 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
cfb0: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  nt. This means a
cfc0: 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
cfd0: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
cfe0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
cff0: 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
d000: 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
d010: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d020: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
d030: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
d040: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
d050: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
d060: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d070: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
d080: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
d090: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d0a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
d0b0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
d0c0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
d0d0: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
d0e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d0f0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
d100: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
d110: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d130: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
d140: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
d150: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
d160: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
d170: 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
d180: 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
d190: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d1a0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
d1b0: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
d1c0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
d1d0: 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
d1e0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
d1f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
d200: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
d210: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
d220: 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
d230: 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
d240: 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
d250: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  e{.        inval
d260: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
d270: 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
d280: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d290: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
d2a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d2b0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
d2c0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
d2d0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
d2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d2f0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
d300: 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
d310: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
d320: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d330: 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
d340: 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
d350: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
d360: 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
d370: 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
d380: 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
d390: 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
d3a0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
d3b0: 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
d3c0: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
d3d0: 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
d3e0: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
d3f0: 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
d400: 41 49 4e 54 2c 20 74 68 65 6e 20 73 65 74 20 74  AINT, then set t
d410: 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
d420: 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 20  code to the new 
d430: 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  value..    */.  
d440: 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
d450: 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
d460: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
d470: 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
d480: 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
d490: 20 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d     if( rc && (p-
d4a0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
d4b0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
d4c0: 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20  CONSTRAINT) ){. 
d4d0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
d4e0: 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  c;.        sqlit
d4f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d500: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
d510: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
d520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d530: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
d540: 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
d550: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
d560: 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
d570: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
d580: 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
d590: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
d5a0: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
d5b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
d5c0: 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
d5d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
d5e0: 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e  angeCntOn && p->
d5f0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  pc>=0 ){.      i
d600: 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
d610: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
d620: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
d630: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
d640: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
d650: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
d660: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
d670: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
d680: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
d690: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
d6a0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
d6b0: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
d6c0: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
d6d0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
d6e0: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
d6f0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
d700: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
d710: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
d720: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
d730: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
d740: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
d750: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
d760: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
d770: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
d780: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
d790: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
d7a0: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
d7b0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
d7c0: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
d7d0: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
d7e0: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
d7f0: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
d800: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
d810: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
d820: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
d830: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
d840: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
d850: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  nt--;.    if( !p
d860: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
d870: 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62      db->writeVdb
d880: 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  eCnt--;.    }.  
d890: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
d8a0: 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d  tiveVdbeCnt>=db-
d8b0: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
d8c0: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
d8d0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
d8e0: 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
d8f0: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
d900: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
d910: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
d920: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
d930: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
d940: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
d950: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
d960: 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
d970: 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
d980: 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
d990: 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
d9a0: 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
d9b0: 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
d9c0: 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
d9d0: 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
d9e0: 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
d9f0: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
da00: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
da10: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
da20: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
da30: 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
da40: 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
da50: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69  assert( db->acti
da60: 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64  veVdbeCnt>0 || d
da70: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
da80: 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
da90: 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
daa0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dab0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
dac0: 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
dad0: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
dae0: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
daf0: 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
db00: 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
db10: 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
db20: 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
db30: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
db40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
db50: 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
db60: 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
db70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
db80: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
db90: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
dba0: 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
dbb0: 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
dbc0: 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
dbd0: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
dbe0: 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
dbf0: 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
dc00: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
dc10: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
dc20: 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
dc30: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
dc40: 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
dc50: 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
dc60: 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
dc70: 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
dc80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
dc90: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
dca0: 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
dcb0: 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
dcc0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
dcd0: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
dce0: 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
dcf0: 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
dd00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
dd10: 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
dd20: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
dd30: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
dd40: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
dd50: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
dd60: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
dd70: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
dd80: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
dd90: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
dda0: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
ddb0: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
ddc0: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
ddd0: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
dde0: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
ddf0: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
de00: 70 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  p);.  (void)sqli
de10: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
de20: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
de30: 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
de40: 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
de50: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
de60: 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
de70: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
de80: 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
de90: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
dea0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
deb0: 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
dec0: 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
ded0: 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
dee0: 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
def0: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
df00: 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
df10: 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
df20: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
df30: 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
df40: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
df50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
df60: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
df70: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
df80: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
df90: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
dfa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
dfb0: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
dfc0: 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53  ,-1,p->zErrMsg,S
dfd0: 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54  QLITE_UTF8,SQLIT
dfe0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
dff0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
e000: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
e010: 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
e020: 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73  = p->rc;.      s
e030: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e040: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
e050: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
e060: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
e070: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
e080: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
e090: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
e0a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
e0b0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
e0c0: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
e0d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
e0e0: 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
e0f0: 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
e100: 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
e110: 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
e120: 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
e130: 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
e140: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
e150: 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
e160: 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
e170: 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
e180: 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
e190: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
e1a0: 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
e1b0: 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
e1c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e1d0: 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
e1e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
e1f0: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
e200: 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
e210: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
e220: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
e230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e240: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
e250: 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
e260: 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
e270: 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
e280: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
e290: 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
e2a0: 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
e2b0: 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
e2c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
e2d0: 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
e2e0: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
e2f0: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
e300: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
e310: 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
e320: 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
e330: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
e340: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
e350: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
e360: 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
e370: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
e380: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
e390: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
e3a0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
e3b0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
e3c0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
e3d0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
e3e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
e3f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
e400: 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
e410: 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
e420: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
e430: 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
e440: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
e450: 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
e460: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
e470: 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
e480: 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
e490: 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
e4a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e4b0: 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
e4c0: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
e4d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
e4e0: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
e4f0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
e500: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
e510: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74  AGIC_INIT;.  ret
e520: 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
e530: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
e540: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
e550: 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
e560: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
e570: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
e580: 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
e590: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
e5a0: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
e5b0: 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
e5c0: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
e5d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
e5e0: 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
e5f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e600: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
e610: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
e620: 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
e630: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
e640: 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
e650: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
e660: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
e670: 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
e680: 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
e690: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
e6a0: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
e6b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e6c0: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
e6d0: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
e6e0: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
e6f0: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
e700: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
e710: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
e720: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
e730: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
e740: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
e750: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
e760: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
e770: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
e780: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
e790: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
e7a0: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
e7b0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
e7c0: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
e7d0: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
e7e0: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
e7f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
e800: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
e810: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
e820: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
e830: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
e840: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
e850: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75  1 || !(mask&(((u
e860: 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70  32)1)<<i))) && p
e870: 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
e880: 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
e890: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
e8a0: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
e8b0: 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
e8c0: 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
e8d0: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
e8e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
e8f0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
e900: 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
e910: 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
e920: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
e930: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
e940: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
e950: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
e960: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
e970: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
e980: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
e990: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
e9a0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
e9b0: 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
e9c0: 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
e9d0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
e9e0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
e9f0: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
ea00: 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
ea10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
ea20: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
ea30: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66   = p->aOp;.    f
ea40: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
ea50: 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i++, pOp++){. 
ea60: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
ea70: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
ea80: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
ea90: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
eaa0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
eab0: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
eac0: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
ead0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
eae0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
eaf0: 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
eb00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
eb10: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
eb20: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
eb30: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
eb40: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
eb50: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
eb60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
eb70: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
eb80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
eb90: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61  ->zSql);.  p->ma
eba0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
ebb0: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33  _DEAD;.  sqlite3
ebc0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4f  DbFree(db, p->aO
ebd0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
ebe0: 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
ebf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
ec00: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
ec10: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
ec20: 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
ec30: 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
ec40: 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
ec50: 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
ec60: 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
ec70: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
ec80: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
ec90: 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
eca0: 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
ecb0: 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
ecc0: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
ecd0: 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
ece0: 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
ecf0: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
ed00: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
ed10: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
ed20: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
ed30: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
ed40: 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
ed50: 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
ed60: 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
ed70: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
ed80: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
ed90: 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
eda0: 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
edb0: 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
edc0: 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
edd0: 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
ede0: 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
edf0: 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
ee00: 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
ee10: 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
ee20: 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
ee30: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
ee40: 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
ee50: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
ee60: 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
ee70: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
ee80: 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
ee90: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
eea0: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
eeb0: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
eec0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
eed0: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
eee0: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
eef0: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
ef00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
ef10: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
ef20: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
ef30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
ef40: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
ef50: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
ef60: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
ef70: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
ef80: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
ef90: 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
efa0: 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  t;.    p->rowidI
efb0: 73 56 61 6c 69 64 20 3d 20 41 4c 57 41 59 53 28  sValid = ALWAYS(
efc0: 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20 20  res==0) ?1:0;.  
efd0: 20 20 69 66 28 20 4e 45 56 45 52 28 72 65 73 3c    if( NEVER(res<
efe0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  0) ){.      rc =
eff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
f000: 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  t(p->pCursor, &r
f010: 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
f020: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
f030: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
f040: 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
f050: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
f060: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
f070: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
f080: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
f090: 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
f0a0: 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  _STALE;.  }else 
f0b0: 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 29  if( p->pCursor )
f0c0: 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
f0d0: 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
f0e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
f0f0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
f100: 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
f110: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
f120: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f130: 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
f140: 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
f150: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
f160: 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
f170: 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
f180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
f190: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f1a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
f1b0: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
f1c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f1d0: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
f1e0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
f1f0: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
f200: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
f210: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
f220: 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
f230: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
f240: 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
f250: 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
f260: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
f270: 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
f280: 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
f290: 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
f2a0: 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
f2b0: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
f2c0: 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
f2d0: 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
f2e0: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
f2f0: 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
f300: 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
f310: 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
f320: 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
f330: 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
f340: 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
f350: 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
f360: 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
f370: 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
f380: 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
f390: 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
f3a0: 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
f3b0: 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
f3c0: 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
f3d0: 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
f3e0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
f3f0: 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
f400: 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
f410: 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
f420: 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
f430: 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
f440: 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
f450: 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
f460: 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
f470: 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
f480: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
f490: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
f4a0: 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
f4b0: 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
f4c0: 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
f4d0: 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
f4e0: 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
f4f0: 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
f500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
f510: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
f520: 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
f530: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
f560: 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
f590: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
f5a0: 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
f5c0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
f5d0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
f5e0: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
f5f0: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
f600: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
f610: 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
f640: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
f650: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
f660: 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
f670: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
f680: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
f690: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
f6a0: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
f6b0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
f6c0: 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
f6f0: 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
f700: 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
f710: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
f720: 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
f730: 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
f760: 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
f770: 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
f7a0: 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
f7b0: 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
f7c0: 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
f7d0: 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
f7e0: 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
f7f0: 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
f800: 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
f810: 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
f820: 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
f830: 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
f840: 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
f850: 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
f860: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
f870: 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
f880: 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
f890: 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
f8a0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
f8b0: 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
f8c0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
f8d0: 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
f8e0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f8f0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
f900: 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
f910: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
f920: 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
f930: 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
f940: 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
f950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f960: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
f970: 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
f980: 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
f990: 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
f9a0: 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
f9b0: 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
f9c0: 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
f9d0: 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
f9e0: 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
f9f0: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
fa00: 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   u;.    if( file
fa10: 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69  _format>=4 && (i
fa20: 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  &1)==i ){.      
fa30: 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b  return 8+(u32)i;
fa40: 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69  .    }.    u = i
fa50: 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20  <0 ? -i : i;.   
fa60: 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65   if( u<=127 ) re
fa70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
fa80: 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
fa90: 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
faa0: 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
fab0: 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
fac0: 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
fad0: 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
fae0: 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
faf0: 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
fb00: 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
fb10: 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
fb20: 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
fb30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
fb40: 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
fb50: 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
fb60: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
fb70: 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e  );.  n = pMem->n
fb80: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
fb90: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
fba0: 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
fbb0: 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ro;.  }.  assert
fbc0: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( n>=0 );.  retu
fbd0: 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
fbe0: 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
fbf0: 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
fc00: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
fc10: 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
fc20: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
fc30: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
fc40: 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
fc50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
fc60: 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
fc70: 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
fc80: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
fc90: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
fca0: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
fcb0: 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
fcc0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
fcd0: 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
fce0: 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
fcf0: 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
fd00: 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
fd10: 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
fd20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
fd30: 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
fd40: 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
fd50: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
fd60: 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
fd70: 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
fd80: 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
fd90: 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
fda0: 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
fdb0: 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
fdc0: 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
fdd0: 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
fde0: 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
fdf0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
fe00: 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
fe10: 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
fe20: 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
fe30: 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
fe40: 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
fe50: 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
fe60: 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
fe70: 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
fe80: 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
fe90: 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
fea0: 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
feb0: 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
fec0: 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
fed0: 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
fee0: 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
fef0: 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
ff00: 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
ff10: 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
ff20: 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
ff30: 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
ff40: 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
ff50: 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
ff60: 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
ff70: 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
ff80: 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
ff90: 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
ffa0: 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
ffb0: 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
ffc0: 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
ffd0: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
ffe0: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
fff0: 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
10000 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
10010 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
10020 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
10030 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
10040 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
10050 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
10060 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
10070 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
10080 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
10090 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
100a0 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
100b0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
100c0 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
100d0 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
100e0 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
100f0 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
10100 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
10110 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
10120 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
10130 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
10140 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
10150 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
10160 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
10170 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
10180 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
10190 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
101a0 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
101b0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
101c0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
101d0 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
101e0 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
101f0 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
10200 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
10210 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
10220 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
10230 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
10240 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
10250 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
10260 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
10270 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
10280 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
10290 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
102a0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
102b0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
102c0 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
102d0 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
102e0 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
102f0 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
10300 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
10310 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
10320 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
10330 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
10340 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
10350 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
10360 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
10370 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
10380 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
10390 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
103a0 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
103b0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
103c0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
103d0 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
103e0 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
103f0 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
10400 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
10410 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
10420 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
10430 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
10440 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
10450 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
10460 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
10470 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
10480 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
10490 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
104a0 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
104b0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
104c0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
104d0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
104e0 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
104f0 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
10500 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
10510 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
10520 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
10530 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
10540 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
10550 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
10560 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
10570 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
10580 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
10590 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
105a0 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
105b0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
105c0 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79   nBuf must alway
105d0 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e  s be.** large en
105e0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
105f0 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20   entire field.  
10600 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66  Except, if the f
10610 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f  ield is.** a blo
10620 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69  b with a zero-fi
10630 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20  lled tail, then 
10640 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a  buf[] might be j
10650 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a  ust the right.**
10660 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76   size to hold ev
10670 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20  erything except 
10680 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c  for the zero-fil
10690 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75  led tail.  If bu
106a0 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62  f[].** is only b
106b0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
106c0 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70  d the non-zero p
106d0 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79  refix, then only
106e0 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70   write that.** p
106f0 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d  refix into buf[]
10700 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20  .  But if buf[] 
10710 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
10720 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
10730 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74  .** prefix and t
10740 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69  he tail then wri
10750 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e  te the prefix an
10760 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74  d set the tail t
10770 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a  o all.** zeros..
10780 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
10790 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
107a0 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
107b0 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
107c0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
107d0 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
107e0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
107f0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
10800 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
10810 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
10820 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
10830 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
10840 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
10850 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
10860 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a   int nBuf, Mem *
10870 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
10880 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65  ormat){.  u32 se
10890 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
108a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
108b0 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72  e(pMem, file_for
108c0 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  mat);.  u32 len;
108d0 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
108e0 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
108f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
10900 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
10910 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
10920 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
10930 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
10940 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
10950 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
10960 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a  eof(pMem->r) );.
10970 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
10980 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f   &pMem->r, sizeo
10990 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
109a0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
109b0 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
109c0 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
109d0 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
109e0 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
109f0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
10a00 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
10a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e  .    assert( len
10a20 3c 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20  <=(u32)nBuf );. 
10a30 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
10a40 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
10a50 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
10a60 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
10a70 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
10a80 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
10a90 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
10aa0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
10ab0 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
10ac0 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
10ad0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
10ae0 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
10af0 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
10b00 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
10b10 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
10b20 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
10b30 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pe) );.    asser
10b40 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66  t( pMem->n<=nBuf
10b50 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
10b60 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
10b70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
10b80 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  len);.    if( pM
10b90 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
10ba0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65  Zero ){.      le
10bb0 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
10bc0 72 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ro;.      assert
10bd0 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20  ( nBuf>=0 );.   
10be0 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33     if( len > (u3
10bf0 32 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  2)nBuf ){.      
10c00 20 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75    len = (u32)nBu
10c10 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
10c20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
10c30 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
10c40 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
10c50 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
10c60 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
10c70 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
10c80 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
10c90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
10ca0 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
10cb0 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
10cc0 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
10cd0 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
10ce0 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
10cf0 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
10d00 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
10d10 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
10d20 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  d..*/ .u32 sqlit
10d30 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
10d40 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
10d50 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
10d60 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
10d70 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
10d80 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
10d90 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
10da0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
10db0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
10dc0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
10df0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
10e00 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
10e10 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
10e20 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
10e30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
10e40 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
10e50 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
10e60 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
10e70 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
10e80 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
10e90 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
10ea0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
10eb0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
10ec0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10ed0 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
10ee0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
10ef0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
10f00 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
10f10 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
10f20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
10f30 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
10f40 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
10f50 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
10f60 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
10f70 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
10f80 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
10f90 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
10fa0 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
10fb0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
10fc0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
10fd0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
10fe0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
10ff0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
11000 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
11010 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
11020 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
11030 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
11040 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
11050 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
11060 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
11070 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
11080 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
11090 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
110a0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
110b0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
110c0 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
110d0 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
110e0 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
110f0 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
11100 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
11110 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
11120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11130 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
11140 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
11150 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
11160 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
11170 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
11180 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
11190 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
111a0 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
111b0 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
111c0 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
111d0 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
111e0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
111f0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
11200 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
11210 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
11220 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
11230 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
11240 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
11250 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
11260 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
11270 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
11280 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
11290 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
112a0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
112b0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
112c0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
112d0 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
112e0 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
112f0 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
11300 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
11310 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
11320 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
11330 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
11340 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
11350 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
11360 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
11370 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
11380 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
11390 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
113a0 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
113b0 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
113c0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
113d0 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
113e0 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
113f0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
11400 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
11410 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
11420 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
11430 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
11440 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
11450 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
11460 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
11470 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
11480 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
11490 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
114a0 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
114b0 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
114c0 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
114d0 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
114e0 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
114f0 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
11500 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
11510 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
11520 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
11530 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
11540 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
11550 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
11560 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
11570 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
11580 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
11590 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
115a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
115b0 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
115c0 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
115d0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
115e0 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
115f0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
11600 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
11610 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
11620 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
11630 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72  te3IsNaN(pMem->r
11640 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
11650 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
11660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
11670 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11680 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
11690 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
116a0 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
116b0 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
116c0 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
116d0 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
116e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
116f0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
11700 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
11710 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33  ault: {.      u3
11720 32 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  2 len = (serial_
11730 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
11740 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
11750 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
11760 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
11770 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
11780 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
11790 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
117a0 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
117b0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
117c0 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
117d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
117e0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
117f0 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
11800 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
11810 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
11820 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11830 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
11840 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
11850 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
11860 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
11870 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a  [], parse the.**
11880 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55   record into a U
11890 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
118a0 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
118b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
118c0 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e   that structure.
118d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
118e0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68  ng function migh
118f0 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63  t provide szSpac
11900 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  e bytes of memor
11910 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53  y.** space at pS
11920 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63  pace.  This spac
11930 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
11940 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
11950 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64  ed.** VDbeParsed
11960 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
11970 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   if it is large 
11980 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69  enough.  If it i
11990 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f  s.** not big eno
119a0 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62  ugh, space is ob
119b0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
119c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
119d0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
119e0 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c   structure shoul
119f0 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61  d be closed by a
11a00 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
11a10 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
11a20 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a  ackedRecord()..*
11a30 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  / .UnpackedRecor
11a40 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65  d *sqlite3VdbeRe
11a50 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
11a60 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
11a70 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
11a80 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
11a90 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
11aa0 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
11ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
11ac0 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
11ad0 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
11ae0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
11af0 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
11b00 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
11b10 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
11b20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
11b30 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
11b40 6f 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63  o hold the objec
11b50 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  t */.  int szSpa
11b60 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ce            /*
11b70 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
11b80 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  ] in bytes */.){
11b90 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
11ba0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
11bb0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11bc0 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e  har *)pKey;.  Un
11bd0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
11be0 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65    /* The unpacke
11bf0 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 77 65  d record that we
11c00 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a   will return */.
11c10 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
11c20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
11c30 73 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20  space needed to 
11c40 68 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65 73  hold p, in bytes
11c50 20 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75   */.  int d;.  u
11c60 33 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b  32 idx;.  u16 u;
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c80 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
11c90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
11ca0 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
11cb0 65 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20  em;.  int nOff; 
11cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
11cd0 72 65 61 73 65 20 70 53 70 61 63 65 20 62 79 20  rease pSpace by 
11ce0 74 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d 62  this much to 8-b
11cf0 79 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a  yte align it */.
11d00 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20    .  /*.  ** We 
11d10 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68  want to shift th
11d20 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65  e pointer pSpace
11d30 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74   up such that it
11d40 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   is 8-byte align
11d50 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77  ed..  ** Thus, w
11d60 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c  e need to calcul
11d70 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66  ate a value, nOf
11d80 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  f, between 0 and
11d90 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20   7, to shift .  
11da0 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53  ** it by.  If pS
11db0 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20  pace is already 
11dc0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20  8-byte aligned, 
11dd0 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a  nOff should be z
11de0 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66  ero..  */.  nOff
11df0 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f   = (8 - (SQLITE_
11e00 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63  PTR_TO_INT(pSpac
11e10 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20  e) & 7)) & 7;.  
11e20 70 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a  pSpace += nOff;.
11e30 20 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66    szSpace -= nOf
11e40 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  f;.  nByte = ROU
11e50 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
11e60 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
11e70 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
11e80 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a  nfo->nField+1);.
11e90 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
11ea0 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  ace ){.    p = s
11eb0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
11ec0 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
11ed0 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
11ee0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
11ef0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
11f00 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52  UNPACKED_NEED_FR
11f10 45 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45  EE | UNPACKED_NE
11f20 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65  ED_DESTROY;.  }e
11f30 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
11f40 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53  packedRecord*)pS
11f50 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  pace;.    p->fla
11f60 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs = UNPACKED_NE
11f70 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a  ED_DESTROY;.  }.
11f80 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
11f90 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
11fa0 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
11fb0 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
11fc0 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d  p->aMem = pMem =
11fd0 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
11fe0 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
11ff0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
12000 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  )];.  assert( EI
12010 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
12020 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
12030 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
12040 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
12050 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
12060 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
12070 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
12080 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
12090 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
120a0 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
120b0 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
120c0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
120d0 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65 79 20      if( d>=nKey 
120e0 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
120f0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
12100 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62 72 65  al_type)>0 ) bre
12110 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ak;.    pMem->en
12120 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
12130 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
12140 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
12150 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
12160 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  = 0;.    pMem->z
12170 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
12180 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
12190 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
121a0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
121b0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
121c0 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d  ++;.    u++;.  }
121d0 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
121e0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
121f0 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
12200 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20  d = u;.  return 
12210 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a  (void*)p;.}../*.
12220 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12230 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63  destroys a Unpac
12240 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74  kedRecord object
12250 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12260 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
12270 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63 6b  kedRecord(Unpack
12280 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
12290 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d  int i;.  Mem *pM
122a0 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
122b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
122c0 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41   p->flags & UNPA
122d0 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
122e0 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Y );.  for(i=0, 
122f0 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c  pMem=p->aMem; i<
12300 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20  p->nField; i++, 
12310 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  pMem++){.    if(
12320 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
12330 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
12340 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
12350 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
12360 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12370 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52  UNPACKED_NEED_FR
12380 45 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EE ){.    sqlite
12390 33 44 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49  3DbFree(p->pKeyI
123a0 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  nfo->db, p);.  }
123b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
123c0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
123d0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
123e0 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
123f0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
12400 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
12410 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
12420 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
12430 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
12440 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
12450 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
12460 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
12470 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
12480 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
12490 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
124a0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
124b0 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
124c0 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  y th OP_MakeReco
124d0 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
124e0 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
124f0 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
12500 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
12510 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
12520 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
12530 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
12540 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
12550 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
12560 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
12570 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
12580 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79  elds..** The key
12590 20 77 69 74 68 20 66 65 77 65 72 20 66 69 65 6c   with fewer fiel
125a0 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f  ds is usually co
125b0 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e  mpares less than
125c0 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20   the .** longer 
125d0 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66  key.  However if
125e0 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e   the UNPACKED_IN
125f0 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70  CRKEY flags in p
12600 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20  PKey2 is set.** 
12610 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  and the common p
12620 72 65 66 69 78 65 73 20 61 72 65 20 65 71 75 61  refixes are equa
12630 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20  l, then key1 is 
12640 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a  less than key2..
12650 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50  ** Or if the UNP
12660 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46  ACKED_MATCH_PREF
12670 49 58 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  IX flag is set a
12680 6e 64 20 74 68 65 20 70 72 65 66 69 78 65 73 20  nd the prefixes 
12690 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68  are.** equal, th
126a0 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  en the keys are 
126b0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
126c0 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68   equal and.** th
126d0 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74  e parts beyond t
126e0 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
126f0 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a   are ignored..**
12700 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43  .** If the UNPAC
12710 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
12720 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
12730 65 6e 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  en the last byte
12740 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   of.** the heade
12750 72 20 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67  r of pKey1 is ig
12760 6e 6f 72 65 64 2e 20 20 49 74 20 69 73 20 61 73  nored.  It is as
12770 73 75 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31  sumed that pKey1
12780 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20   is.** an index 
12790 6b 65 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e  key, and thus en
127a0 64 73 20 77 69 74 68 20 61 20 72 6f 77 69 64 20  ds with a rowid 
127b0 76 61 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74  value.  The last
127c0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
127d0 68 65 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72  header will ther
127e0 65 66 6f 72 65 20 62 65 20 74 68 65 20 73 65 72  efore be the ser
127f0 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
12800 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66  rowid:.** one of
12810 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20   1, 2, 3, 4, 5, 
12820 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65  6, 8, or 9 - the
12830 20 69 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20   integer serial 
12840 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65  types..** The se
12850 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
12860 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c   final rowid wil
12870 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 73 69  l always be a si
12880 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79  ngle byte..** By
12890 20 69 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c   ignoring this l
128a0 61 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  ast byte of the 
128b0 68 65 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65  header, we force
128c0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
128d0 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
128e0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
128f0 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e  d of key1..*/.in
12900 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
12910 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
12920 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
12930 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
12940 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
12950 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
12960 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
12970 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
12980 69 6e 74 20 64 31 3b 20 20 20 20 20 20 20 20 20  int d1;         
12990 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
129a0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
129b0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
129c0 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
129d0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
129e0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
129f0 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
12a00 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
12a10 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
12a20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
12a30 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
12a40 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
12a50 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
12a60 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
12a70 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
12a80 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
12a90 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
12aa0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
12ab0 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
12ac0 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
12ad0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
12ae0 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
12af0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
12b00 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
12b10 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66  fo->db;.  mem1.f
12b20 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31  lags = 0;.  mem1
12b30 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2a 20 6e 6f  .u.i = 0;  /* no
12b40 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
12b50 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
12b60 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
12b70 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  mem1.zMalloc = 0
12b80 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  ;.  .  idx1 = ge
12b90 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
12ba0 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
12bb0 20 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70   szHdr1;.  if( p
12bc0 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
12bd0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
12be0 4f 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64  OWID ){.    szHd
12bf0 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65  r1--;.  }.  nFie
12c00 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
12c10 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20  Field;.  while( 
12c20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
12c30 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
12c40 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
12c50 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
12c60 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
12c70 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
12c80 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
12c90 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
12ca0 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
12cb0 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
12cc0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
12cd0 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
12ce0 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
12cf0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
12d00 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
12d10 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
12d20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
12d30 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
12d40 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
12d50 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
12d60 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
12d70 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
12d80 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
12d90 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
12da0 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
12db0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
12dc0 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
12dd0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a  PKey2->aMem[i],.
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69             i<nFi
12e00 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld ? pKeyInfo->
12e10 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20  aColl[i] : 0);. 
12e20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
12e30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12e40 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a   }.    i++;.  }.
12e50 20 20 69 66 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c    if( mem1.zMall
12e60 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  oc ) sqlite3Vdbe
12e70 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
12e80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
12e90 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c  PREFIX_SEARCH fl
12ea0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c  ag is set and al
12eb0 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74 20  l fields except 
12ec0 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 72  the final.  ** r
12ed0 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65 20  owid field were 
12ee0 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61  equal, then clea
12ef0 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41  r the PREFIX_SEA
12f00 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65 74  RCH flag and set
12f10 20 0a 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72   .  ** pPKey2->r
12f20 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75  owid to the valu
12f30 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66  e of the rowid f
12f40 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20  ield in (pKey1, 
12f50 6e 4b 65 79 31 29 2e 0a 20 20 2a 2a 20 54 68 69  nKey1)..  ** Thi
12f60 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
12f70 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63   OP_IsUnique opc
12f80 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
12f90 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26  (pPKey2->flags &
12fa0 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
12fb0 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d 28  _SEARCH) && i==(
12fc0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31  pPKey2->nField-1
12fd0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
12fe0 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26   idx1==szHdr1 &&
12ff0 20 72 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72   rc );.    asser
13000 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20  t( mem1.flags & 
13010 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 70  MEM_Int );.    p
13020 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20  PKey2->flags &= 
13030 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58  ~UNPACKED_PREFIX
13040 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 70 50 4b  _SEARCH;.    pPK
13050 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d  ey2->rowid = mem
13060 31 2e 75 2e 69 3b 0a 20 20 7d 0a 0a 20 20 69 66  1.u.i;.  }..  if
13070 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ( rc==0 ){.    /
13080 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
13090 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
130a0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
130b0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
130c0 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
130d0 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
130e0 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
130f0 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
13100 5f 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20  _INCRKEY.    ** 
13110 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
13120 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
13130 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
13140 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20   as larger..    
13150 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45  ** If the UPACKE
13160 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66  D_PREFIX_MATCH f
13170 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
13180 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f   keys with commo
13190 6e 20 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a  n prefixes.    *
131a0 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
131b0 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
131c0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
131d0 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
131e0 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20  .    ** larger. 
131f0 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20   As it happens, 
13200 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20  the pPKey2 will 
13210 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f  always be the lo
13220 6e 67 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74  nger.    ** if t
13230 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72  here is a differ
13240 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ence..    */.   
13250 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
13260 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
13270 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72  CRKEY ){.      r
13280 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  c = -1;.    }els
13290 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c  e if( pPKey2->fl
132a0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
132b0 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20  REFIX_MATCH ){. 
132c0 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63       /* Leave rc
132d0 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ==0 */.    }else
132e0 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31   if( idx1<szHdr1
132f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31   ){.      rc = 1
13300 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
13310 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
13320 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b  ortOrder && i<pK
13330 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20  eyInfo->nField. 
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
13350 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
13360 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
13370 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20  rc = -rc;.  }.. 
13380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
13390 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
133a0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
133b0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
133c0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
133d0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
133e0 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
133f0 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
13400 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
13410 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
13420 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
13430 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
13440 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
13450 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
13460 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
13470 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
13480 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
13490 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
134a0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
134b0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
134c0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
134d0 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
134e0 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
134f0 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
13500 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
13510 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
13520 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
13530 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
13540 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
13550 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
13560 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
13570 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
13580 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
13590 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
135a0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
135b0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
135c0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
135d0 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
135e0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
135f0 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
13600 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65   /* Get the size
13610 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
13620 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63  try.  Only indic
13630 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65  es entries of le
13640 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69  ss.  ** than 2Gi
13650 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20  B are support - 
13660 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d  anything large m
13670 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20  ust be database 
13680 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a  corruption..  **
13690 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20   Any corruption 
136a0 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73  is detected in s
136b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
136c0 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67  CellPtr(), thoug
136d0 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  h, so.  ** this 
136e0 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20  code can safely 
136f0 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c  assume that nCel
13700 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20  lKey is 32-bits 
13710 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
13720 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
13730 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
13740 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
13750 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
13760 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
13770 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
13780 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
13790 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
137a0 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d  dex entry */.  m
137b0 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e  .flags = 0;.  m.
137c0 64 62 20 3d 20 64 62 3b 0a 20 20 6d 2e 7a 4d 61  db = db;.  m.zMa
137d0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d  lloc = 0;.  rc =
137e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
137f0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
13800 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
13810 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
13820 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
13830 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
13840 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
13850 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
13860 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
13870 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
13880 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
13890 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
138a0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
138b0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
138c0 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
138d0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
138e0 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
138f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
13900 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
13910 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
13920 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
13930 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
13940 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
13950 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
13960 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
13970 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
13980 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
13990 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
139a0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
139b0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
139c0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
139d0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
139e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
139f0 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
13a00 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
13a10 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
13a20 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
13a30 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
13a40 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
13a50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
13a60 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
13a70 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
13a80 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
13a90 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
13aa0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
13ab0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
13ac0 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
13ad0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
13ae0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
13af0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
13b00 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
13b10 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
13b20 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
13b30 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
13b40 74 63 61 73 65 28 20 6d 2e 6e 3d 3d 73 7a 48 64  tcase( m.n==szHd
13b50 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
13b60 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 6d 2e 6e  if( unlikely(m.n
13b70 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
13b80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
13b90 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
13ba0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
13bb0 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
13bc0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
13bd0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
13be0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
13bf0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
13c00 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
13c10 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
13c20 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
13c30 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
13c40 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
13c50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13c60 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
13c70 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
13c80 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
13c90 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
13ca0 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
13cb0 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
13cc0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
13cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13ce0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
13cf0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
13d00 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
13d10 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
13d20 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
13d30 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
13d40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
13d50 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
13d60 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
13d70 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
13d80 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
13d90 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
13da0 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
13db0 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
13dc0 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
13dd0 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
13de0 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
13df0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
13e00 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
13e10 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
13e20 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
13e30 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
13e40 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
13e50 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
13e60 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
13e70 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
13e80 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
13e90 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
13ea0 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
13eb0 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
13ec0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
13ed0 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
13ee0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
13ef0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
13f00 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
13f10 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
13f20 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
13f30 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
13f40 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
13f50 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
13f60 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
13f70 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
13f80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13f90 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
13fa0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
13fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13fc0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
13fd0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
13fe0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
13ff0 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
14000 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
14010 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
14020 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
14030 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14050 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
14060 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
14070 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
14080 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
14090 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
140a0 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
140b0 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
140c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
140d0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
140e0 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
140f0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
14100 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
14110 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
14120 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
14130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d  LITE_OK;.  }.  m
14140 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61  .db = 0;.  m.fla
14150 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c  gs = 0;.  m.zMal
14160 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  loc = 0;.  rc = 
14170 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
14180 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
14190 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  sor, 0, (int)nCe
141a0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
141b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
141c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
141d0 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65  assert( pUnpacke
141e0 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  d->flags & UNPAC
141f0 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
14200 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c   );.  *res = sql
14210 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
14220 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
14230 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
14240 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
14250 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
14260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14270 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14280 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
14290 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
142a0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
142b0 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
142c0 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
142d0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
142e0 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
142f0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
14300 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
14310 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
14320 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
14330 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14340 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
14350 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
14360 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
14370 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
14380 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
14390 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
143a0 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
143b0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
143c0 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
143d0 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
143e0 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
143f0 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
14400 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
14410 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
14420 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
14430 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
14440 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
14450 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
14460 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14470 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
14480 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
14490 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
144a0 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
144b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
144c0 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
144d0 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
144e0 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
144f0 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
14500 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
14510 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
14520 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
14530 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
14540 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
14550 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
14560 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
14570 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
14580 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
14590 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
145a0 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
145b0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
145c0 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
145d0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
145e0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
145f0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
14600 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
14610 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
14620 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
14630 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
14640 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
14650 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
14660 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
14670 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
14680 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
14690 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
146a0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
146b0 3b 0a 7d 0a                                      ;.}.