/ Hex Artifact Content
Login

Artifact 17b354bc801098c0c39d6bee6efe629447fa5d68:


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 37 32 20 32  eaux.c,v 1.472 2
02c0: 30 30 39 2f 30 37 2f 31 34 20 30 32 3a 33 33 3a  009/07/14 02:33:
02d0: 30 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  02 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 28 76 6f 69 64 29 73 71 6c 69  {.    (void)sqli
9b40: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
9b50: 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  ;.    rc = db->x
9b60: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
9b70: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
9b80: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
9b90: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20  3SafetyOn(db);. 
9ba0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
9bb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9bc0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
9bd0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
9be0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
9bf0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
9c00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
9c10: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
9c20: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
9c30: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
9c40: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
9c50: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
9c60: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
9c70: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
9c80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
9c90: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
9ca0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
9cb0: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
9cc0: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
9cd0: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
9ce0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
9cf0: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
9d00: 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
9d10: 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
9d20: 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
9d30: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
9d40: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
9d50: 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
9d60: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
9d70: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
9d80: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
9d90: 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
9da0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
9db0: 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
9dc0: 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
9dd0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
9de0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9df0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9e00: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9e10: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9e20: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
9e30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
9e40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
9e50: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
9e60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
9e70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
9e80: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
9e90: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
9ea0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
9eb0: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
9ec0: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
9ed0: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
9ee0: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
9ef0: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
9f00: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
9f10: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
9f20: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
9f30: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
9f40: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
9f50: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
9f60: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
9f70: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
9f80: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
9f90: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
9fa0: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
9fb0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
9fc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
9fd0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
9fe0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
9ff0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
a000: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
a010: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
a020: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
a030: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
a040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a050: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a060: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
a070: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
a080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a090: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
a0a0: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
a0b0: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
a0c0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
a0d0: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
a0e0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
a0f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
a100: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
a110: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
a120: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
a130: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
a140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
a150: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
a160: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
a170: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
a180: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
a190: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
a1a0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
a1b0: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
a1c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a1d0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
a1e0: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
a1f0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
a200: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
a210: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
a220: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
a230: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
a240: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
a250: 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a  int res;..    /*
a260: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
a270: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
a280: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
a290: 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
a2a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
a2b0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
a2c0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
a2d0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
a2e0: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
a2f0: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a  Random);.      z
a300: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
a310: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
a320: 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69  mj%08X", zMainFi
a330: 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66  le, iRandom&0x7f
a340: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
a350: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
a360: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
a370: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
a380: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
a390: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
a3a0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
a3b0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
a3c0: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
a3d0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
a3e0: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
a3f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a400: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
a410: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
a420: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
a430: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a440: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
a450: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
a460: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
a470: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
a480: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
a490: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
a4a0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
a4b0: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
a4c0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
a4d0: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
a4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a4f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
a510: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
a520: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
a530: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
a540: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
a550: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
a560: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
a570: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
a580: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
a590: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a5a0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
a5b0: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
a5c0: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
a5d0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
a5e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a5f0: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
a600: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
a610: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
a620: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
a630: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
a640: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
a650: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
a660: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
a670: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
a680: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
a690: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
a6a0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
a6b0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
a6c0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
a6d0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
a6e0: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
a6f0: 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  ;   /* Ignore th
a700: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
a710: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
a720: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a730: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
a740: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
a750: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
a760: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
a770: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
a780: 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20  if( zFile[0]==0 
a790: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
a7a0: 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20  Ignore :memory: 
a7b0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
a7c0: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
a7d0: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
a7e0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
a7f0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
a800: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
a810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a820: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a830: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
a840: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
a850: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
a860: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
a870: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
a880: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
a890: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
a8a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a8b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a8c0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
a8d0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
a8e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
a8f0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
a900: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
a910: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a920: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
a930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
a940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a950: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a960: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
a970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
a980: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
a990: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
a9a0: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
a9b0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
a9c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a9d0: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
a9e0: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
a9f0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
aa00: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
aa10: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
aa20: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
aa30: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
aa40: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
aa50: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
aa60: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
aa70: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
aa80: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
aa90: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
aaa0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
aab0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
aac0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
aad0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
aae0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
aaf0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
ab00: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
ab10: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
ab20: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
ab30: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
ab40: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
ab50: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
ab60: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
ab70: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
ab80: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
ab90: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
aba0: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
abb0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
abc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
abd0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
abe0: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
abf0: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
ac00: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
ac10: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
ac20: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
ac30: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
ac40: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
ac50: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
ac60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
ac70: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
ac80: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
ac90: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
aca0: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
acb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
acc0: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
acd0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
ace0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
acf0: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
ad00: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
ad10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
ad20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
ad30: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
ad40: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
ad50: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
ad60: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
ad70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ad80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
ad90: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
ada0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
adb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
adc0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
add0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  pMaster);.    if
ade0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
adf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ae00: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
ae10: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
ae20: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
ae30: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
ae40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ae50: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
ae60: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ae70: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
ae80: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
ae90: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
aea0: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
aeb0: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
aec0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
aed0: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
aee0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
aef0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
af00: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
af10: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
af20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
af30: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
af40: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
af50: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
af60: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
af70: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
af80: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
af90: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
afa0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
afb0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
afc0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
afd0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
afe0: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
aff0: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
b000: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
b010: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
b020: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
b030: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
b040: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
b050: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
b060: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
b070: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
b080: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
b090: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
b0a0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
b0b0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
b0c0: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
b0d0: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
b0e0: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
b0f0: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
b100: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
b110: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
b120: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
b130: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
b140: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
b150: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
b160: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
b170: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
b180: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
b190: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
b1a0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
b1b0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
b1c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
b1d0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
b1e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
b1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
b200: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
b210: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
b220: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
b230: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
b240: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
b250: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
b260: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
b270: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
b280: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
b290: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
b2a0: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
b2b0: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
b2c0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
b2d0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
b2e0: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
b2f0: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
b300: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
b310: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
b320: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
b330: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
b340: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
b350: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
b360: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
b370: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
b380: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
b390: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
b3a0: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
b3b0: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
b3c0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
b3d0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
b3e0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
b3f0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
b400: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
b410: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
b420: 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  te = 0;.  p = db
b430: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
b440: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
b450: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
b460: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
b470: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
b480: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
b490: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
b4a0: 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Write++;.    }. 
b4b0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
b4c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
b4d0: 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64  nt==db->activeVd
b4e0: 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  beCnt );.  asser
b4f0: 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77  t( nWrite==db->w
b500: 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  riteVdbeCnt );.}
b510: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
b520: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b530: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
b540: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
b550: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
b560: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
b570: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
b580: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
b590: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
b5a0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
b5b0: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
b5c0: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
b5d0: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
b5e0: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
b5f0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
b600: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
b610: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
b620: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
b630: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
b640: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
b650: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
b660: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
b670: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
b680: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
b690: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
b6a0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
b6b0: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
b6c0: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
b6d0: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
b6e0: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
b6f0: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
b700: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
b710: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
b720: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
b730: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
b740: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
b750: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
b760: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
b770: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
b780: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
b790: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
b7a0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
b7b0: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
b7c0: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
b7d0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
b7e0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
b7f0: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
b800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
b810: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b820: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
b830: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
b840: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
b850: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
b860: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
b870: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
b880: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
b890: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
b8a0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
b8b0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
b8c0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
b8d0: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
b8e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b8f0: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
b900: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
b910: 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
b920: 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
b930: 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
b940: 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
b950: 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
b960: 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
b970: 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
b980: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
b990: 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
b9a0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
b9b0: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
b9c0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
b9d0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
b9e0: 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
b9f0: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
ba00: 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
ba10: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
ba20: 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a   is commtted..**
ba30: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
ba40: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
ba50: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
ba60: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ba70: 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
ba80: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
ba90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
baa0: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
bab0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
bac0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
bad0: 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
bae0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
baf0: 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d  TE_OK;..  if( p-
bb00: 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
bb10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
bb20: 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
bb30: 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
bb40: 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
bb50: 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
bb60: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
bb70: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
bb80: 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
bb90: 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
bba0: 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
bbb0: 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
bbc0: 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
bbd0: 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
bbe0: 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
bbf0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
bc00: 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
bc10: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
bc20: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
bc30: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
bc40: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
bc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
bc60: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
bc70: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
bc80: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
bc90: 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
bca0: 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
bcb0: 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
bcc0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
bcd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
bce0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bcf0: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
bd00: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
bd10: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
bd20: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
bd30: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
bd40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
bd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bd60: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
bd70: 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
bd80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bd90: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
bda0: 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
bdb0: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ment = 0;.  }.  
bdc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdd0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
bde0: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
bdf0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
be00: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
be10: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
be20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
be30: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
be40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
be50: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
be60: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
be70: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
be80: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
be90: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
bea0: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 0a 2a  In doing so it.*
beb0: 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61  * sets the BtSha
bec0: 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66  red.db member of
bed0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53   each of the BtS
bee0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
bef0: 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68  , ensuring.** th
bf00: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
bf10: 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
bf20: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
bf30: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  if required..**.
bf40: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
bf50: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62  not threadsafe b
bf60: 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  ut does support 
bf70: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
bf80: 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74  e, then.** sqlit
bf90: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
bfa0: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
bfb0: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
bfc0: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
bfd0: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
bfe0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
bff0: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
c000: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
c010: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
c020: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 20 4f 66   with the VM. Of
c030: 20 63 6f 75 72 73 65 20 6f 6e 6c 79 20 61 20 73   course only a s
c040: 75 62 73 65 74 20 6f 66 20 74 68 65 73 65 20 73  ubset of these s
c050: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 77 69 6c  tructures.** wil
c060: 6c 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  l be accessed by
c070: 20 74 68 65 20 56 4d 2c 20 61 6e 64 20 77 65 20   the VM, and we 
c080: 63 6f 75 6c 64 20 75 73 65 20 56 64 62 65 2e 62  could use Vdbe.b
c090: 74 72 65 65 4d 61 73 6b 20 74 6f 20 66 69 67 75  treeMask to figu
c0a0: 72 65 0a 2a 2a 20 74 68 61 74 20 73 75 62 73 65  re.** that subse
c0b0: 74 20 6f 75 74 2c 20 62 75 74 20 74 68 65 72 65  t out, but there
c0c0: 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65   is no advantage
c0d0: 20 74 6f 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a   to doing so..**
c0e0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
c0f0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
c100: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
c110: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
c120: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
c130: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
c140: 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  -op..*/.#ifndef 
c150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
c160: 45 44 5f 43 41 43 48 45 0a 76 6f 69 64 20 73 71  ED_CACHE.void sq
c170: 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41 72  lite3VdbeMutexAr
c180: 72 61 79 45 6e 74 65 72 28 56 64 62 65 20 2a 70  rayEnter(Vdbe *p
c190: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  ){.#if SQLITE_TH
c1a0: 52 45 41 44 53 41 46 45 0a 20 20 73 71 6c 69 74  READSAFE.  sqlit
c1b0: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
c1c0: 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65  yEnter(&p->aMute
c1d0: 78 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  x);.#else.  sqli
c1e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
c1f0: 28 70 2d 3e 64 62 29 3b 0a 23 65 6e 64 69 66 0a  (p->db);.#endif.
c200: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c210: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c220: 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
c230: 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
c240: 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
c250: 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
c260: 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
c270: 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
c280: 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
c290: 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
c2a0: 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
c2b0: 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
c2c0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
c2d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
c2e0: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
c2f0: 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
c300: 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
c310: 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
c320: 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
c330: 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
c340: 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
c350: 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
c360: 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
c370: 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
c380: 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
c390: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
c3a0: 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
c3b0: 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
c3c0: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
c3d0: 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
c3e0: 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
c3f0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
c400: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
c410: 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
c420: 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
c430: 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
c440: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
c450: 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
c460: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
c470: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
c480: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
c490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
c4a0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
c4b0: 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
c4c0: 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
c4d0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
c4e0: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
c4f0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
c500: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
c510: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
c520: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
c530: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
c540: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
c550: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
c560: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
c570: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
c580: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
c590: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
c5a0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
c5b0: 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
c5c0: 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
c5d0: 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
c5e0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
c5f0: 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
c600: 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
c610: 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
c620: 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
c630: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
c640: 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
c650: 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
c660: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
c670: 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
c680: 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
c690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
c6a0: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
c6b0: 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
c6c0: 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
c6d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
c6e0: 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
c6f0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
c700: 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
c710: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
c720: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
c730: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
c740: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
c750: 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20  rsors(p);.  if( 
c760: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
c770: 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
c780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c790: 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74  ;.  }.  checkAct
c7a0: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
c7b0: 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
c7c0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
c7d0: 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
c7e0: 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
c7f0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
c800: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  0 ){.    int mrc
c810: 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
c820: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
c830: 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
c840: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
c850: 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
c860: 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
c870: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
c880: 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
c890: 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
c8a0: 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
c8b0: 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
c8c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
c8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65   sqlite3VdbeMute
c8e0: 78 41 72 72 61 79 45 6e 74 65 72 28 70 29 3b 0a  xArrayEnter(p);.
c8f0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
c900: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
c910: 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
c920: 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
c930: 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72   0xff;.    asser
c940: 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
c950: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
c960: 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72  ;  /* This error
c970: 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74   no longer exist
c980: 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69  s */.    isSpeci
c990: 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
c9a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
c9b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
c9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c9d0: 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
c9e0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
c9f0: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
ca00: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
ca10: 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
ca20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
ca30: 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
ca40: 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f  y, we need do no
ca50: 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c   rollback at all
ca60: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
ca70: 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69     ** proceed wi
ca80: 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68  th the special h
ca90: 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a  andling..      *
caa0: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
cab0: 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
cac0: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
cad0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
cae0: 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
caf0: 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
cb00: 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
cb10: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
cb20: 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
cb30: 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
cb40: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
cb50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cb60: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
cb70: 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
cb80: 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
cb90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
cba0: 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
cbb0: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
cbc0: 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
cbd0: 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
cbe0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
cbf0: 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
cc00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
cc10: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
cc20: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
cc30: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
cc40: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
cc50: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
cc60: 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
cc70: 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
cc80: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
cc90: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
cca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ccb0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
ccc0: 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
ccd0: 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
cce0: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
ccf0: 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
cd00: 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
cd10: 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
cd20: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
cd30: 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
cd40: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
cd50: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
cd60: 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
cd70: 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
cd80: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
cd90: 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
cda0: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
cdb0: 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
cdc0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
cdd0: 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
cde0: 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
cdf0: 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
ce00: 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  && db->writeVdbe
ce10: 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  Cnt==(p->readOnl
ce20: 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
ce30: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
ce40: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
ce50: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
ce60: 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
ce70: 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
ce80: 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
ce90: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
cea0: 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62  rue, and the vdb
ceb0: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20  e program was . 
cec0: 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73         ** succes
ced0: 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27  sful or hit an '
cee0: 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
cef0: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
cf00: 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
cf10: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
cf20: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
cf30: 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
cf40: 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
cf50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
cf60: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
cf70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
cf80: 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76  eeMutexArrayLeav
cf90: 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20  e(&p->aMutex);. 
cfa0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
cfb0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
cfc0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
cfd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cfe0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
cff0: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
d000: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
d010: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
d020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d030: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
d040: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
d050: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d070: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
d080: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
d090: 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61  }.      db->nSta
d0a0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
d0b0: 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
d0c0: 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  mentOp==0 ){.   
d0d0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
d0e0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
d0f0: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
d100: 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  il ){.        eS
d110: 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
d120: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a  EPOINT_RELEASE;.
d130: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d140: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
d150: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
d160: 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
d170: 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
d180: 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  LBACK;.      }el
d190: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61  se{.        inva
d1a0: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
d1b0: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d1d0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
d1e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d1f0: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
d200: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
d210: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
d220: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
d230: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
d240: 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
d250: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
d260: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
d270: 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
d280: 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
d290: 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
d2a0: 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
d2b0: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
d2c0: 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
d2d0: 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
d2e0: 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
d2f0: 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
d300: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
d310: 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
d320: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
d330: 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
d340: 52 41 49 4e 54 2c 20 74 68 65 6e 20 73 65 74 20  RAINT, then set 
d350: 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a  the error.    **
d360: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
d370: 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
d380: 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
d390: 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
d3a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
d3b0: 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
d3c0: 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
d3d0: 20 20 20 20 69 66 28 20 72 63 20 26 26 20 28 70      if( rc && (p
d3e0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d3f0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
d400: 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a  _CONSTRAINT) ){.
d410: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
d420: 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rc;.        sqli
d430: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
d440: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
d450: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
d460: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
d470: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
d480: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
d490: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
d4a0: 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
d4b0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
d4c0: 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
d4d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
d4e0: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
d4f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
d500: 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
d510: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
d520: 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
d530: 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
d540: 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
d550: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
d560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d570: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
d580: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
d590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d5a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
d5b0: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
d5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
d5d0: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
d5e0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
d5f0: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
d600: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
d610: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
d620: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
d630: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
d640: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
d650: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
d660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
d670: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
d680: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
d690: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
d6a0: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
d6b0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
d6c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
d6d0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
d6e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
d6f0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
d700: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
d710: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
d720: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
d730: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
d740: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
d750: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
d760: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
d770: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
d780: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69  VdbeCnt--;.    i
d790: 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
d7a0: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69  ){.      db->wri
d7b0: 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  teVdbeCnt--;.   
d7c0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
d7d0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
d7e0: 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  >=db->writeVdbeC
d7f0: 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt );.  }.  p->m
d800: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
d810: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
d820: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
d830: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
d840: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
d850: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
d860: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
d870: 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
d880: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
d890: 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20  t to true, then 
d8a0: 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  any locks that w
d8b0: 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79  ere held.  ** by
d8c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
d8d0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c  ave now been rel
d8e0: 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69  eased. Call sqli
d8f0: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
d900: 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f  ocked() .  ** to
d910: 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75   invoke any requ
d920: 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ired unlock-noti
d930: 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
d940: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
d950: 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
d960: 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
d970: 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20  Unlocked(db);.  
d980: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  }..  assert( db-
d990: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30  >activeVdbeCnt>0
d9a0: 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
d9b0: 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
d9c0: 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
d9d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d9e0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
d9f0: 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
da00: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
da10: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
da20: 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
da30: 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
da40: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
da50: 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
da60: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
da70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
da80: 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
da90: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
daa0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
dab0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
dac0: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
dad0: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
dae0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
daf0: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
db00: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
db10: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
db20: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
db30: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
db40: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
db50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
db60: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
db70: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
db80: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
db90: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
dba0: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
dbb0: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
dbc0: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
dbd0: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
dbe0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
dbf0: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
dc00: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
dc10: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
dc20: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
dc30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
dc40: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
dc50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
dc60: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
dc70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
dc80: 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
dc90: 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
dca0: 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
dcb0: 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
dcc0: 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
dcd0: 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
dce0: 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
dcf0: 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
dd00: 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
dd10: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
dd20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
dd30: 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64  Halt(p);.  (void
dd40: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
dd50: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
dd60: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
dd70: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
dd80: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
dd90: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
dda0: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
ddb0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
ddc0: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
ddd0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
dde0: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
ddf0: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
de00: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
de10: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
de20: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
de30: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
de40: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
de50: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
de60: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
de70: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
de80: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
de90: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
dea0: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
deb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
dec0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
ded0: 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
dee0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
def0: 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72  >pErr,-1,p->zErr
df00: 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  Msg,SQLITE_UTF8,
df10: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
df20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
df30: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
df40: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
df50: 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
df60: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
df70: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
df80: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  );.      p->zErr
df90: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
dfa0: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
dfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
dfc0: 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
dfd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
dfe0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
dff0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
e000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
e010: 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
e020: 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
e030: 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
e040: 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
e050: 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
e060: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
e070: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
e080: 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
e090: 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
e0a0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
e0b0: 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
e0c0: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
e0d0: 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
e0e0: 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
e0f0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
e100: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
e110: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e120: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
e130: 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
e140: 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
e150: 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
e160: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
e170: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
e180: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
e190: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
e1a0: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
e1b0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
e1c0: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
e1d0: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
e1e0: 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
e1f0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
e200: 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
e210: 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
e220: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
e230: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
e240: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
e250: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
e260: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
e270: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
e280: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
e290: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
e2a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
e2b0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
e2c0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
e2d0: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
e2e0: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
e2f0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
e300: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
e310: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
e320: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
e330: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
e340: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
e350: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
e360: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
e370: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
e380: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
e390: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
e3a0: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
e3b0: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
e3c0: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
e3d0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
e3e0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
e3f0: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
e400: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
e410: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
e420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e430: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
e440: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
e450: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
e460: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
e470: 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
e480: 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
e490: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
e4a0: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
e4b0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
e4c0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
e4d0: 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
e4e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
e4f0: 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
e500: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e510: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
e520: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
e530: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e540: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
e550: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
e560: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
e570: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
e580: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
e590: 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
e5a0: 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
e5b0: 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
e5c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e5d0: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
e5e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e5f0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
e600: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
e610: 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
e620: 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
e630: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
e640: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
e650: 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
e660: 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
e670: 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
e680: 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
e690: 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
e6a0: 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
e6b0: 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
e6c0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
e6d0: 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
e6e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
e6f0: 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
e700: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
e710: 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
e720: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
e730: 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
e740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
e750: 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
e760: 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
e770: 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
e780: 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
e790: 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29  &(((u32)1)<<i)))
e7a0: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
e7b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
e7c0: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
e7d0: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
e7e0: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
e7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
e800: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
e810: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
e820: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
e830: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
e840: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
e850: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
e860: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
e870: 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  db;..  if( NEVER
e880: 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
e890: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
e8a0: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
e8b0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
e8c0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
e8d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
e8e0: 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
e8f0: 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
e900: 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
e910: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
e920: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
e930: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
e940: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
e950: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  p->aOp ){.    Op
e960: 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *pOp = p->aOp;.
e970: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e980: 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70 2b  ->nOp; i++, pOp+
e990: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
e9a0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
e9b0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
e9c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e9d0: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
e9e0: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
e9f0: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
ea00: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
ea10: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
ea20: 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
ea30: 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ar);.  sqlite3Db
ea40: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62  Free(db, p->aLab
ea50: 65 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  el);.  releaseMe
ea60: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
ea70: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
ea80: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
ea90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
eaa0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
eab0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
eac0: 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
ead0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
eae0: 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71  MAGIC_DEAD;.  sq
eaf0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
eb00: 70 2d 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->aOp);.  sqlit
eb10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
eb20: 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFree);.  sqlite
eb30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
eb40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
eb50: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
eb60: 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
eb70: 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
eb80: 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
eb90: 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
eba0: 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
ebb0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
ebc0: 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
ebd0: 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
ebe0: 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
ebf0: 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
ec00: 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
ec10: 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
ec20: 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
ec30: 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
ec40: 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
ec50: 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
ec60: 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
ec70: 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
ec80: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
ec90: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
eca0: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
ecb0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
ecc0: 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
ecd0: 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
ece0: 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
ecf0: 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
ed00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
ed10: 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
ed20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
ed30: 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
ed40: 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
ed50: 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
ed60: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
ed70: 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
ed80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ed90: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
eda0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
edb0: 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
edc0: 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
edd0: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
ede0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
edf0: 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
ee00: 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
ee10: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
ee20: 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
ee30: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
ee40: 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
ee50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
ee60: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
ee70: 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
ee80: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
ee90: 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
eea0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
eeb0: 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
eec0: 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
eed0: 54 61 72 67 65 74 3b 0a 20 20 20 20 70 2d 3e 72  Target;.    p->r
eee0: 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 41 4c  owidIsValid = AL
eef0: 57 41 59 53 28 72 65 73 3d 3d 30 29 20 3f 31 3a  WAYS(res==0) ?1:
ef00: 30 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  0;.    if( NEVER
ef10: 28 72 65 73 3c 30 29 20 29 7b 0a 20 20 20 20 20  (res<0) ){.     
ef20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
ef30: 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f  eeNext(p->pCurso
ef40: 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
ef50: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ef60: 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  rc;.    }.#ifdef
ef70: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
ef80: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
ef90: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
efa0: 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d      p->deferredM
efb0: 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
efc0: 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
efd0: 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
efe0: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
eff0: 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
f000: 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b     int hasMoved;
f010: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
f020: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
f030: 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
f040: 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b  sor, &hasMoved);
f050: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
f060: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
f070: 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20   hasMoved ){.   
f080: 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
f090: 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
f0a0: 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f  .      p->nullRo
f0b0: 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 1;.    }.  }
f0c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f0d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
f0e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
f0f0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
f100: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f110: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
f120: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f130: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
f140: 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
f150: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f160: 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
f170: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
f180: 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
f190: 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
f1a0: 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
f1b0: 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
f1c0: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
f1d0: 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
f1e0: 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
f1f0: 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
f200: 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
f210: 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
f220: 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
f230: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
f240: 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
f250: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
f260: 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
f270: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
f280: 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
f290: 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
f2a0: 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
f2b0: 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
f2c0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
f2d0: 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
f2e0: 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
f2f0: 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
f300: 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
f310: 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
f320: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f330: 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
f340: 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
f350: 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
f360: 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
f370: 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
f380: 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
f390: 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
f3a0: 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
f3b0: 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
f3c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
f3d0: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
f3e0: 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
f3f0: 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
f400: 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
f410: 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
f420: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
f430: 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
f440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
f450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
f460: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
f470: 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
f4a0: 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
f4d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
f4e0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
f4f0: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
f500: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
f510: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f530: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
f540: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
f550: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
f570: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
f580: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
f590: 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
f5a0: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
f5b0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
f5c0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
f5f0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
f600: 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
f620: 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
f630: 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
f660: 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
f670: 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
f6a0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
f6b0: 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
f6e0: 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
f6f0: 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
f700: 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
f710: 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
f720: 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
f730: 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
f740: 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
f750: 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
f760: 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
f770: 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
f780: 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
f790: 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
f7a0: 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
f7b0: 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
f7c0: 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
f7d0: 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
f7e0: 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
f7f0: 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
f800: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
f810: 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
f820: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
f830: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
f840: 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69  ile_format){.  i
f850: 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
f860: 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b  >flags;.  int n;
f870: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
f880: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
f890: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
f8a0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
f8b0: 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
f8c0: 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
f8d0: 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
f8e0: 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
f8f0: 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
f900: 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
f910: 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
f920: 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
f930: 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
f940: 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
f950: 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
f960: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
f970: 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20  urn 8+(u32)i;.  
f980: 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20    }.    u = i<0 
f990: 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66  ? -i : i;.    if
f9a0: 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
f9b0: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
f9c0: 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
f9d0: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
f9e0: 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
f9f0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
fa00: 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
fa10: 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
fa20: 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
fa30: 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
fa40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
fa50: 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
fa60: 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
fa70: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
fa80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fa90: 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
faa0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
fab0: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
fac0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
fad0: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
fae0: 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
faf0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
fb00: 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
fb10: 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
fb20: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
fb30: 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
fb40: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
fb50: 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
fb60: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
fb70: 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
fb80: 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
fb90: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
fba0: 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
fbb0: 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
fbc0: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
fbd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
fbe0: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
fbf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
fc00: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
fc10: 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
fc20: 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
fc30: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
fc40: 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
fc50: 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
fc60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
fc70: 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
fc80: 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
fc90: 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
fca0: 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
fcb0: 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
fcc0: 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
fcd0: 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
fce0: 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
fcf0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
fd00: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
fd10: 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
fd20: 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
fd30: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
fd40: 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
fd50: 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
fd60: 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
fd70: 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
fd80: 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
fd90: 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
fda0: 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
fdb0: 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
fdc0: 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
fdd0: 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
fde0: 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
fdf0: 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
fe00: 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
fe10: 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
fe20: 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
fe30: 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
fe40: 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
fe50: 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
fe60: 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
fe70: 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
fe80: 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
fe90: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
fea0: 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
feb0: 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
fec0: 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
fed0: 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
fee0: 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
fef0: 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
ff00: 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
ff10: 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
ff20: 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
ff30: 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
ff40: 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
ff50: 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
ff60: 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
ff70: 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
ff80: 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
ff90: 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
ffa0: 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
ffb0: 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
ffc0: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
ffd0: 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
ffe0: 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
fff0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
10000 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
10010 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
10020 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
10030 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
10040 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
10050 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
10060 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
10070 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
10080 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
10090 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
100a0 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
100b0 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
100c0 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
100d0 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
100e0 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
100f0 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
10100 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
10110 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
10120 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
10130 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
10140 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
10150 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
10160 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
10170 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
10180 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
10190 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
101a0 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
101b0 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
101c0 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
101d0 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
101e0 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
101f0 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
10200 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
10210 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
10220 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
10230 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
10240 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
10250 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
10260 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
10270 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
10280 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
10290 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
102a0 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
102b0 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
102c0 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
102d0 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
102e0 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
102f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
10300 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
10310 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
10320 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
10330 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
10340 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
10350 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
10360 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
10370 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
10380 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
10390 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
103a0 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
103b0 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
103c0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
103d0 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
103e0 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
103f0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
10400 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
10410 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
10420 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
10430 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
10440 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
10450 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
10460 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
10470 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
10480 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
10490 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
104a0 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
104b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
104c0 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
104d0 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
104e0 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
104f0 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42  ft in buf[].  nB
10500 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  uf must always b
10510 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67  e.** large enoug
10520 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  h to hold the en
10530 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63  tire field.  Exc
10540 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c  ept, if the fiel
10550 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77  d is.** a blob w
10560 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  ith a zero-fille
10570 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66  d tail, then buf
10580 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74  [] might be just
10590 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69   the right.** si
105a0 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79  ze to hold every
105b0 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72  thing except for
105c0 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
105d0 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d   tail.  If buf[]
105e0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20  .** is only big 
105f0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
10600 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66  he non-zero pref
10610 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ix, then only wr
10620 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ite that.** pref
10630 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  ix into buf[].  
10640 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20  But if buf[] is 
10650 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
10660 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a  hold both the.**
10670 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20   prefix and the 
10680 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20  tail then write 
10690 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
106a0 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61  et the tail to a
106b0 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a  ll.** zeros..**.
106c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
106d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
106e0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
106f0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
10700 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
10710 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
10720 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
10730 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
10740 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
10750 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
10760 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
10770 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
10780 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10790 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e  lPut(u8 *buf, in
107a0 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  t nBuf, Mem *pMe
107b0 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
107c0 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  at){.  u32 seria
107d0 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
107e0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
107f0 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Mem, file_format
10800 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  );.  u32 len;.. 
10810 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
10820 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
10830 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
10840 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
10850 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
10860 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
10870 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
10880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
10890 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
108a0 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
108b0 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
108c0 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
108d0 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
108e0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
108f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10900 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
10910 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
10920 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
10930 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
10940 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
10950 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28    assert( len<=(
10960 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  u32)nBuf );.    
10970 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
10980 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38      buf[i] = (u8
10990 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
109a0 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
109b0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
109c0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
109d0 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
109e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
109f0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
10a00 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
10a10 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
10a20 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
10a30 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
10a40 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
10a50 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
10a60 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
10a70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10a80 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b  pMem->n<=nBuf );
10a90 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
10aa0 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
10ab0 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
10ac0 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  );.    if( pMem-
10ad0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
10ae0 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b  o ){.      len +
10af0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
10b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
10b10 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Buf>=0 );.      
10b20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e  if( len > (u32)n
10b30 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
10b40 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a  en = (u32)nBuf;.
10b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
10b60 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
10b70 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
10b80 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
10b90 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
10ba0 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
10bb0 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
10bc0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
10bd0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
10be0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
10bf0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
10c00 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
10c10 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
10c20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
10c30 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
10c40 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
10c50 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
10c60 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
10c70 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
10c80 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10c90 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
10ca0 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
10cb0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
10cc0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
10cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10ce0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
10cf0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
10d00 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
10d30 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
10d40 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
10d50 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
10d60 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
10d70 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
10d80 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
10d90 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
10da0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
10db0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
10dc0 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
10dd0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
10de0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
10df0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
10e00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10e10 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
10e20 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
10e30 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
10e40 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
10e50 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
10e60 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
10e70 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
10e80 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
10e90 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
10ea0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
10eb0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
10ec0 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
10ed0 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
10ee0 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
10ef0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
10f00 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
10f10 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
10f20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
10f30 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
10f40 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
10f50 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
10f60 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
10f70 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
10f80 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
10f90 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
10fa0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
10fb0 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
10fc0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
10fd0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
10fe0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
10ff0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
11000 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
11010 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
11020 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
11030 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
11040 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
11050 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
11060 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
11070 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
11080 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
11090 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
110a0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
110b0 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
110c0 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
110d0 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
110e0 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
110f0 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
11100 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
11110 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
11120 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
11130 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
11140 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
11150 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
11160 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
11170 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
11180 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
11190 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
111a0 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
111b0 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
111c0 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
111d0 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
111e0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
111f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11200 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
11210 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
11220 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
11230 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
11240 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
11250 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
11260 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
11270 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
11280 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
11290 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
112a0 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
112b0 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
112c0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
112d0 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
112e0 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
112f0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
11300 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
11310 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
11320 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
11330 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
11340 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
11350 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
11360 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
11370 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
11380 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
11390 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
113a0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
113b0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
113c0 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
113d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
113e0 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
113f0 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
11400 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
11410 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
11420 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
11430 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
11440 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
11450 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
11460 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
11470 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
11480 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
11490 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
114a0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
114b0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
114c0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
114d0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
114e0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
114f0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
11500 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
11510 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
11520 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
11530 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
11540 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
11550 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
11560 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
11570 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
11580 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
11590 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
115a0 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
115b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
115c0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
115d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
115e0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
115f0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
11600 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
11610 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
11620 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
11630 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11640 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
11650 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c  t: {.      u32 l
11660 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
11670 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
11680 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
11690 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
116a0 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
116b0 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
116c0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
116d0 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
116e0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
116f0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
11700 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
11710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11720 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
11730 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
11740 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
11750 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
11760 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11770 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  0;.}.../*.** Giv
11780 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
11790 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
117a0 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
117b0 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65   parse the.** re
117c0 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61  cord into a Unpa
117d0 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
117e0 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20  ture.  Return a 
117f0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
11800 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  at structure..**
11810 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
11820 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70  function might p
11830 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62  rovide szSpace b
11840 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
11850 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63  * space at pSpac
11860 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63  e.  This space c
11870 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f  an be used to ho
11880 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  ld the returned.
11890 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63  ** VDbeParsedRec
118a0 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66  ord structure if
118b0 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
118c0 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a  ugh.  If it is.*
118d0 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68  * not big enough
118e0 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69  , space is obtai
118f0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
11900 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  _malloc()..**.**
11910 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
11920 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62  ructure should b
11930 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61  e closed by a ca
11940 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
11950 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
11960 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a  edRecord()..*/ .
11970 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
11980 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
11990 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
119a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
119b0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
119c0 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
119d0 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
119e0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
119f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11a00 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
11a10 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
11a20 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
11a30 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
11a40 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  rd */.  char *pS
11a50 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f  pace,          /
11a60 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
11a70 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68  e available to h
11a80 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  old the object *
11a90 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20  /.  int szSpace 
11aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11ab0 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
11ac0 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
11ad0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11ae0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
11af0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11b00 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63   *)pKey;.  Unpac
11b10 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f  kedRecord *p;  /
11b20 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72  * The unpacked r
11b30 65 63 6f 72 64 20 74 68 61 74 20 77 65 20 77 69  ecord that we wi
11b40 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  ll return */.  i
11b50 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
11b60 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
11b70 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  ce needed to hol
11b80 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f  d p, in bytes */
11b90 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33 32 20  .  int d;.  u32 
11ba0 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20  idx;.  u16 u;   
11bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
11bc0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
11bd0 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
11be0 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  dr;.  Mem *pMem;
11bf0 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20  .  int nOff;    
11c00 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
11c10 73 65 20 70 53 70 61 63 65 20 62 79 20 74 68 69  se pSpace by thi
11c20 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79 74 65  s much to 8-byte
11c30 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a   align it */.  .
11c40 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e    /*.  ** We wan
11c50 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
11c60 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
11c70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
11c80 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
11c90 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
11ca0 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
11cb0 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
11cc0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
11cd0 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
11ce0 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
11cf0 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
11d00 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
11d10 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
11d20 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
11d30 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
11d40 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
11d50 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70 53 70  & 7)) & 7;.  pSp
11d60 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73  ace += nOff;.  s
11d70 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a  zSpace -= nOff;.
11d80 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
11d90 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
11da0 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
11db0 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
11dc0 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
11dd0 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
11de0 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
11df0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
11e00 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
11e10 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  te);.    if( p==
11e20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11e30 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50    p->flags = UNP
11e40 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20  ACKED_NEED_FREE 
11e50 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  | UNPACKED_NEED_
11e60 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65  DESTROY;.  }else
11e70 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
11e80 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70 61 63  kedRecord*)pSpac
11e90 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  e;.    p->flags 
11ea0 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  = UNPACKED_NEED_
11eb0 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70  DESTROY;.  }.  p
11ec0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
11ed0 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
11ee0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
11ef0 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e  Field + 1;.  p->
11f00 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d  aMem = pMem = (M
11f10 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
11f20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
11f30 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
11f40 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
11f50 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
11f60 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
11f70 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
11f80 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
11f90 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
11fa0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
11fb0 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65  Hdr && u<p->nFie
11fc0 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
11fd0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
11fe0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
11ff0 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
12000 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
12010 20 69 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20   if( d>=nKey && 
12020 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12030 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
12040 74 79 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b  type)>0 ) break;
12050 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
12060 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
12070 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
12080 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
12090 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
120a0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  ;.    pMem->zMal
120b0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
120c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
120d0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
120e0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
120f0 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
12100 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
12110 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
12120 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
12130 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
12140 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   u;.  return (vo
12150 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id*)p;.}../*.** 
12160 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73  This routine des
12170 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64  troys a Unpacked
12180 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a  Record object..*
12190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
121a0 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
121b0 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52  Record(UnpackedR
121c0 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74  ecord *p){.  int
121d0 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   i;.  Mem *pMem;
121e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
121f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
12200 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
12210 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29  D_NEED_DESTROY )
12220 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65  ;.  for(i=0, pMe
12230 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e  m=p->aMem; i<p->
12240 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65  nField; i++, pMe
12250 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  m++){.    /* The
12260 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
12270 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74   is always const
12280 72 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20  ructed by the.  
12290 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
122a0 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66  UnpackRecord() f
122b0 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77  unction above, w
122c0 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20  hich makes all. 
122d0 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e     ** strings an
122e0 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20  d blobs static. 
122f0 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
12300 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20   elements are.  
12310 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66    ** ever transf
12320 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20  ormed, so there 
12330 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e  is never anythin
12340 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20  g to delete..   
12350 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
12360 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29  R(pMem->zMalloc)
12370 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
12380 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
12390 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61    }.  if( p->fla
123a0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
123b0 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73  ED_FREE ){.    s
123c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
123d0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29  pKeyInfo->db, p)
123e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
123f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
12400 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
12410 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
12420 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
12430 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
12440 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
12450 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
12460 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
12470 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
12480 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
12490 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
124a0 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
124b0 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
124c0 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
124d0 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
124e0 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
124f0 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b  ted by th OP_Mak
12500 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
12510 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
12520 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
12530 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
12540 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
12550 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
12560 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
12570 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ord..**.** Key1 
12580 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
12590 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
125a0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
125b0 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68  of fields..** Th
125c0 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72  e key with fewer
125d0 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c   fields is usual
125e0 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73  ly compares less
125f0 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f   than the .** lo
12600 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76  nger key.  Howev
12610 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b  er if the UNPACK
12620 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73  ED_INCRKEY flags
12630 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65   in pPKey2 is se
12640 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d  t.** and the com
12650 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65  mon prefixes are
12660 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79   equal, then key
12670 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b  1 is less than k
12680 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68  ey2..** Or if th
12690 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48  e UNPACKED_MATCH
126a0 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20  _PREFIX flag is 
126b0 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66  set and the pref
126c0 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  ixes are.** equa
126d0 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73  l, then the keys
126e0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
126f0 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a  to be equal and.
12700 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79  ** the parts bey
12710 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  ond the common p
12720 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65  refix are ignore
12730 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
12740 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
12750 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65  ROWID flag is se
12760 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
12770 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
12780 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20  header of pKey1 
12790 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20  is ignored.  It 
127a0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
127b0 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69  pKey1 is.** an i
127c0 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68  ndex key, and th
127d0 75 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72  us ends with a r
127e0 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65  owid value.  The
127f0 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66   last byte.** of
12800 20 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c   the header will
12810 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68   therefore be th
12820 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
12830 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f   the rowid:.** o
12840 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34  ne of 1, 2, 3, 4
12850 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20  , 5, 6, 8, or 9 
12860 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65  - the integer se
12870 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54  rial types..** T
12880 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
12890 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  f the final rowi
128a0 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  d will always be
128b0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
128c0 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74  ** By ignoring t
128d0 68 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66  his last byte of
128e0 20 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20   the header, we 
128f0 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72  force the compar
12900 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72  ison.** to ignor
12910 65 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  e the rowid at t
12920 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a  he end of key1..
12930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
12940 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
12950 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
12960 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
12970 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
12980 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
12990 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
129a0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
129b0 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20  ){.  int d1;    
129c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
129d0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
129e0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
129f0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
12a00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
12a10 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
12a20 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
12a30 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
12a40 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
12a50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
12a60 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
12a70 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
12a80 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
12a90 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
12aa0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12ab0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
12ac0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
12ad0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
12ae0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
12af0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
12b00 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
12b10 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
12b20 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
12b30 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
12b40 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d  KeyInfo->db;.  m
12b50 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em1.flags = 0;. 
12b60 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
12b70 2f 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  /* not needed, h
12b80 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
12b90 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
12ba0 2a 2f 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  */.  mem1.zMallo
12bb0 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78 31  c = 0;.  .  idx1
12bc0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
12bd0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
12be0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
12bf0 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
12c00 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
12c10 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  ORE_ROWID ){.   
12c20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20   szHdr1--;.  }. 
12c30 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
12c40 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
12c50 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
12c60 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
12c70 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
12c80 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
12c90 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
12ca0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
12cb0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
12cc0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
12cd0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
12ce0 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
12cf0 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
12d00 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
12d10 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
12d20 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12d30 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
12d40 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
12d50 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
12d60 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
12d70 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
12d80 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
12d90 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
12da0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
12db0 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
12dc0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
12dd0 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
12de0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12df0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
12e00 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
12e10 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e30 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
12e40 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
12e50 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
12e60 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
12e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
12e80 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31 2e  .  }.  if( mem1.
12e90 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
12ea0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
12eb0 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  &mem1);..  /* If
12ec0 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
12ed0 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  CH flag is set a
12ee0 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  nd all fields ex
12ef0 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  cept the final. 
12f00 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20   ** rowid field 
12f10 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e  were equal, then
12f20 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49   clear the PREFI
12f30 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e  X_SEARCH flag an
12f40 64 20 73 65 74 20 0a 20 20 2a 2a 20 70 50 4b 65  d set .  ** pPKe
12f50 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
12f60 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
12f70 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
12f80 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 2a  ey1, nKey1)..  *
12f90 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
12fa0 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
12fb0 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
12fc0 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c   if( (pPKey2->fl
12fd0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
12fe0 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26  REFIX_SEARCH) &&
12ff0 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69   i==(pPKey2->nFi
13000 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 61 73  eld-1) ){.    as
13010 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
13020 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
13030 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61  assert( mem1.fla
13040 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
13050 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67      pPKey2->flag
13060 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50  s &= ~UNPACKED_P
13070 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
13080 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20    pPKey2->rowid 
13090 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 7d 0a  = mem1.u.i;.  }.
130a0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
130b0 20 20 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72      /* rc==0 her
130c0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
130d0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
130e0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
130f0 6e 64 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68  nd.    ** all th
13100 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
13110 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
13120 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50  qual. If the UNP
13130 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20  ACKED_INCRKEY.  
13140 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
13150 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65  , then break the
13160 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67   tie by treating
13170 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e   key2 as larger.
13180 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 55  .    ** If the U
13190 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
131a0 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c  TCH flag is set,
131b0 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20   then keys with 
131c0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a  common prefixes.
131d0 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69      ** are consi
131e0 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
131f0 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
13200 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
13210 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72   the .    ** lar
13220 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70  ger.  As it happ
13230 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20  ens, the pPKey2 
13240 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74  will always be t
13250 68 65 20 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a  he longer.    **
13260 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
13270 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a  ifference..    *
13280 2f 0a 20 20 20 20 69 66 28 20 70 50 4b 65 79 32  /.    if( pPKey2
13290 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
132a0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
132b0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
132c0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
132d0 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
132e0 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
132f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
13300 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20  ve rc==0 */.    
13310 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73  }else if( idx1<s
13320 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 20 20 72  zHdr1 ){.      r
13330 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
13340 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
13350 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
13360 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
13370 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
13380 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
13390 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
133a0 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
133b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
133c0 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  .}. ../*.** pCur
133d0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
133e0 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
133f0 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
13400 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
13410 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
13420 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
13430 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
13440 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
13450 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
13460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
13470 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
13480 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
13490 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
134a0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
134b0 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
134c0 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
134d0 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
134e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
134f0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
13500 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
13510 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
13520 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
13530 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
13540 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
13550 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
13560 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
13570 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
13580 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
13590 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
135a0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
135b0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
135c0 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
135d0 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
135e0 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
135f0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
13600 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
13610 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
13620 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
13630 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
13640 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
13650 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
13660 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
13670 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
13680 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
13690 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
136a0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
136b0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
136c0 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
136d0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
136e0 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
136f0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
13700 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
13710 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
13720 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
13730 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
13740 62 69 74 73 20 20 2a 2f 0a 20 20 73 71 6c 69 74  bits  */.  sqlit
13750 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
13760 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
13770 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
13780 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
13790 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
137a0 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
137b0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
137c0 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
137d0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
137e0 2f 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b  /.  m.flags = 0;
137f0 0a 20 20 6d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  .  m.db = db;.  
13800 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  m.zMalloc = 0;. 
13810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
13820 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
13830 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  ur, 0, (int)nCel
13840 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
13850 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
13860 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
13870 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
13880 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
13890 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
138a0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
138b0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
138c0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
138d0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
138e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
138f0 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66  Hdr==m.n );.  if
13900 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
13910 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72  <3 || (int)szHdr
13920 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  >m.n) ){.    got
13930 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
13940 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
13950 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
13960 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
13970 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
13980 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
13990 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
139a0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
139b0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
139c0 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
139d0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
139e0 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
139f0 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
13a00 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
13a10 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
13a20 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
13a30 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
13a40 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
13a50 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
13a60 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
13a70 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
13a80 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
13a90 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
13aa0 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
13ab0 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
13ac0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
13ad0 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
13ae0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
13af0 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
13b00 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
13b10 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
13b20 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
13b30 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
13b40 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
13b50 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13b60 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
13b70 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 6e 3d    testcase( m.n=
13b80 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
13b90 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
13ba0 79 28 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  y(m.n<szHdr+lenR
13bb0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
13bc0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
13bd0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
13be0 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
13bf0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
13c00 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
13c10 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
13c20 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
13c30 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
13c40 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
13c50 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
13c60 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
13c70 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
13c80 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
13c90 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
13ca0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
13cb0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
13cc0 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
13cd0 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
13ce0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
13cf0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
13d00 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
13d10 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
13d20 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
13d30 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
13d40 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b   m.zMalloc!=0 );
13d50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
13d60 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
13d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13d80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
13d90 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
13da0 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
13db0 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
13dc0 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
13dd0 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
13de0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
13df0 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
13e00 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
13e10 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
13e20 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
13e30 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
13e40 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
13e50 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
13e60 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
13e70 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
13e80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
13e90 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
13ea0 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
13eb0 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
13ec0 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
13ed0 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
13ee0 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
13ef0 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
13f00 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
13f10 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
13f20 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
13f30 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
13f40 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
13f50 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
13f60 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
13f70 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
13f80 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
13f90 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
13fa0 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
13fb0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
13fc0 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
13fd0 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
13fe0 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
13ff0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
14000 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
14010 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
14020 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
14030 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  ed,  /* Unpacked
14040 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
14050 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
14060 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  st */.  int *res
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
14090 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
140a0 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
140b0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
140c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
140d0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
140e0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
140f0 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  m m;..  sqlite3B
14100 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
14110 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
14120 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
14130 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
14140 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
14150 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
14160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14170 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20  }.  m.db = 0;.  
14180 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d  m.flags = 0;.  m
14190 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  .zMalloc = 0;.  
141a0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
141b0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
141c0 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e  >pCursor, 0, (in
141d0 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
141e0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
141f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14200 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e   }.  assert( pUn
14210 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20  packed->flags & 
14220 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
14230 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20  ROWID );.  *res 
14240 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
14250 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20  ordCompare(m.n, 
14260 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b  m.z, pUnpacked);
14270 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
14280 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
14290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
142a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
142b0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
142c0 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
142d0 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
142e0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
142f0 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
14300 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
14310 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
14320 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
14330 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
14340 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
14350 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
14360 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14370 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
14380 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
14390 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
143a0 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
143b0 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
143c0 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
143d0 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
143e0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
143f0 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
14400 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
14410 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
14420 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
14430 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
14440 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
14450 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
14460 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
14470 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
14480 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
14490 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
144a0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
144b0 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
144c0 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
144d0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
144e0 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
144f0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
14500 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
14510 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
14520 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
14530 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
14540 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
14550 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
14560 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
14570 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
14580 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
14590 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
145a0 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
145b0 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
145c0 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
145d0 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
145e0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
145f0 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
14600 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
14610 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
14620 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
14630 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
14640 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
14650 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
14660 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
14670 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
14680 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14690 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
146a0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
146b0 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
146c0 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
146d0 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
146e0 76 2d 3e 64 62 3b 0a 7d 0a                       v->db;.}.